diff options
author | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-05-27 13:08:01 +0200 |
---|---|---|
committer | Carlos Garcia Campos <cgarcia@igalia.com> | 2021-05-27 13:09:11 +0200 |
commit | 8c59b364b72b064cb224b6459dc7de27d854eaae (patch) | |
tree | e263ff275e078ba99e4f0bbd2bb03306b29373f1 /libsoup/http2/soup-client-message-io-http2.c | |
parent | 8251fbee4a1765feb9c04ba2fe1e47389f264f28 (diff) | |
download | libsoup-8c59b364b72b064cb224b6459dc7de27d854eaae.tar.gz |
io-http2: set stream priority based on message priority
Diffstat (limited to 'libsoup/http2/soup-client-message-io-http2.c')
-rw-r--r-- | libsoup/http2/soup-client-message-io-http2.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/libsoup/http2/soup-client-message-io-http2.c b/libsoup/http2/soup-client-message-io-http2.c index 812f6a67..df78eb46 100644 --- a/libsoup/http2/soup-client-message-io-http2.c +++ b/libsoup/http2/soup-client-message-io-http2.c @@ -847,6 +847,25 @@ request_header_is_valid (const char *name) return !g_hash_table_contains (invalid_request_headers, name); } +static int32_t +message_priority_to_weight (SoupMessage *msg) +{ + switch (soup_message_get_priority (msg)) { + case SOUP_MESSAGE_PRIORITY_VERY_LOW: + return NGHTTP2_MIN_WEIGHT; + case SOUP_MESSAGE_PRIORITY_LOW: + return (NGHTTP2_DEFAULT_WEIGHT - NGHTTP2_MIN_WEIGHT) / 2; + case SOUP_MESSAGE_PRIORITY_NORMAL: + return NGHTTP2_DEFAULT_WEIGHT; + case SOUP_MESSAGE_PRIORITY_HIGH: + return (NGHTTP2_MAX_WEIGHT - NGHTTP2_DEFAULT_WEIGHT) / 2; + case SOUP_MESSAGE_PRIORITY_VERY_HIGH: + return NGHTTP2_MAX_WEIGHT; + } + + return NGHTTP2_DEFAULT_WEIGHT; +} + #define MAKE_NV(NAME, VALUE, VALUELEN) \ { \ (uint8_t *)NAME, (uint8_t *)VALUE, strlen (NAME), VALUELEN, \ @@ -912,13 +931,16 @@ send_message_request (SoupMessage *msg, if (logger && body_stream) data->logger = SOUP_LOGGER (logger); + nghttp2_priority_spec priority_spec; + nghttp2_priority_spec_init (&priority_spec, 0, message_priority_to_weight (msg), 0); + nghttp2_data_provider data_provider; if (body_stream) { data_provider.source.ptr = body_stream; data_provider.read_callback = on_data_source_read_callback; } - data->stream_id = nghttp2_submit_request (io->session, NULL, (const nghttp2_nv *)headers->data, headers->len, body_stream ? &data_provider : NULL, data); + data->stream_id = nghttp2_submit_request (io->session, &priority_spec, (const nghttp2_nv *)headers->data, headers->len, body_stream ? &data_provider : NULL, data); h2_debug (io, data, "[SESSION] Request made for %s%s", authority_header, path_and_query); |