27 #if !defined(CURL_DISABLE_PROXY) && !defined(CURL_DISABLE_HTTP) 83 #ifndef CURL_DISABLE_PROXY 85 struct HTTP http_proxy;
104 memset(&http_proxy, 0,
sizeof(http_proxy));
106 connkeep(conn,
"HTTP proxy CONNECT");
158 infof(conn->
data,
"allocate connect buffer!\n");
177 infof(conn->
data,
"CONNECT phase completed!\n");
190 bool closeConnection =
FALSE;
195 #define SELECT_ERROR 1 196 #define SELECT_TIMEOUT 2 209 infof(data,
"Establish HTTP proxy tunnel to %s:%hu\n",
210 hostname, remote_port);
224 host_port =
aprintf(
"%s:%hu", hostname, remote_port);
237 const char *proxyconn =
"";
238 const char *useragent =
"";
246 ipv6_ip = (strchr(hostname,
':') != NULL);
248 aprintf(
"%s%s%s:%hu", ipv6_ip?
"[":
"", hostname, ipv6_ip?
"]":
"",
256 host =
aprintf(
"Host: %s\r\n", hostheader);
264 proxyconn =
"Proxy-Connection: Keep-Alive\r\n";
272 "CONNECT %s HTTP/%s\r\n" 305 failf(data,
"Failed sending CONNECT to proxy");
318 failf(data,
"Proxy CONNECT aborted due to timeout");
331 while(s->
keepon && !error) {
336 failf(data,
"CONNECT response too large!");
342 result =
Curl_read(conn, tunnelsocket, s->
ptr, 1, &gotbytes);
354 else if(gotbytes <= 0) {
359 infof(data,
"Proxy CONNECT connection closed\n");
363 failf(data,
"Proxy CONNECT aborted");
395 infof(data,
"chunk reading DONE\n");
407 if(*s->
ptr != 0x0a) {
455 " bytes of response-body\n", s->
cl);
460 infof(data,
"Ignore chunked response-body\n");
479 infof(data,
"chunk reading DONE\n");
523 infof(data,
"Ignoring Content-Length in CONNECT %03d response\n",
528 strlen(
"Content-Length:"), NULL, 10, &s->
cl);
532 closeConnection =
TRUE;
538 infof(data,
"Ignoring Transfer-Encoding in " 539 "CONNECT %03d response\n", k->
httpcode);
542 "Transfer-Encoding:",
"chunked")) {
543 infof(data,
"CONNECT responded chunked\n");
550 "Proxy-Connection:",
"close"))
551 closeConnection =
TRUE;
552 else if(2 == sscanf(s->
line_start,
"HTTP/1.%d %d",
581 closeConnection =
TRUE;
584 if(closeConnection && data->
req.
newurl) {
602 if(closeConnection && data->
req.
newurl) {
604 infof(data,
"Connect me again please\n");
622 failf(data,
"Received HTTP code %d from proxy after CONNECT",
637 infof(data,
"Proxy replied %d to CONNECT request\n",
672 result =
CONNECT(conn, sockindex, hostname, remote_port);
CHUNKcode Curl_httpchunk_read(struct connectdata *conn, char *datap, ssize_t length, ssize_t *wrote)
int Curl_debug(struct Curl_easy *data, curl_infotype type, char *ptr, size_t size, struct connectdata *conn)
enum http_connect_state::@33 tunnel_state
static void connect_done(struct connectdata *conn)
bool Curl_conn_data_pending(struct connectdata *conn, int sockindex)
CURLcode Curl_http_input_auth(struct connectdata *conn, bool proxy, const char *auth)
void Curl_connect_free(struct Curl_easy *data)
void Curl_httpchunk_init(struct connectdata *conn)
#define streamclose(x, y)
CURLcode Curl_http_auth_act(struct connectdata *conn)
void Curl_add_buffer_free(Curl_send_buffer *buff)
char * Curl_checkProxyheaders(const struct connectdata *conn, const char *thisheader)
static CURLcode https_proxy_connect(struct connectdata *conn, int sockindex)
static CURLcode CONNECT(struct connectdata *conn, int sockindex, const char *hostname, int remote_port)
int Curl_closesocket(struct connectdata *conn, curl_socket_t sock)
#define CONNECT_BUFFER_SIZE
static CURLcode connect_init(struct connectdata *conn, bool reinit)
#define Curl_ssl_connect_nonblocking(x, y, z)
UNITTEST_START int result
struct proxy_info http_proxy
bool Curl_compareheader(const char *headerline, const char *header, const char *content)
bool suppress_connect_headers
int Curl_pgrsUpdate(struct connectdata *conn)
struct connectdata * easy_conn
time_t Curl_timeleft(struct Curl_easy *data, struct curltime *nowp, bool duringconnect)
char * Curl_copy_header_value(const char *header)
char connect_buffer[CONNECT_BUFFER_SIZE]
CURLofft curlx_strtoofft(const char *str, char **endp, int base, curl_off_t *num)
struct http_connect_state * connect_state
#define Curl_convert_from_network(a, b, c)
#define CLIENTWRITE_HEADER
CURLcode Curl_add_buffer_send(Curl_send_buffer *in, struct connectdata *conn, long *bytes_written, size_t included_body_bytes, int socketindex)
CURLcode Curl_client_write(struct connectdata *conn, int type, char *ptr, size_t len)
bool Curl_connect_ongoing(struct connectdata *conn)
#define Curl_safefree(ptr)
unsigned short secondary_port
CURLcode Curl_proxyCONNECT(struct connectdata *conn, int sockindex, const char *hostname, int remote_port)
CURLcode Curl_http_output_auth(struct connectdata *conn, const char *request, const char *path, bool proxytunnel)
Curl_http_output_auth() setups the authentication headers for the host/proxy and the correct authenti...
struct hostname conn_to_host
CURLcode Curl_add_bufferf(Curl_send_buffer *in, const char *fmt,...)
Curl_send_buffer * Curl_add_buffer_init(void)
#define checkprefix(a, b)
bool Curl_connect_complete(struct connectdata *conn)
struct connectdata::dynamically_allocated_data allocptr
bool proxy_ssl_connected[2]
CURLcode Curl_add_custom_headers(struct connectdata *conn, bool is_connect, Curl_send_buffer *req_buffer)
#define calloc(nbelem, size)
CURLcode Curl_read(struct connectdata *conn, curl_socket_t sockfd, char *buf, size_t sizerequested, ssize_t *n)
bool proxy_connect_closed
#define CURL_FORMAT_CURL_OFF_T
CURLcode Curl_proxy_connect(struct connectdata *conn, int sockindex)