summaryrefslogtreecommitdiff
path: root/libsoup/server
diff options
context:
space:
mode:
authorPatrick Griffis <pgriffis@igalia.com>2020-11-09 15:21:26 -0600
committerPatrick Griffis <tingping@tingping.se>2020-11-14 19:07:24 +0000
commitebc6e9569dc2bc9c226762ce89fd35950f8ad085 (patch)
tree14c61a8b593919927c1141978a9befefa49f8764 /libsoup/server
parent737eef099ca1e34d18245c54b6ed3ba54faf1f9c (diff)
downloadlibsoup-ebc6e9569dc2bc9c226762ce89fd35950f8ad085.tar.gz
Restore ability to send/recv `OPTIONS *` messages
Since GUri does not support an invalid path of just `*` we have to handle that ourselves.
Diffstat (limited to 'libsoup/server')
-rw-r--r--libsoup/server/soup-server-io.c3
-rw-r--r--libsoup/server/soup-server-message-private.h2
-rw-r--r--libsoup/server/soup-server-message.c25
-rw-r--r--libsoup/server/soup-server-message.h3
-rw-r--r--libsoup/server/soup-server.c18
5 files changed, 45 insertions, 6 deletions
diff --git a/libsoup/server/soup-server-io.c b/libsoup/server/soup-server-io.c
index 3e99acd7..acc8f2ad 100644
--- a/libsoup/server/soup-server-io.c
+++ b/libsoup/server/soup-server-io.c
@@ -592,10 +592,11 @@ parse_headers (SoupServerMessage *msg,
if (!strcmp (req_path, "*") && req_host) {
/* Eg, "OPTIONS * HTTP/1.1" */
- url = g_strdup_printf ("%s://%s/*",
+ url = g_strdup_printf ("%s://%s/",
soup_socket_is_ssl (sock) ? "https" : "http",
req_host);
uri = g_uri_parse (url, SOUP_HTTP_URI_FLAGS, NULL);
+ soup_server_message_set_options_ping (msg, TRUE);
g_free (url);
} else if (soup_server_message_get_method (msg) == SOUP_METHOD_CONNECT) {
/* Authority */
diff --git a/libsoup/server/soup-server-message-private.h b/libsoup/server/soup-server-message-private.h
index a4904653..55ef608c 100644
--- a/libsoup/server/soup-server-message-private.h
+++ b/libsoup/server/soup-server-message-private.h
@@ -40,6 +40,8 @@ void soup_server_message_finished (SoupServerMessage
void soup_server_message_read_request (SoupServerMessage *msg,
SoupMessageIOCompletionFn completion_cb,
gpointer user_data);
+void soup_server_message_set_options_ping (SoupServerMessage *msg,
+ gboolean is_options_ping);
typedef struct _SoupServerMessageIOData SoupServerMessageIOData;
void soup_server_message_io_data_free (SoupServerMessageIOData *io);
diff --git a/libsoup/server/soup-server-message.c b/libsoup/server/soup-server-message.c
index 04baff66..03b68724 100644
--- a/libsoup/server/soup-server-message.c
+++ b/libsoup/server/soup-server-message.c
@@ -68,6 +68,8 @@ struct _SoupServerMessage {
SoupMessageHeaders *response_headers;
SoupServerMessageIOData *io_data;
+
+ gboolean options_ping;
};
struct _SoupServerMessageClass {
@@ -569,6 +571,29 @@ soup_server_message_set_method (SoupServerMessage *msg,
msg->method = g_intern_string (method);
}
+void
+soup_server_message_set_options_ping (SoupServerMessage *msg,
+ gboolean is_options_ping)
+{
+ msg->options_ping = is_options_ping;
+}
+
+/**
+ * soup_server_message_is_options_ping:
+ * @msg: a #SoupServerMessage
+ *
+ * Gets if @msg represents an OPTIONS message with the path `*`.
+ *
+ * Returns: %TRUE if is an OPTIONS ping
+ */
+gboolean
+soup_server_message_is_options_ping (SoupServerMessage *msg)
+{
+ g_return_val_if_fail (SOUP_IS_SERVER_MESSAGE (msg), FALSE);
+
+ return msg->options_ping;
+}
+
/**
* soup_server_message_get_http_version:
* @msg: a #SoupServerMessage
diff --git a/libsoup/server/soup-server-message.h b/libsoup/server/soup-server-message.h
index 7d29b2c2..d3f202d0 100644
--- a/libsoup/server/soup-server-message.h
+++ b/libsoup/server/soup-server-message.h
@@ -74,6 +74,9 @@ const char *soup_server_message_get_remote_host (SoupServerMessage
SOUP_AVAILABLE_IN_ALL
GIOStream *soup_server_message_steal_connection (SoupServerMessage *msg);
+SOUP_AVAILABLE_IN_ALL
+gboolean soup_server_message_is_options_ping (SoupServerMessage *msg);
+
G_END_DECLS
#endif /* __SOUP_SERVER_MESSAGE_H__ */
diff --git a/libsoup/server/soup-server.c b/libsoup/server/soup-server.c
index bbc10627..c49127e1 100644
--- a/libsoup/server/soup-server.c
+++ b/libsoup/server/soup-server.c
@@ -721,15 +721,23 @@ soup_server_get_listeners (SoupServer *server)
*/
#define NORMALIZED_PATH(path) ((path) && *(path) ? (path) : "/")
+static const char *
+get_msg_path (SoupServerMessage *msg)
+{
+ /* A GUri cannot hold a path of "*" so we handle that */
+ if (soup_server_message_is_options_ping (msg))
+ return "*";
+ else
+ return NORMALIZED_PATH (g_uri_get_path (soup_server_message_get_uri (msg)));
+}
+
static SoupServerHandler *
get_handler (SoupServer *server,
SoupServerMessage *msg)
{
SoupServerPrivate *priv = soup_server_get_instance_private (server);
- GUri *uri;
- uri = soup_server_message_get_uri (msg);
- return soup_path_map_lookup (priv->handlers, NORMALIZED_PATH (g_uri_get_path (uri)));
+ return soup_path_map_lookup (priv->handlers, get_msg_path (msg));
}
static void
@@ -757,11 +765,11 @@ call_handler (SoupServer *server,
if (early) {
(*handler->early_callback) (server, msg,
- g_uri_get_path (uri), form_data_set,
+ get_msg_path (msg), form_data_set,
handler->early_user_data);
} else {
(*handler->callback) (server, msg,
- g_uri_get_path (uri), form_data_set,
+ get_msg_path (msg), form_data_set,
handler->user_data);
}