diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-06-03 11:32:06 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-06-03 11:32:06 +0200 |
commit | 38cd38e60b38ac6cd2e82d64743a56d598f46a9e (patch) | |
tree | 1a93507742ce8174008f57f91b8c20a395c0ffbd | |
parent | 156a6c1e6e3d50410048e11fa2d8af11a13e4f23 (diff) | |
download | libsoup-38cd38e60b38ac6cd2e82d64743a56d598f46a9e.tar.gz |
http2: do not use SOUP_MESSAGE_NEW_CONNECTION flag to implement misdirected response
It's a user flag, if the user sets that flag, we don't retry in
case of misdirected response. Or if the message is re-used we don't want
to force a new connection if the user didn't set the flag.
-rw-r--r-- | libsoup/soup-message-private.h | 5 | ||||
-rw-r--r-- | libsoup/soup-message.c | 18 | ||||
-rw-r--r-- | libsoup/soup-session.c | 9 |
3 files changed, 28 insertions, 4 deletions
diff --git a/libsoup/soup-message-private.h b/libsoup/soup-message-private.h index b64f7a52..1d458011 100644 --- a/libsoup/soup-message-private.h +++ b/libsoup/soup-message-private.h @@ -148,4 +148,9 @@ void soup_message_set_force_http1 (SoupMessage *msg, gboolean force_http1); gboolean soup_message_get_force_http1 (SoupMessage *msg); + +void soup_message_set_is_misdirected_retry (SoupMessage *msg, + gboolean is_misdirected_retry); +gboolean soup_message_is_misdirected_retry (SoupMessage *msg); + #endif /* __SOUP_MESSAGE_PRIVATE_H__ */ diff --git a/libsoup/soup-message.c b/libsoup/soup-message.c index f17c1ec7..d95d1110 100644 --- a/libsoup/soup-message.c +++ b/libsoup/soup-message.c @@ -98,6 +98,7 @@ typedef struct { gboolean is_top_level_navigation; gboolean is_options_ping; gboolean force_http1; + gboolean is_misdirected_retry; guint last_connection_id; GSocketAddress *remote_address; @@ -2929,3 +2930,20 @@ soup_message_get_force_http1 (SoupMessage *msg) return priv->force_http1; } + +void +soup_message_set_is_misdirected_retry (SoupMessage *msg, + gboolean is_misdirected_retry) +{ + SoupMessagePrivate *priv = soup_message_get_instance_private (msg); + + priv->is_misdirected_retry = is_misdirected_retry; +} + +gboolean +soup_message_is_misdirected_retry (SoupMessage *msg) +{ + SoupMessagePrivate *priv = soup_message_get_instance_private (msg); + + return priv->is_misdirected_retry; +} diff --git a/libsoup/soup-session.c b/libsoup/soup-session.c index 82c7b6e0..08aea5de 100644 --- a/libsoup/soup-session.c +++ b/libsoup/soup-session.c @@ -1297,11 +1297,11 @@ misdirected_handler (SoupMessage *msg, /* HTTP/2 messages may get the misdirected request status and MAY * try a new connection */ - if (!soup_message_query_flags (msg, SOUP_MESSAGE_NEW_CONNECTION)) { - soup_message_add_flags (msg, SOUP_MESSAGE_NEW_CONNECTION); + if (!soup_message_is_misdirected_retry (msg)) { + soup_message_set_is_misdirected_retry (msg, TRUE); soup_session_requeue_item (session, - item, - &item->error); + item, + &item->error); } } @@ -1915,6 +1915,7 @@ get_connection (SoupMessageQueueItem *item, gboolean *should_cleanup) need_new_connection = (soup_message_query_flags (item->msg, SOUP_MESSAGE_NEW_CONNECTION)) || + (soup_message_is_misdirected_retry (item->msg)) || (!soup_message_query_flags (item->msg, SOUP_MESSAGE_IDEMPOTENT) && !SOUP_METHOD_IS_IDEMPOTENT (soup_message_get_method (item->msg))); |