[libsoup] message: add private helper functions to set and replace the Host header



commit 7250d149c297107444c4b651e7c657fe65d7c29a
Author: Carlos Garcia Campos <cgarcia igalia com>
Date:   Sun May 9 12:26:44 2021 +0200

    message: add private helper functions to set and replace the Host header
    
    And ensure we only do this for HTTP/1.x.

 libsoup/soup-message-private.h |  5 +++++
 libsoup/soup-message.c         | 37 +++++++++++++++++++++++++++++++++++++
 libsoup/soup-session.c         | 31 ++-----------------------------
 3 files changed, 44 insertions(+), 29 deletions(-)
---
diff --git a/libsoup/soup-message-private.h b/libsoup/soup-message-private.h
index 4efba24e..5942ee67 100644
--- a/libsoup/soup-message-private.h
+++ b/libsoup/soup-message-private.h
@@ -139,4 +139,9 @@ typedef enum {
 void soup_message_set_metrics_timestamp (SoupMessage           *msg,
                                          SoupMessageMetricsType type);
 
+void soup_message_set_request_host_from_uri     (SoupMessage *msg,
+                                                 GUri        *uri);
+
+void soup_message_update_request_host_if_needed (SoupMessage *msg);
+
 #endif /* __SOUP_MESSAGE_PRIVATE_H__ */
diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c
index 68328d45..b5f2e346 100644
--- a/libsoup/soup-message.c
+++ b/libsoup/soup-message.c
@@ -2622,3 +2622,40 @@ soup_message_set_metrics_timestamp (SoupMessage           *msg,
                 break;
         }
 }
+
+void
+soup_message_set_request_host_from_uri (SoupMessage *msg,
+                                        GUri        *uri)
+{
+        SoupMessagePrivate *priv = soup_message_get_instance_private (msg);
+        char *host;
+
+        if (priv->http_version == SOUP_HTTP_2_0)
+                return;
+
+        host = soup_uri_get_host_for_headers (uri);
+        if (soup_uri_uses_default_port (uri))
+                soup_message_headers_replace (priv->request_headers, "Host", host);
+        else {
+                char *value;
+
+                value = g_strdup_printf ("%s:%d", host, g_uri_get_port (uri));
+                soup_message_headers_replace (priv->request_headers, "Host", value);
+                g_free (value);
+        }
+        g_free (host);
+}
+
+void
+soup_message_update_request_host_if_needed (SoupMessage *msg)
+{
+        SoupMessagePrivate *priv = soup_message_get_instance_private (msg);
+
+        if (priv->http_version == SOUP_HTTP_2_0)
+                return;
+
+        if (soup_message_headers_get_one (priv->request_headers, "Host"))
+                return;
+
+        soup_message_set_request_host_from_uri (msg, priv->uri);
+}
diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c
index 999b8306..9530730d 100644
--- a/libsoup/soup-session.c
+++ b/libsoup/soup-session.c
@@ -1243,7 +1243,6 @@ soup_session_redirect_message (SoupSession *session,
                               GError     **error)
 {
        GUri *new_uri;
-       char *host;
 
        g_return_val_if_fail (SOUP_IS_SESSION (session), FALSE);
        g_return_val_if_fail (SOUP_IS_MESSAGE (msg), FALSE);
@@ -1264,18 +1263,7 @@ soup_session_redirect_message (SoupSession *session,
                                                   SOUP_ENCODING_NONE);
        }
 
-       host = soup_uri_get_host_for_headers (new_uri);
-       if (soup_uri_uses_default_port (new_uri))
-               soup_message_headers_replace (soup_message_get_request_headers (msg), "Host", host);
-       else {
-               char *value;
-
-               value = g_strdup_printf ("%s:%d", host, g_uri_get_port (new_uri));
-               soup_message_headers_replace (soup_message_get_request_headers (msg), "Host", value);
-               g_free (value);
-       }
-       g_free (host);
-
+        soup_message_set_request_host_from_uri (msg, new_uri);
        soup_message_set_uri (msg, new_uri);
        g_uri_unref (new_uri);
 
@@ -1392,22 +1380,7 @@ soup_session_send_queue_item (SoupSession *session,
                soup_message_headers_append (request_headers, "Connection", "Keep-Alive");
        }
 
-        if (!soup_message_headers_get_one (request_headers, "Host")) {
-                GUri *uri = soup_message_get_uri (item->msg);
-                char *host;
-
-                host = soup_uri_get_host_for_headers (uri);
-                if (soup_uri_uses_default_port (uri))
-                        soup_message_headers_append (request_headers, "Host", host);
-                else {
-                        char *value;
-
-                        value = g_strdup_printf ("%s:%d", host, g_uri_get_port (uri));
-                        soup_message_headers_append (request_headers, "Host", value);
-                        g_free (value);
-                }
-                g_free (host);
-        }
+        soup_message_update_request_host_if_needed (item->msg);
 
        /* A user agent SHOULD send a Content-Length in a request message when
         * no Transfer-Encoding is sent and the request method defines a meaning


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]