http: fix redirects handling
							parent
							
								
									0a6d709ce2
								
							
						
					
					
						commit
						1c2376741b
					
				|  | @ -4,6 +4,7 @@ | ||||||
| module http | module http | ||||||
| 
 | 
 | ||||||
| import strings | import strings | ||||||
|  | 
 | ||||||
| // On linux, prefer a localy build openssl, because it is
 | // On linux, prefer a localy build openssl, because it is
 | ||||||
| // much more likely for it to be newer, than the system
 | // much more likely for it to be newer, than the system
 | ||||||
| // openssl from libssl-dev. If there is no local openssl,
 | // openssl from libssl-dev. If there is no local openssl,
 | ||||||
|  | @ -90,28 +91,16 @@ buf_size = 500  // 1536 | ||||||
| fn (req &Request) ssl_do(port int, method, host_name, path string) ?Response { | fn (req &Request) ssl_do(port int, method, host_name, path string) ?Response { | ||||||
| 	// ssl_method := C.SSLv23_method()
 | 	// ssl_method := C.SSLv23_method()
 | ||||||
| 	ssl_method := C.TLSv1_2_method() | 	ssl_method := C.TLSv1_2_method() | ||||||
| 	if isnil(method) { |  | ||||||
| 	} |  | ||||||
| 	ctx := C.SSL_CTX_new(ssl_method) | 	ctx := C.SSL_CTX_new(ssl_method) | ||||||
| 	if isnil(ctx) { |  | ||||||
| 	} |  | ||||||
| 	C.SSL_CTX_set_verify_depth(ctx, 4) | 	C.SSL_CTX_set_verify_depth(ctx, 4) | ||||||
| 	flags := C.SSL_OP_NO_SSLv2 | C.SSL_OP_NO_SSLv3 | C.SSL_OP_NO_COMPRESSION | 	flags := C.SSL_OP_NO_SSLv2 | C.SSL_OP_NO_SSLv3 | C.SSL_OP_NO_COMPRESSION | ||||||
| 	C.SSL_CTX_set_options(ctx, flags) | 	C.SSL_CTX_set_options(ctx, flags) | ||||||
| 	mut res := C.SSL_CTX_load_verify_locations(ctx, 'random-org-chain.pem', 0) | 	mut res := C.SSL_CTX_load_verify_locations(ctx, 'random-org-chain.pem', 0) | ||||||
| 	if res != 1 { |  | ||||||
| 	} |  | ||||||
| 	web := C.BIO_new_ssl_connect(ctx) | 	web := C.BIO_new_ssl_connect(ctx) | ||||||
| 	if isnil(ctx) { |  | ||||||
| 	} |  | ||||||
| 	addr := host_name + ':' + port.str() | 	addr := host_name + ':' + port.str() | ||||||
| 	res = C.BIO_set_conn_hostname(web, addr.str) | 	res = C.BIO_set_conn_hostname(web, addr.str) | ||||||
| 	if res != 1 { |  | ||||||
| 	} |  | ||||||
| 	ssl := &C.ssl_st(0) | 	ssl := &C.ssl_st(0) | ||||||
| 	C.BIO_get_ssl(web, &ssl) | 	C.BIO_get_ssl(web, &ssl) | ||||||
| 	if isnil(ssl) { |  | ||||||
| 	} |  | ||||||
| 	preferred_ciphers := 'HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4' | 	preferred_ciphers := 'HIGH:!aNULL:!kRSA:!PSK:!SRP:!MD5:!RC4' | ||||||
| 	res = C.SSL_set_cipher_list(ssl, preferred_ciphers.str) | 	res = C.SSL_set_cipher_list(ssl, preferred_ciphers.str) | ||||||
| 	if res != 1 { | 	if res != 1 { | ||||||
|  | @ -142,10 +131,10 @@ fn (req &Request) ssl_do(port int, method, host_name, path string) ?Response { | ||||||
| 		mut chunk := (tos(buff, len)) | 		mut chunk := (tos(buff, len)) | ||||||
| 		if !headers_done && chunk.contains('\r\n\r\n') { | 		if !headers_done && chunk.contains('\r\n\r\n') { | ||||||
| 			headers_done = true | 			headers_done = true | ||||||
| 			headers.write(chunk.all_before('\r\n')) | 			headers.write(chunk.all_before('\r\n\r\n')) | ||||||
| 			h = headers.str() | 			h = headers.str() | ||||||
| 			//println(h)
 | 			//println(h)
 | ||||||
| 			sb.write(chunk.after('\r\n')) | 			sb.write(chunk.after('\r\n\r\n')) | ||||||
| 			// TODO for some reason this can be missing from headers
 | 			// TODO for some reason this can be missing from headers
 | ||||||
| 			is_chunk_encoding = false //h.contains('chunked')
 | 			is_chunk_encoding = false //h.contains('chunked')
 | ||||||
| 			//println(sb.str())
 | 			//println(sb.str())
 | ||||||
|  |  | ||||||
|  | @ -18,7 +18,7 @@ pub mut: | ||||||
| 	cookies    map[string]string | 	cookies    map[string]string | ||||||
| 	data       string | 	data       string | ||||||
| 	url        string | 	url        string | ||||||
| 	user_agent string | 	user_agent string = 'v.http' | ||||||
| 	verbose    bool | 	verbose    bool | ||||||
| 	user_ptr   voidptr | 	user_ptr   voidptr | ||||||
| 	ws_func    voidptr | 	ws_func    voidptr | ||||||
|  | @ -31,7 +31,7 @@ pub mut: | ||||||
| 	params     map[string]string | 	params     map[string]string | ||||||
| 	headers    map[string]string | 	headers    map[string]string | ||||||
| 	cookies    map[string]string | 	cookies    map[string]string | ||||||
| 	user_agent string // ='v' QTODO
 | 	user_agent string = 'v.http' | ||||||
| 	verbose    bool = false | 	verbose    bool = false | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue