diff options
| author | Patrick Griffis <pgriffis@igalia.com> | 2020-11-09 15:21:26 -0600 |
|---|---|---|
| committer | Patrick Griffis <tingping@tingping.se> | 2020-11-14 19:07:24 +0000 |
| commit | ebc6e9569dc2bc9c226762ce89fd35950f8ad085 (patch) | |
| tree | 14c61a8b593919927c1141978a9befefa49f8764 /libsoup/server | |
| parent | 737eef099ca1e34d18245c54b6ed3ba54faf1f9c (diff) | |
| download | libsoup-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.c | 3 | ||||
| -rw-r--r-- | libsoup/server/soup-server-message-private.h | 2 | ||||
| -rw-r--r-- | libsoup/server/soup-server-message.c | 25 | ||||
| -rw-r--r-- | libsoup/server/soup-server-message.h | 3 | ||||
| -rw-r--r-- | libsoup/server/soup-server.c | 18 |
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); } |
