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:
parent
ae3d1e04f6
commit
646cc574f0
44
lib/http2.c
44
lib/http2.c
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user