fixed the host/proxy name issue when re-using a connection and made IDN names
work when using proxy by converting the IDN-name to the ACE-encoded version before the request-URL is passed to the proxy.
This commit is contained in:
Родитель
da91d6ac66
Коммит
59907ebc0e
35
lib/http.c
35
lib/http.c
|
@ -1398,7 +1398,40 @@ CURLcode Curl_http(struct connectdata *conn)
|
||||||
if (conn->bits.httpproxy &&
|
if (conn->bits.httpproxy &&
|
||||||
!data->set.tunnel_thru_httpproxy &&
|
!data->set.tunnel_thru_httpproxy &&
|
||||||
!(conn->protocol&PROT_HTTPS)) {
|
!(conn->protocol&PROT_HTTPS)) {
|
||||||
/* The path sent to the proxy is in fact the entire URL */
|
/* The path sent to the proxy is in fact the entire URL. But if the remote
|
||||||
|
host is a IDN-name, we must make sure that the request we produce only
|
||||||
|
uses the encoded host name! */
|
||||||
|
if(conn->host.dispname != conn->host.name) {
|
||||||
|
char *url = data->change.url;
|
||||||
|
char *ptr = strstr(url, conn->host.dispname);
|
||||||
|
if(ptr) {
|
||||||
|
/* This is where the display name starts in the URL, now replace this
|
||||||
|
part with the encoded name. TODO: This method of replacing the host
|
||||||
|
name is rather crude as I believe there's a slight risk that the
|
||||||
|
user has entered a user name or password that contain the host name
|
||||||
|
string. */
|
||||||
|
size_t currlen = strlen(conn->host.dispname);
|
||||||
|
size_t newlen = strlen(conn->host.name);
|
||||||
|
size_t urllen = strlen(url);
|
||||||
|
|
||||||
|
char *newurl;
|
||||||
|
|
||||||
|
newurl = malloc(urllen + newlen - currlen + 1);
|
||||||
|
|
||||||
|
/* copy the part before the host name */
|
||||||
|
memcpy(newurl, url, ptr - url);
|
||||||
|
/* append the new host name instead of the old */
|
||||||
|
memcpy(newurl + (ptr - url), conn->host.name, newlen);
|
||||||
|
/* append the piece after the host name */
|
||||||
|
memcpy(newurl + newlen + (ptr - url),
|
||||||
|
ptr + currlen, /* copy the trailing zero byte too */
|
||||||
|
urllen - (ptr-url) - currlen + 1);
|
||||||
|
if(data->change.url_alloc)
|
||||||
|
free(data->change.url);
|
||||||
|
data->change.url = newurl;
|
||||||
|
data->change.url_alloc = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
ppath = data->change.url;
|
ppath = data->change.url;
|
||||||
}
|
}
|
||||||
if(HTTPREQ_POST_FORM == httpreq) {
|
if(HTTPREQ_POST_FORM == httpreq) {
|
||||||
|
|
13
lib/url.c
13
lib/url.c
|
@ -2963,12 +2963,7 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||||
/* get the newly set value, not the old one */
|
/* get the newly set value, not the old one */
|
||||||
conn->bits.no_body = old_conn->bits.no_body;
|
conn->bits.no_body = old_conn->bits.no_body;
|
||||||
|
|
||||||
free(conn->host.rawalloc); /* free the newly allocated name buffer */
|
free(old_conn->host.rawalloc); /* free the newly allocated name buffer */
|
||||||
conn->host.rawalloc = old_conn->host.rawalloc; /* use the old one */
|
|
||||||
conn->host.name = old_conn->host.name;
|
|
||||||
|
|
||||||
conn->host.encalloc = old_conn->host.encalloc; /* use the old one */
|
|
||||||
conn->host.dispname = old_conn->host.dispname;
|
|
||||||
|
|
||||||
free(conn->pathbuffer); /* free the newly allocated path pointer */
|
free(conn->pathbuffer); /* free the newly allocated path pointer */
|
||||||
conn->pathbuffer = old_conn->pathbuffer; /* use the old one */
|
conn->pathbuffer = old_conn->pathbuffer; /* use the old one */
|
||||||
|
@ -3017,7 +3012,8 @@ static CURLcode CreateConnection(struct SessionHandle *data,
|
||||||
|
|
||||||
*in_connect = conn; /* return this instead! */
|
*in_connect = conn; /* return this instead! */
|
||||||
|
|
||||||
infof(data, "Re-using existing connection! (#%d)\n", conn->connectindex);
|
infof(data, "Re-using existing connection! (#%d) with host %s\n",
|
||||||
|
conn->connectindex, conn->host.dispname);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/*
|
/*
|
||||||
|
@ -3381,7 +3377,8 @@ CURLcode Curl_done(struct connectdata *conn)
|
||||||
result = res2;
|
result = res2;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
infof(data, "Connection #%d left intact\n", conn->connectindex);
|
infof(data, "Connection #%d to host %s left intact\n",
|
||||||
|
conn->connectindex, conn->host.dispname);
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
Загрузка…
Ссылка в новой задаче