]> git.ipfire.org Git - thirdparty/curl.git/commitdiff
url: make sure an HSTS upgrade updates URL and scheme correctly
authorDaniel Stenberg <daniel@haxx.se>
Thu, 5 Nov 2020 08:18:52 +0000 (09:18 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Fri, 6 Nov 2020 07:22:31 +0000 (08:22 +0100)
Closes #6175

lib/url.c

index b01d470e5a9022db543a4d433531477f0c454948..381f98dc65bfc5633ab8873bbbb7d962833df947 100644 (file)
--- a/lib/url.c
+++ b/lib/url.c
@@ -1922,8 +1922,26 @@ static CURLcode parseurlandfillconn(struct Curl_easy *data,
 
 #ifdef USE_HSTS
   if(data->hsts && strcasecompare("http", data->state.up.scheme)) {
-    if(Curl_hsts(data->hsts, data->state.up.hostname, TRUE))
-      infof(data, "Switch from HTTP to HTTPS due to HSTS!\n");
+    if(Curl_hsts(data->hsts, data->state.up.hostname, TRUE)) {
+      char *url;
+      Curl_safefree(data->state.up.scheme);
+      uc = curl_url_set(uh, CURLUPART_SCHEME, "https", 0);
+      if(uc)
+        return Curl_uc_to_curlcode(uc);
+      if(data->change.url_alloc)
+        Curl_safefree(data->change.url);
+      /* after update, get the updated version */
+      uc = curl_url_get(uh, CURLUPART_URL, &url, 0);
+      if(uc)
+        return Curl_uc_to_curlcode(uc);
+      uc = curl_url_get(uh, CURLUPART_SCHEME, &data->state.up.scheme, 0);
+      if(uc)
+        return Curl_uc_to_curlcode(uc);
+      data->change.url = url;
+      data->change.url_alloc = TRUE;
+      infof(data, "Switched from HTTP to HTTPS due to HSTS => %s\n",
+            data->change.url);
+    }
   }
 #endif