1
0
mirror of https://github.com/moparisthebest/curl synced 2025-01-11 05:58:01 -05:00

http2: set the correct URL in pushed transfers

...previously CURLINFO_EFFECTIVE_URL would report the URL of the
original "mother transfer", not the actually pushed resource.

Reported-by: Jonathan Cardoso Machado
Fixes #5589
Closes #5591
This commit is contained in:
Daniel Stenberg 2020-06-23 14:28:34 +02:00
parent ae3d1e04f6
commit 646cc574f0
No known key found for this signature in database
GPG Key ID: 5CC908FDB71E12C2

View File

@ -469,6 +469,46 @@ static struct Curl_easy *duphandle(struct Curl_easy *data)
return second;
}
static int set_transfer_url(struct Curl_easy *data,
struct curl_pushheaders *hp)
{
const char *v;
CURLU *u = curl_url();
CURLUcode uc;
char *url;
v = curl_pushheader_byname(hp, ":scheme");
if(v) {
uc = curl_url_set(u, CURLUPART_SCHEME, v, 0);
if(uc)
return 1;
}
v = curl_pushheader_byname(hp, ":authority");
if(v) {
uc = curl_url_set(u, CURLUPART_HOST, v, 0);
if(uc)
return 2;
}
v = curl_pushheader_byname(hp, ":path");
if(v) {
uc = curl_url_set(u, CURLUPART_PATH, v, 0);
if(uc)
return 3;
}
uc = curl_url_get(u, CURLUPART_URL, &url, 0);
if(uc)
return 4;
curl_url_cleanup(u);
if(data->change.url_alloc)
free(data->change.url);
data->change.url_alloc = TRUE;
data->change.url = url;
return 0;
}
static int push_promise(struct Curl_easy *data,
struct connectdata *conn,
@ -505,6 +545,10 @@ static int push_promise(struct Curl_easy *data,
goto fail;
}
rv = set_transfer_url(newhandle, &heads);
if(rv)
goto fail;
Curl_set_in_callback(data, true);
rv = data->multi->push_cb(data, newhandle,
stream->push_headers_used, &heads,