summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNode.js GitHub Bot <github-bot@iojs.org>2023-04-30 00:27:22 +0000
committerNode.js GitHub Bot <github-bot@iojs.org>2023-04-30 00:29:19 +0000
commit69f8b22b92c5f901141bc05fb6575d68c1f933a5 (patch)
tree15abc172b919449158eee773f4fec49e0d676cb9
parent20f685f2facee5547a8343e8a4fcc4717d368166 (diff)
downloadnode-new-69f8b22b92c5f901141bc05fb6575d68c1f933a5.tar.gz
deps: update nghttp3 to 0.11.0
-rw-r--r--deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h106
-rw-r--r--deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h4
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_conn.c89
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_conv.c10
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_conv.h18
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_frame.c25
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_frame.h19
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_http.c11
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_http.h20
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_stream.c9
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_stream.h3
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c16
-rw-r--r--deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h4
13 files changed, 215 insertions, 119 deletions
diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h
index 4b1af3c759..a62493f9c1 100644
--- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h
+++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/nghttp3.h
@@ -68,6 +68,12 @@ extern "C" {
# endif /* !BUILDING_NGHTTP3 */
#endif /* !defined(WIN32) */
+#ifdef _MSC_VER
+# define NGHTTP3_ALIGN(N) __declspec(align(N))
+#else /* !_MSC_VER */
+# define NGHTTP3_ALIGN(N) __attribute__((aligned(N)))
+#endif /* !_MSC_VER */
+
/**
* @typedef
*
@@ -1937,12 +1943,12 @@ typedef struct nghttp3_settings {
* Extended CONNECT Method (see :rfc:`9220`). Client ignores this
* field.
*/
- int enable_connect_protocol;
+ uint8_t enable_connect_protocol;
/**
* :member:`h3_datagram`, if set to nonzero, enables HTTP/3
* Datagrams (see :rfc:`9297`).
*/
- int h3_datagram;
+ uint8_t h3_datagram;
} nghttp3_settings;
/**
@@ -2431,12 +2437,15 @@ NGHTTP3_EXTERN uint64_t nghttp3_conn_get_frame_payload_left(nghttp3_conn *conn,
*/
#define NGHTTP3_URGENCY_LEVELS (NGHTTP3_URGENCY_LOW + 1)
+#define NGHTTP3_PRI_V1 1
+#define NGHTTP3_PRI_VERSION NGHTTP3_PRI_V1
+
/**
* @struct
*
* :type:`nghttp3_pri` represents HTTP priority.
*/
-typedef struct nghttp3_pri {
+typedef struct NGHTTP3_ALIGN(8) nghttp3_pri {
/**
* :member:`urgency` is the urgency of a stream, it must be in
* [:macro:`NGHTTP3_URGENCY_HIGH`, :macro:`NGHTTP3_URGENCY_LOW`],
@@ -2449,7 +2458,7 @@ typedef struct nghttp3_pri {
* incrementally. If inc is 1, it can be processed incrementally.
* Other value is not permitted.
*/
- int inc;
+ uint8_t inc;
} nghttp3_pri;
/**
@@ -2466,26 +2475,53 @@ typedef struct nghttp3_pri {
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
+ * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT`
+ * |stream_id| is not a client initiated bidirectional stream ID.
* :macro:`NGHTTP3_ERR_STREAM_NOT_FOUND`
* Stream not found.
*/
-NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority(nghttp3_conn *conn,
- nghttp3_pri *dest,
- int64_t stream_id);
+NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority_versioned(
+ nghttp3_conn *conn, int pri_version, nghttp3_pri *dest, int64_t stream_id);
/**
* @function
*
- * `nghttp3_conn_set_stream_priority` updates priority of a stream
- * denoted by |stream_id| with the value pointed by |pri|.
+ * `nghttp3_conn_set_client_stream_priority` updates priority of a
+ * stream denoted by |stream_id| with the value pointed by |data| of
+ * length |datalen|, which should be a serialized :rfc:`9218` priority
+ * field value. |stream_id| must identify client initiated
+ * bidirectional stream.
+ *
+ * This function must not be called if |conn| is initialized as
+ * server.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT`
+ * |stream_id| is not a client initiated bidirectional stream ID.
+ * :macro:`NGHTTP3_ERR_STREAM_NOT_FOUND`
+ * Stream not found.
+ * :macro:`NGHTTP3_ERR_NOMEM`
+ * Out of memory.
+ */
+NGHTTP3_EXTERN int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn,
+ int64_t stream_id,
+ const uint8_t *data,
+ size_t datalen);
+
+/**
+ * @function
+ *
+ * `nghttp3_conn_set_server_stream_priority` updates priority of a
+ * stream denoted by |stream_id| with the value pointed by |pri|.
* |stream_id| must identify client initiated bidirectional stream.
*
- * Both client and server can update stream priority with this
- * function.
+ * This function must not be called if |conn| is initialized as
+ * client.
*
- * If server updates stream priority with this function, it completely
- * overrides stream priority set by client and the attempts to update
- * priority by client are ignored.
+ * This function completely overrides stream priority set by client
+ * and the attempts to update priority by client are ignored.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
@@ -2497,9 +2533,9 @@ NGHTTP3_EXTERN int nghttp3_conn_get_stream_priority(nghttp3_conn *conn,
* :macro:`NGHTTP3_ERR_NOMEM`
* Out of memory.
*/
-NGHTTP3_EXTERN int nghttp3_conn_set_stream_priority(nghttp3_conn *conn,
- int64_t stream_id,
- const nghttp3_pri *pri);
+NGHTTP3_EXTERN int nghttp3_conn_set_server_stream_priority_versioned(
+ nghttp3_conn *conn, int64_t stream_id, int pri_version,
+ const nghttp3_pri *pri);
/**
* @function
@@ -2544,21 +2580,11 @@ NGHTTP3_EXTERN int nghttp3_check_header_value(const uint8_t *value, size_t len);
/**
* @function
*
- * `nghttp3_http_parse_priority` parses priority HTTP header field
- * stored in the buffer pointed by |value| of length |len|. If it
- * successfully processed header field value, it stores the result
- * into |*dest|. This function just overwrites what it sees in the
- * header field value and does not initialize any field in |*dest|.
- *
- * This function returns 0 if it succeeds, or one of the following
- * negative error codes:
- *
- * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT`
- * The function could not parse the provided value.
+ * `nghttp3_conn_is_drained` returns nonzero if
+ * `nghttp3_conn_shutdown` has been called, and there is no active
+ * remote streams. This function is for server use only.
*/
-NGHTTP3_EXTERN int nghttp3_http_parse_priority(nghttp3_pri *dest,
- const uint8_t *value,
- size_t len);
+NGHTTP3_EXTERN int nghttp3_conn_is_drained(nghttp3_conn *conn);
/**
* @function
@@ -2662,6 +2688,24 @@ NGHTTP3_EXTERN int nghttp3_err_is_fatal(int liberr);
(CALLBACKS), NGHTTP3_SETTINGS_VERSION, \
(SETTINGS), (MEM), (USER_DATA))
+/*
+ * `nghttp3_conn_set_server_stream_priority` is a wrapper around
+ * `nghttp3_conn_set_server_stream_priority_versioned` to set the
+ * correct struct version.
+ */
+#define nghttp3_conn_set_server_stream_priority(CONN, STREAM_ID, PRI) \
+ nghttp3_conn_set_server_stream_priority_versioned( \
+ (CONN), (STREAM_ID), NGHTTP3_PRI_VERSION, (PRI))
+
+/*
+ * `nghttp3_conn_get_stream_priority` is a wrapper around
+ * `nghttp3_conn_get_stream_priority_versioned` to set the correct
+ * struct version.
+ */
+#define nghttp3_conn_get_stream_priority(CONN, DEST, STREAM_ID) \
+ nghttp3_conn_get_stream_priority_versioned((CONN), NGHTTP3_PRI_VERSION, \
+ (DEST), (STREAM_ID))
+
#ifdef __cplusplus
}
#endif
diff --git a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h
index 54a77ef5d1..70511620e4 100644
--- a/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h
+++ b/deps/ngtcp2/nghttp3/lib/includes/nghttp3/version.h
@@ -31,7 +31,7 @@
*
* Version number of the nghttp3 library release.
*/
-#define NGHTTP3_VERSION "0.10.0"
+#define NGHTTP3_VERSION "0.11.0"
/**
* @macro
@@ -41,6 +41,6 @@
* number, 8 bits for minor and 8 bits for patch. Version 1.2.3
* becomes 0x010203.
*/
-#define NGHTTP3_VERSION_NUM 0x000a00
+#define NGHTTP3_VERSION_NUM 0x000b00
#endif /* NGHTTP3_VERSION_H */
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c
index c9900c3eef..dc244ccf39 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conn.c
@@ -1146,16 +1146,17 @@ static nghttp3_tnode *stream_get_sched_node(nghttp3_stream *stream) {
}
static int conn_update_stream_priority(nghttp3_conn *conn,
- nghttp3_stream *stream, uint8_t pri) {
+ nghttp3_stream *stream,
+ const nghttp3_pri *pri) {
assert(nghttp3_client_stream_bidi(stream->node.id));
- if (stream->node.pri == pri) {
+ if (nghttp3_pri_eq(&stream->node.pri, pri)) {
return 0;
}
nghttp3_conn_unschedule_stream(conn, stream);
- stream->node.pri = pri;
+ stream->node.pri = *pri;
if (nghttp3_stream_require_schedule(stream)) {
return nghttp3_conn_schedule_stream(conn, stream);
@@ -1392,7 +1393,7 @@ nghttp3_ssize nghttp3_conn_read_bidi(nghttp3_conn *conn, size_t *pnproc,
(stream->rx.http.flags & NGHTTP3_HTTP_FLAG_PRIORITY) &&
!(stream->flags & NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED) &&
!(stream->flags & NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET)) {
- rv = conn_update_stream_priority(conn, stream, stream->rx.http.pri);
+ rv = conn_update_stream_priority(conn, stream, &stream->rx.http.pri);
if (rv != 0) {
return rv;
}
@@ -1508,11 +1509,9 @@ int nghttp3_conn_on_data(nghttp3_conn *conn, nghttp3_stream *stream,
}
static nghttp3_pq *conn_get_sched_pq(nghttp3_conn *conn, nghttp3_tnode *tnode) {
- uint32_t urgency = nghttp3_pri_uint8_urgency(tnode->pri);
+ assert(tnode->pri.urgency < NGHTTP3_URGENCY_LEVELS);
- assert(urgency < NGHTTP3_URGENCY_LEVELS);
-
- return &conn->sched[urgency].spq;
+ return &conn->sched[tnode->pri.urgency].spq;
}
static nghttp3_ssize conn_decode_headers(nghttp3_conn *conn,
@@ -1688,7 +1687,7 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn,
return NGHTTP3_ERR_H3_SETTINGS_ERROR;
}
- dest->enable_connect_protocol = (int)ent->value;
+ dest->enable_connect_protocol = (uint8_t)ent->value;
break;
case NGHTTP3_SETTINGS_ID_H3_DATAGRAM:
switch (ent->value) {
@@ -1699,7 +1698,7 @@ int nghttp3_conn_on_settings_entry_received(nghttp3_conn *conn,
return NGHTTP3_ERR_H3_SETTINGS_ERROR;
}
- dest->h3_datagram = (int)ent->value;
+ dest->h3_datagram = (uint8_t)ent->value;
break;
case NGHTTP3_H2_SETTINGS_ID_ENABLE_PUSH:
case NGHTTP3_H2_SETTINGS_ID_MAX_CONCURRENT_STREAMS:
@@ -1753,7 +1752,7 @@ conn_on_priority_update_stream(nghttp3_conn *conn,
return rv;
}
- stream->node.pri = nghttp3_pri_to_uint8(&fr->pri);
+ stream->node.pri = fr->pri;
stream->flags |= NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED;
return 0;
@@ -1765,8 +1764,7 @@ conn_on_priority_update_stream(nghttp3_conn *conn,
stream->flags |= NGHTTP3_STREAM_FLAG_PRIORITY_UPDATE_RECVED;
- return conn_update_stream_priority(conn, stream,
- nghttp3_pri_to_uint8(&fr->pri));
+ return conn_update_stream_priority(conn, stream, &fr->pri);
}
int nghttp3_conn_on_priority_update(nghttp3_conn *conn,
@@ -2077,7 +2075,7 @@ static int conn_submit_headers_data(nghttp3_conn *conn, nghttp3_stream *stream,
const nghttp3_data_reader *dr) {
int rv;
nghttp3_nv *nnva;
- nghttp3_frame_entry frent;
+ nghttp3_frame_entry frent = {0};
rv = nghttp3_nva_copy(&nnva, nva, nvlen, conn->mem);
if (rv != 0) {
@@ -2247,7 +2245,7 @@ int nghttp3_conn_submit_trailers(nghttp3_conn *conn, int64_t stream_id,
}
int nghttp3_conn_submit_shutdown_notice(nghttp3_conn *conn) {
- nghttp3_frame_entry frent;
+ nghttp3_frame_entry frent = {0};
int rv;
assert(conn->tx.ctrl);
@@ -2270,7 +2268,7 @@ int nghttp3_conn_submit_shutdown_notice(nghttp3_conn *conn) {
}
int nghttp3_conn_shutdown(nghttp3_conn *conn) {
- nghttp3_frame_entry frent;
+ nghttp3_frame_entry frent = {0};
int rv;
assert(conn->tx.ctrl);
@@ -2480,9 +2478,12 @@ uint64_t nghttp3_conn_get_frame_payload_left(nghttp3_conn *conn,
return (uint64_t)stream->rstate.left;
}
-int nghttp3_conn_get_stream_priority(nghttp3_conn *conn, nghttp3_pri *dest,
- int64_t stream_id) {
+int nghttp3_conn_get_stream_priority_versioned(nghttp3_conn *conn,
+ int pri_version,
+ nghttp3_pri *dest,
+ int64_t stream_id) {
nghttp3_stream *stream;
+ (void)pri_version;
assert(conn->server);
@@ -2495,19 +2496,20 @@ int nghttp3_conn_get_stream_priority(nghttp3_conn *conn, nghttp3_pri *dest,
return NGHTTP3_ERR_STREAM_NOT_FOUND;
}
- dest->urgency = nghttp3_pri_uint8_urgency(stream->node.pri);
- dest->inc = nghttp3_pri_uint8_inc(stream->node.pri);
+ *dest = stream->node.pri;
return 0;
}
-int nghttp3_conn_set_stream_priority(nghttp3_conn *conn, int64_t stream_id,
- const nghttp3_pri *pri) {
+int nghttp3_conn_set_client_stream_priority(nghttp3_conn *conn,
+ int64_t stream_id,
+ const uint8_t *data,
+ size_t datalen) {
nghttp3_stream *stream;
- nghttp3_frame_entry frent;
+ nghttp3_frame_entry frent = {0};
+ uint8_t *buf = NULL;
- assert(pri->urgency < NGHTTP3_URGENCY_LEVELS);
- assert(pri->inc == 0 || pri->inc == 1);
+ assert(!conn->server);
if (!nghttp3_client_stream_bidi(stream_id)) {
return NGHTTP3_ERR_INVALID_ARGUMENT;
@@ -2518,19 +2520,48 @@ int nghttp3_conn_set_stream_priority(nghttp3_conn *conn, int64_t stream_id,
return NGHTTP3_ERR_STREAM_NOT_FOUND;
}
- if (conn->server) {
- stream->flags |= NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET;
+ if (datalen) {
+ buf = nghttp3_mem_malloc(conn->mem, datalen);
+ if (buf == NULL) {
+ return NGHTTP3_ERR_NOMEM;
+ }
- return conn_update_stream_priority(conn, stream, nghttp3_pri_to_uint8(pri));
+ memcpy(buf, data, datalen);
}
frent.fr.hd.type = NGHTTP3_FRAME_PRIORITY_UPDATE;
frent.fr.priority_update.pri_elem_id = stream_id;
- frent.fr.priority_update.pri = *pri;
+ frent.fr.priority_update.data = buf;
+ frent.fr.priority_update.datalen = datalen;
return nghttp3_stream_frq_add(conn->tx.ctrl, &frent);
}
+int nghttp3_conn_set_server_stream_priority_versioned(nghttp3_conn *conn,
+ int64_t stream_id,
+ int pri_version,
+ const nghttp3_pri *pri) {
+ nghttp3_stream *stream;
+ (void)pri_version;
+
+ assert(conn->server);
+ assert(pri->urgency < NGHTTP3_URGENCY_LEVELS);
+ assert(pri->inc == 0 || pri->inc == 1);
+
+ if (!nghttp3_client_stream_bidi(stream_id)) {
+ return NGHTTP3_ERR_INVALID_ARGUMENT;
+ }
+
+ stream = nghttp3_conn_find_stream(conn, stream_id);
+ if (stream == NULL) {
+ return NGHTTP3_ERR_STREAM_NOT_FOUND;
+ }
+
+ stream->flags |= NGHTTP3_STREAM_FLAG_SERVER_PRIORITY_SET;
+
+ return conn_update_stream_priority(conn, stream, pri);
+}
+
int nghttp3_conn_is_remote_qpack_encoder_stream(nghttp3_conn *conn,
int64_t stream_id) {
nghttp3_stream *stream;
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c
index f7853d9c20..edd0adc4d0 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.c
@@ -39,7 +39,7 @@ int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p) {
uint64_t n64;
} n;
- *plen = 1u << (*p >> 6);
+ *plen = (size_t)(1u << (*p >> 6));
switch (*plen) {
case 1:
@@ -63,7 +63,9 @@ int64_t nghttp3_get_varint(size_t *plen, const uint8_t *p) {
int64_t nghttp3_get_varint_fb(const uint8_t *p) { return *p & 0x3f; }
-size_t nghttp3_get_varintlen(const uint8_t *p) { return 1u << (*p >> 6); }
+size_t nghttp3_get_varintlen(const uint8_t *p) {
+ return (size_t)(1u << (*p >> 6));
+}
uint8_t *nghttp3_put_uint64be(uint8_t *p, uint64_t n) {
n = nghttp3_htonl64(n);
@@ -119,7 +121,3 @@ size_t nghttp3_put_varintlen(int64_t n) {
uint64_t nghttp3_ord_stream_id(int64_t stream_id) {
return (uint64_t)(stream_id >> 2) + 1;
}
-
-uint8_t nghttp3_pri_to_uint8(const nghttp3_pri *pri) {
- return (uint8_t)((uint32_t)pri->inc << 7 | pri->urgency);
-}
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h
index 91cd0b0834..2905457fe1 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_conv.h
@@ -186,22 +186,4 @@ uint64_t nghttp3_ord_stream_id(int64_t stream_id);
*/
#define NGHTTP3_PRI_INC_MASK (1 << 7)
-/*
- * nghttp3_pri_to_uint8 encodes |pri| into uint8_t variable.
- */
-uint8_t nghttp3_pri_to_uint8(const nghttp3_pri *pri);
-
-/*
- * nghttp3_pri_uint8_urgency extracts urgency from |PRI| which is
- * supposed to be constructed by nghttp3_pri_to_uint8.
- */
-#define nghttp3_pri_uint8_urgency(PRI) \
- ((uint32_t)((PRI) & ~NGHTTP3_PRI_INC_MASK))
-
-/*
- * nghttp3_pri_uint8_inc extracts inc from |PRI| which is supposed to
- * be constructed by nghttp3_pri_to_uint8.
- */
-#define nghttp3_pri_uint8_inc(PRI) (((PRI)&NGHTTP3_PRI_INC_MASK) != 0)
-
#endif /* NGHTTP3_CONV_H */
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c
index e7d64fb23d..1488a9af2e 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.c
@@ -94,17 +94,8 @@ nghttp3_frame_write_priority_update(uint8_t *p,
const nghttp3_frame_priority_update *fr) {
p = nghttp3_frame_write_hd(p, &fr->hd);
p = nghttp3_put_varint(p, fr->pri_elem_id);
-
- assert(fr->pri.urgency <= NGHTTP3_URGENCY_LOW);
-
- *p++ = 'u';
- *p++ = '=';
- *p++ = (uint8_t)('0' + fr->pri.urgency);
-
- if (fr->pri.inc) {
-#define NGHTTP3_PRIORITY_INCREMENTAL ", i"
- p = nghttp3_cpymem(p, (const uint8_t *)NGHTTP3_PRIORITY_INCREMENTAL,
- sizeof(NGHTTP3_PRIORITY_INCREMENTAL) - 1);
+ if (fr->datalen) {
+ p = nghttp3_cpymem(p, fr->data, fr->datalen);
}
return p;
@@ -112,8 +103,7 @@ nghttp3_frame_write_priority_update(uint8_t *p,
size_t nghttp3_frame_write_priority_update_len(
int64_t *ppayloadlen, const nghttp3_frame_priority_update *fr) {
- size_t payloadlen = nghttp3_put_varintlen(fr->pri_elem_id) + sizeof("u=U") -
- 1 + (fr->pri.inc ? sizeof(", i") - 1 : 0);
+ size_t payloadlen = nghttp3_put_varintlen(fr->pri_elem_id) + fr->datalen;
*ppayloadlen = (int64_t)payloadlen;
@@ -202,3 +192,12 @@ void nghttp3_frame_headers_free(nghttp3_frame_headers *fr,
nghttp3_nva_del(fr->nva, mem);
}
+
+void nghttp3_frame_priority_update_free(nghttp3_frame_priority_update *fr,
+ const nghttp3_mem *mem) {
+ if (fr == NULL) {
+ return;
+ }
+
+ nghttp3_mem_free(mem, fr->data);
+}
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h
index e4d8348b7a..52407d1284 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_frame.h
@@ -103,7 +103,17 @@ typedef struct nghttp3_frame_priority_update {
NGHTTP3_FRAME_PRIORITY_UPDATE_PUSH_ID. It is undefined
otherwise. */
int64_t pri_elem_id;
- nghttp3_pri pri;
+ /* When sending this frame, data should point to the buffer
+ containing a serialized priority field value and its length is
+ set to datalen. On reception, pri contains the decoded priority
+ header value. */
+ union {
+ nghttp3_pri pri;
+ struct {
+ uint8_t *data;
+ size_t datalen;
+ };
+ };
} nghttp3_frame_priority_update;
typedef union nghttp3_frame {
@@ -212,4 +222,11 @@ void nghttp3_nva_del(nghttp3_nv *nva, const nghttp3_mem *mem);
void nghttp3_frame_headers_free(nghttp3_frame_headers *fr,
const nghttp3_mem *mem);
+/*
+ * nghttp3_frame_priority_update_free frees memory allocated for |fr|.
+ * This function should only be called for an outgoing frame.
+ */
+void nghttp3_frame_priority_update_free(nghttp3_frame_priority_update *fr,
+ const nghttp3_mem *mem);
+
#endif /* NGHTTP3_FRAME_H */
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c
index 9ce3625dcc..3b287a06e3 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.c
@@ -147,7 +147,7 @@ int nghttp3_http_parse_priority(nghttp3_pri *dest, const uint8_t *value,
return NGHTTP3_ERR_INVALID_ARGUMENT;
}
- pri.inc = val.boolean;
+ pri.inc = (uint8_t)val.boolean;
break;
case 'u':
@@ -277,11 +277,10 @@ static int http_request_on_header(nghttp3_http_state *http,
break;
case NGHTTP3_QPACK_TOKEN_PRIORITY:
if (!trailers && !(http->flags & NGHTTP3_HTTP_FLAG_BAD_PRIORITY)) {
- pri.urgency = nghttp3_pri_uint8_urgency(http->pri);
- pri.inc = nghttp3_pri_uint8_inc(http->pri);
+ pri = http->pri;
if (nghttp3_http_parse_priority(&pri, nv->value->base, nv->value->len) ==
0) {
- http->pri = nghttp3_pri_to_uint8(&pri);
+ http->pri = pri;
http->flags |= NGHTTP3_HTTP_FLAG_PRIORITY;
} else {
http->flags &= ~NGHTTP3_HTTP_FLAG_PRIORITY;
@@ -997,3 +996,7 @@ int nghttp3_check_header_value(const uint8_t *value, size_t len) {
}
return 1;
}
+
+int nghttp3_pri_eq(const nghttp3_pri *a, const nghttp3_pri *b) {
+ return a->urgency == b->urgency && a->inc == b->inc;
+}
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h
index eb66b375e2..575d9c267e 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_http.h
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_http.h
@@ -150,4 +150,24 @@ int nghttp3_http_on_data_chunk(nghttp3_stream *stream, size_t n);
void nghttp3_http_record_request_method(nghttp3_stream *stream,
const nghttp3_nv *nva, size_t nvlen);
+/**
+ * @function
+ *
+ * `nghttp3_http_parse_priority` parses priority HTTP header field
+ * stored in the buffer pointed by |value| of length |len|. If it
+ * successfully processed header field value, it stores the result
+ * into |*dest|. This function just overwrites what it sees in the
+ * header field value and does not initialize any field in |*dest|.
+ *
+ * This function returns 0 if it succeeds, or one of the following
+ * negative error codes:
+ *
+ * :macro:`NGHTTP3_ERR_INVALID_ARGUMENT`
+ * The function could not parse the provided value.
+ */
+int nghttp3_http_parse_priority(nghttp3_pri *dest, const uint8_t *value,
+ size_t len);
+
+int nghttp3_pri_eq(const nghttp3_pri *a, const nghttp3_pri *b);
+
#endif /* NGHTTP3_HTTP_H */
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c
index ef2e1e2a38..8cd1427ed6 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.c
@@ -60,7 +60,7 @@ int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id,
stream->out_chunk_objalloc = out_chunk_objalloc;
stream->stream_objalloc = stream_objalloc;
- nghttp3_tnode_init(&stream->node, stream_id, NGHTTP3_DEFAULT_URGENCY);
+ nghttp3_tnode_init(&stream->node, stream_id);
nghttp3_ringbuf_init(&stream->frq, 0, sizeof(nghttp3_frame_entry), mem);
nghttp3_ringbuf_init(&stream->chunks, 0, sizeof(nghttp3_buf), mem);
@@ -74,7 +74,7 @@ int nghttp3_stream_new(nghttp3_stream **pstream, int64_t stream_id,
stream->tx.offset = 0;
stream->rx.http.status_code = -1;
stream->rx.http.content_length = -1;
- stream->rx.http.pri = NGHTTP3_DEFAULT_URGENCY;
+ stream->rx.http.pri.urgency = NGHTTP3_DEFAULT_URGENCY;
stream->error_code = NGHTTP3_H3_NO_ERROR;
if (callbacks) {
@@ -143,6 +143,9 @@ static void delete_frq(nghttp3_ringbuf *frq, const nghttp3_mem *mem) {
case NGHTTP3_FRAME_HEADERS:
nghttp3_frame_headers_free(&frent->fr.headers, mem);
break;
+ case NGHTTP3_FRAME_PRIORITY_UPDATE:
+ nghttp3_frame_priority_update_free(&frent->fr.priority_update, mem);
+ break;
default:
break;
}
@@ -286,6 +289,8 @@ int nghttp3_stream_fill_outq(nghttp3_stream *stream) {
if (rv != 0) {
return rv;
}
+ nghttp3_frame_priority_update_free(&frent->fr.priority_update,
+ stream->mem);
break;
default:
/* TODO Not implemented */
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h
index 0a806a1f83..9908d43dc0 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_stream.h
@@ -195,9 +195,8 @@ typedef struct nghttp3_http_state {
/* recv_content_length is the number of body bytes received so
far. */
int64_t recv_content_length;
+ nghttp3_pri pri;
uint32_t flags;
- /* pri is a stream priority produced by nghttp3_pri_to_uint8. */
- uint8_t pri;
} nghttp3_http_state;
struct nghttp3_stream {
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c
index 2fe7f3fb88..d9c5e59869 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.c
@@ -31,13 +31,12 @@
#include "nghttp3_conn.h"
#include "nghttp3_conv.h"
-void nghttp3_tnode_init(nghttp3_tnode *tnode, int64_t id, uint8_t pri) {
- assert(nghttp3_pri_uint8_urgency(pri) < NGHTTP3_URGENCY_LEVELS);
-
+void nghttp3_tnode_init(nghttp3_tnode *tnode, int64_t id) {
tnode->pe.index = NGHTTP3_PQ_BAD_INDEX;
tnode->id = id;
tnode->cycle = 0;
- tnode->pri = pri;
+ tnode->pri.urgency = NGHTTP3_DEFAULT_URGENCY;
+ tnode->pri.inc = 0;
}
void nghttp3_tnode_free(nghttp3_tnode *tnode) { (void)tnode; }
@@ -73,12 +72,11 @@ int nghttp3_tnode_schedule(nghttp3_tnode *tnode, nghttp3_pq *pq,
uint64_t penalty = nwrite / NGHTTP3_STREAM_MIN_WRITELEN;
if (tnode->pe.index == NGHTTP3_PQ_BAD_INDEX) {
- tnode->cycle = pq_get_first_cycle(pq) +
- ((nwrite == 0 || !nghttp3_pri_uint8_inc(tnode->pri))
- ? 0
- : nghttp3_max(1, penalty));
+ tnode->cycle =
+ pq_get_first_cycle(pq) +
+ ((nwrite == 0 || !tnode->pri.inc) ? 0 : nghttp3_max(1, penalty));
} else if (nwrite > 0) {
- if (!nghttp3_pri_uint8_inc(tnode->pri) || nghttp3_pq_size(pq) == 1) {
+ if (!tnode->pri.inc || nghttp3_pq_size(pq) == 1) {
return 0;
}
diff --git a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h
index f97120a8a5..1abc1e6251 100644
--- a/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h
+++ b/deps/ngtcp2/nghttp3/lib/nghttp3_tnode.h
@@ -41,10 +41,10 @@ typedef struct nghttp3_tnode {
int64_t id;
uint64_t cycle;
/* pri is a stream priority produced by nghttp3_pri_to_uint8. */
- uint8_t pri;
+ nghttp3_pri pri;
} nghttp3_tnode;
-void nghttp3_tnode_init(nghttp3_tnode *tnode, int64_t id, uint8_t pri);
+void nghttp3_tnode_init(nghttp3_tnode *tnode, int64_t id);
void nghttp3_tnode_free(nghttp3_tnode *tnode);