summaryrefslogtreecommitdiff
path: root/libsoup/http2/soup-client-message-io-http2.c
diff options
context:
space:
mode:
authorCarlos Garcia Campos <cgarcia@igalia.com>2021-05-27 13:08:01 +0200
committerCarlos Garcia Campos <cgarcia@igalia.com>2021-05-27 13:09:11 +0200
commit8c59b364b72b064cb224b6459dc7de27d854eaae (patch)
treee263ff275e078ba99e4f0bbd2bb03306b29373f1 /libsoup/http2/soup-client-message-io-http2.c
parent8251fbee4a1765feb9c04ba2fe1e47389f264f28 (diff)
downloadlibsoup-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.c24
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);