summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorDaniel Stenberg <daniel@haxx.se>2020-06-23 14:28:34 +0200
committerDaniel Stenberg <daniel@haxx.se>2020-06-25 09:31:21 +0200
commit646cc574f0b72723906224824a57cd37ee88e9df (patch)
tree976912afd798ae02877b53c6708f860b1838e132 /lib
parentae3d1e04f68b0f3ef5a19118553cd630f8454a3b (diff)
downloadcurl-646cc574f0b72723906224824a57cd37ee88e9df.tar.gz
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
Diffstat (limited to 'lib')
-rw-r--r--lib/http2.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/lib/http2.c b/lib/http2.c
index 61990019e..6cf651f0c 100644
--- a/lib/http2.c
+++ b/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,