deps: update to nghttp2 1.33.0
Refs: https://github.com/nghttp2/nghttp2/releases/tag/v1.33.0 PR-URL: https://github.com/nodejs/node/pull/22649 Reviewed-By: Colin Ihrig <cjihrig@gmail.com> Reviewed-By: Matteo Collina <matteo.collina@gmail.com> Reviewed-By: Trivikram Kamat <trivikr.dev@gmail.com>
This commit is contained in:
parent
b4f5cdc6c4
commit
e007166009
142
deps/nghttp2/lib/includes/nghttp2/nghttp2.h
vendored
142
deps/nghttp2/lib/includes/nghttp2/nghttp2.h
vendored
@ -28,7 +28,7 @@
|
|||||||
/* Define WIN32 when build target is Win32 API (borrowed from
|
/* Define WIN32 when build target is Win32 API (borrowed from
|
||||||
libcurl) */
|
libcurl) */
|
||||||
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
|
||||||
#define WIN32
|
# define WIN32
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
@ -40,9 +40,9 @@ extern "C" {
|
|||||||
/* MSVC < 2013 does not have inttypes.h because it is not C99
|
/* MSVC < 2013 does not have inttypes.h because it is not C99
|
||||||
compliant. See compiler macros and version number in
|
compliant. See compiler macros and version number in
|
||||||
https://sourceforge.net/p/predef/wiki/Compilers/ */
|
https://sourceforge.net/p/predef/wiki/Compilers/ */
|
||||||
#include <stdint.h>
|
# include <stdint.h>
|
||||||
#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */
|
#else /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */
|
||||||
#include <inttypes.h>
|
# include <inttypes.h>
|
||||||
#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */
|
#endif /* !defined(_MSC_VER) || (_MSC_VER >= 1800) */
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
@ -50,20 +50,20 @@ extern "C" {
|
|||||||
#include <nghttp2/nghttp2ver.h>
|
#include <nghttp2/nghttp2ver.h>
|
||||||
|
|
||||||
#ifdef NGHTTP2_STATICLIB
|
#ifdef NGHTTP2_STATICLIB
|
||||||
#define NGHTTP2_EXTERN
|
# define NGHTTP2_EXTERN
|
||||||
#elif defined(WIN32)
|
#elif defined(WIN32)
|
||||||
#ifdef BUILDING_NGHTTP2
|
# ifdef BUILDING_NGHTTP2
|
||||||
#define NGHTTP2_EXTERN __declspec(dllexport)
|
# define NGHTTP2_EXTERN __declspec(dllexport)
|
||||||
#else /* !BUILDING_NGHTTP2 */
|
# else /* !BUILDING_NGHTTP2 */
|
||||||
#define NGHTTP2_EXTERN __declspec(dllimport)
|
# define NGHTTP2_EXTERN __declspec(dllimport)
|
||||||
#endif /* !BUILDING_NGHTTP2 */
|
# endif /* !BUILDING_NGHTTP2 */
|
||||||
#else /* !defined(WIN32) */
|
#else /* !defined(WIN32) */
|
||||||
#ifdef BUILDING_NGHTTP2
|
# ifdef BUILDING_NGHTTP2
|
||||||
#define NGHTTP2_EXTERN __attribute__((visibility("default")))
|
# define NGHTTP2_EXTERN __attribute__((visibility("default")))
|
||||||
#else /* !BUILDING_NGHTTP2 */
|
# else /* !BUILDING_NGHTTP2 */
|
||||||
#define NGHTTP2_EXTERN
|
# define NGHTTP2_EXTERN
|
||||||
#endif /* !BUILDING_NGHTTP2 */
|
# endif /* !BUILDING_NGHTTP2 */
|
||||||
#endif /* !defined(WIN32) */
|
#endif /* !defined(WIN32) */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @macro
|
* @macro
|
||||||
@ -611,7 +611,12 @@ typedef enum {
|
|||||||
* The ALTSVC frame, which is defined in `RFC 7383
|
* The ALTSVC frame, which is defined in `RFC 7383
|
||||||
* <https://tools.ietf.org/html/rfc7838#section-4>`_.
|
* <https://tools.ietf.org/html/rfc7838#section-4>`_.
|
||||||
*/
|
*/
|
||||||
NGHTTP2_ALTSVC = 0x0a
|
NGHTTP2_ALTSVC = 0x0a,
|
||||||
|
/**
|
||||||
|
* The ORIGIN frame, which is defined by `RFC 8336
|
||||||
|
* <https://tools.ietf.org/html/rfc8336>`_.
|
||||||
|
*/
|
||||||
|
NGHTTP2_ORIGIN = 0x0c
|
||||||
} nghttp2_frame_type;
|
} nghttp2_frame_type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2473,15 +2478,15 @@ nghttp2_option_set_no_auto_window_update(nghttp2_option *option, int val);
|
|||||||
*
|
*
|
||||||
* This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of
|
* This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of
|
||||||
* remote endpoint as if it is received in SETTINGS frame. Without
|
* remote endpoint as if it is received in SETTINGS frame. Without
|
||||||
* specifying this option, before the local endpoint receives
|
* specifying this option, the maximum number of outgoing concurrent
|
||||||
* SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote
|
* streams is initially limited to 100 to avoid issues when the local
|
||||||
* endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may
|
* endpoint submits lots of requests before receiving initial SETTINGS
|
||||||
* cause problem if local endpoint submits lots of requests initially
|
* frame from the remote endpoint, since sending them at once to the
|
||||||
* and sending them at once to the remote peer may lead to the
|
* remote endpoint could lead to rejection of some of the requests.
|
||||||
* rejection of some requests. Specifying this option to the sensible
|
* This value will be overwritten when the local endpoint receives
|
||||||
* value, say 100, may avoid this kind of issue. This value will be
|
* initial SETTINGS frame from the remote endpoint, either to the
|
||||||
* overwritten if the local endpoint receives
|
* value advertised in SETTINGS_MAX_CONCURRENT_STREAMS or to the
|
||||||
* SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint.
|
* default value (unlimited) if none was advertised.
|
||||||
*/
|
*/
|
||||||
NGHTTP2_EXTERN void
|
NGHTTP2_EXTERN void
|
||||||
nghttp2_option_set_peer_max_concurrent_streams(nghttp2_option *option,
|
nghttp2_option_set_peer_max_concurrent_streams(nghttp2_option *option,
|
||||||
@ -3797,10 +3802,13 @@ nghttp2_priority_spec_check_default(const nghttp2_priority_spec *pri_spec);
|
|||||||
* .. warning::
|
* .. warning::
|
||||||
*
|
*
|
||||||
* This function returns assigned stream ID if it succeeds. But
|
* This function returns assigned stream ID if it succeeds. But
|
||||||
* that stream is not opened yet. The application must not submit
|
* that stream is not created yet. The application must not submit
|
||||||
* frame to that stream ID before
|
* frame to that stream ID before
|
||||||
* :type:`nghttp2_before_frame_send_callback` is called for this
|
* :type:`nghttp2_before_frame_send_callback` is called for this
|
||||||
* frame.
|
* frame. This means `nghttp2_session_get_stream_user_data()` does
|
||||||
|
* not work before the callback. But
|
||||||
|
* `nghttp2_session_set_stream_user_data()` handles this situation
|
||||||
|
* specially, and it can set data to a stream during this period.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
NGHTTP2_EXTERN int32_t nghttp2_submit_request(
|
NGHTTP2_EXTERN int32_t nghttp2_submit_request(
|
||||||
@ -4516,8 +4524,7 @@ typedef struct {
|
|||||||
* Submits ALTSVC frame.
|
* Submits ALTSVC frame.
|
||||||
*
|
*
|
||||||
* ALTSVC frame is a non-critical extension to HTTP/2, and defined in
|
* ALTSVC frame is a non-critical extension to HTTP/2, and defined in
|
||||||
* is defined in `RFC 7383
|
* `RFC 7383 <https://tools.ietf.org/html/rfc7838#section-4>`_.
|
||||||
* <https://tools.ietf.org/html/rfc7838#section-4>`_.
|
|
||||||
*
|
*
|
||||||
* The |flags| is currently ignored and should be
|
* The |flags| is currently ignored and should be
|
||||||
* :enum:`NGHTTP2_FLAG_NONE`.
|
* :enum:`NGHTTP2_FLAG_NONE`.
|
||||||
@ -4551,6 +4558,81 @@ NGHTTP2_EXTERN int nghttp2_submit_altsvc(nghttp2_session *session,
|
|||||||
const uint8_t *field_value,
|
const uint8_t *field_value,
|
||||||
size_t field_value_len);
|
size_t field_value_len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct
|
||||||
|
*
|
||||||
|
* The single entry of an origin.
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* The pointer to origin. No validation is made against this field
|
||||||
|
* by the library. This is not necessarily NULL-terminated.
|
||||||
|
*/
|
||||||
|
uint8_t *origin;
|
||||||
|
/**
|
||||||
|
* The length of the |origin|.
|
||||||
|
*/
|
||||||
|
size_t origin_len;
|
||||||
|
} nghttp2_origin_entry;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @struct
|
||||||
|
*
|
||||||
|
* The payload of ORIGIN frame. ORIGIN frame is a non-critical
|
||||||
|
* extension to HTTP/2 and defined by `RFC 8336
|
||||||
|
* <https://tools.ietf.org/html/rfc8336>`_.
|
||||||
|
*
|
||||||
|
* If this frame is received, and
|
||||||
|
* `nghttp2_option_set_user_recv_extension_type()` is not set, and
|
||||||
|
* `nghttp2_option_set_builtin_recv_extension_type()` is set for
|
||||||
|
* :enum:`NGHTTP2_ORIGIN`, ``nghttp2_extension.payload`` will point to
|
||||||
|
* this struct.
|
||||||
|
*
|
||||||
|
* It has the following members:
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
/**
|
||||||
|
* The number of origins contained in |ov|.
|
||||||
|
*/
|
||||||
|
size_t nov;
|
||||||
|
/**
|
||||||
|
* The pointer to the array of origins contained in ORIGIN frame.
|
||||||
|
*/
|
||||||
|
nghttp2_origin_entry *ov;
|
||||||
|
} nghttp2_ext_origin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function
|
||||||
|
*
|
||||||
|
* Submits ORIGIN frame.
|
||||||
|
*
|
||||||
|
* ORIGIN frame is a non-critical extension to HTTP/2 and defined by
|
||||||
|
* `RFC 8336 <https://tools.ietf.org/html/rfc8336>`_.
|
||||||
|
*
|
||||||
|
* The |flags| is currently ignored and should be
|
||||||
|
* :enum:`NGHTTP2_FLAG_NONE`.
|
||||||
|
*
|
||||||
|
* The |ov| points to the array of origins. The |nov| specifies the
|
||||||
|
* number of origins included in |ov|. This function creates copies
|
||||||
|
* of all elements in |ov|.
|
||||||
|
*
|
||||||
|
* The ORIGIN frame is only usable by a server. If this function is
|
||||||
|
* invoked with client side session, this function returns
|
||||||
|
* :enum:`NGHTTP2_ERR_INVALID_STATE`.
|
||||||
|
*
|
||||||
|
* :enum:`NGHTTP2_ERR_NOMEM`
|
||||||
|
* Out of memory
|
||||||
|
* :enum:`NGHTTP2_ERR_INVALID_STATE`
|
||||||
|
* The function is called from client side session.
|
||||||
|
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
|
||||||
|
* There are too many origins, or an origin is too large to fit
|
||||||
|
* into a default frame payload.
|
||||||
|
*/
|
||||||
|
NGHTTP2_EXTERN int nghttp2_submit_origin(nghttp2_session *session,
|
||||||
|
uint8_t flags,
|
||||||
|
const nghttp2_origin_entry *ov,
|
||||||
|
size_t nov);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @function
|
* @function
|
||||||
*
|
*
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
* @macro
|
* @macro
|
||||||
* Version number of the nghttp2 library release
|
* Version number of the nghttp2 library release
|
||||||
*/
|
*/
|
||||||
#define NGHTTP2_VERSION "1.32.0"
|
#define NGHTTP2_VERSION "1.33.0"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @macro
|
* @macro
|
||||||
@ -37,6 +37,6 @@
|
|||||||
* release. This is a 24 bit number with 8 bits for major number, 8 bits
|
* release. This is a 24 bit number with 8 bits for major number, 8 bits
|
||||||
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
|
* for minor and 8 bits for patch. Version 1.2.3 becomes 0x010203.
|
||||||
*/
|
*/
|
||||||
#define NGHTTP2_VERSION_NUM 0x012000
|
#define NGHTTP2_VERSION_NUM 0x012100
|
||||||
|
|
||||||
#endif /* NGHTTP2VER_H */
|
#endif /* NGHTTP2VER_H */
|
||||||
|
2
deps/nghttp2/lib/nghttp2_buf.h
vendored
2
deps/nghttp2/lib/nghttp2_buf.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_BUF_H
|
#define NGHTTP2_BUF_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_callbacks.h
vendored
2
deps/nghttp2/lib/nghttp2_callbacks.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_CALLBACKS_H
|
#define NGHTTP2_CALLBACKS_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
10
deps/nghttp2/lib/nghttp2_debug.h
vendored
10
deps/nghttp2/lib/nghttp2_debug.h
vendored
@ -26,18 +26,18 @@
|
|||||||
#define NGHTTP2_DEBUG_H
|
#define NGHTTP2_DEBUG_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
|
||||||
#ifdef DEBUGBUILD
|
#ifdef DEBUGBUILD
|
||||||
#define DEBUGF(...) nghttp2_debug_vprintf(__VA_ARGS__)
|
# define DEBUGF(...) nghttp2_debug_vprintf(__VA_ARGS__)
|
||||||
void nghttp2_debug_vprintf(const char *format, ...);
|
void nghttp2_debug_vprintf(const char *format, ...);
|
||||||
#else
|
#else
|
||||||
#define DEBUGF(...) \
|
# define DEBUGF(...) \
|
||||||
do { \
|
do { \
|
||||||
} while (0)
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* NGHTTP2_DEBUG_H */
|
#endif /* NGHTTP2_DEBUG_H */
|
||||||
|
130
deps/nghttp2/lib/nghttp2_frame.c
vendored
130
deps/nghttp2/lib/nghttp2_frame.c
vendored
@ -223,6 +223,36 @@ void nghttp2_frame_altsvc_free(nghttp2_extension *frame, nghttp2_mem *mem) {
|
|||||||
nghttp2_mem_free(mem, altsvc->origin);
|
nghttp2_mem_free(mem, altsvc->origin);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nghttp2_frame_origin_init(nghttp2_extension *frame,
|
||||||
|
nghttp2_origin_entry *ov, size_t nov) {
|
||||||
|
nghttp2_ext_origin *origin;
|
||||||
|
size_t payloadlen = 0;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
for (i = 0; i < nov; ++i) {
|
||||||
|
payloadlen += 2 + ov[i].origin_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
nghttp2_frame_hd_init(&frame->hd, payloadlen, NGHTTP2_ORIGIN,
|
||||||
|
NGHTTP2_FLAG_NONE, 0);
|
||||||
|
|
||||||
|
origin = frame->payload;
|
||||||
|
origin->ov = ov;
|
||||||
|
origin->nov = nov;
|
||||||
|
}
|
||||||
|
|
||||||
|
void nghttp2_frame_origin_free(nghttp2_extension *frame, nghttp2_mem *mem) {
|
||||||
|
nghttp2_ext_origin *origin;
|
||||||
|
|
||||||
|
origin = frame->payload;
|
||||||
|
if (origin == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
/* We use the same buffer for all resources pointed by the field of
|
||||||
|
origin directly or indirectly. */
|
||||||
|
nghttp2_mem_free(mem, origin->ov);
|
||||||
|
}
|
||||||
|
|
||||||
size_t nghttp2_frame_priority_len(uint8_t flags) {
|
size_t nghttp2_frame_priority_len(uint8_t flags) {
|
||||||
if (flags & NGHTTP2_FLAG_PRIORITY) {
|
if (flags & NGHTTP2_FLAG_PRIORITY) {
|
||||||
return NGHTTP2_PRIORITY_SPECLEN;
|
return NGHTTP2_PRIORITY_SPECLEN;
|
||||||
@ -746,6 +776,106 @@ int nghttp2_frame_unpack_altsvc_payload2(nghttp2_extension *frame,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nghttp2_frame_pack_origin(nghttp2_bufs *bufs, nghttp2_extension *frame) {
|
||||||
|
nghttp2_buf *buf;
|
||||||
|
nghttp2_ext_origin *origin;
|
||||||
|
nghttp2_origin_entry *orig;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
origin = frame->payload;
|
||||||
|
|
||||||
|
buf = &bufs->head->buf;
|
||||||
|
|
||||||
|
if (nghttp2_buf_avail(buf) < frame->hd.length) {
|
||||||
|
return NGHTTP2_ERR_FRAME_SIZE_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
|
buf->pos -= NGHTTP2_FRAME_HDLEN;
|
||||||
|
|
||||||
|
nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
|
||||||
|
|
||||||
|
for (i = 0; i < origin->nov; ++i) {
|
||||||
|
orig = &origin->ov[i];
|
||||||
|
nghttp2_put_uint16be(buf->last, (uint16_t)orig->origin_len);
|
||||||
|
buf->last += 2;
|
||||||
|
buf->last = nghttp2_cpymem(buf->last, orig->origin, orig->origin_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(nghttp2_buf_len(buf) == NGHTTP2_FRAME_HDLEN + frame->hd.length);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int nghttp2_frame_unpack_origin_payload(nghttp2_extension *frame,
|
||||||
|
const uint8_t *payload,
|
||||||
|
size_t payloadlen, nghttp2_mem *mem) {
|
||||||
|
nghttp2_ext_origin *origin;
|
||||||
|
const uint8_t *p, *end;
|
||||||
|
uint8_t *dst;
|
||||||
|
size_t originlen;
|
||||||
|
nghttp2_origin_entry *ov;
|
||||||
|
size_t nov = 0;
|
||||||
|
size_t len = 0;
|
||||||
|
|
||||||
|
origin = frame->payload;
|
||||||
|
p = payload;
|
||||||
|
end = p + payloadlen;
|
||||||
|
|
||||||
|
for (; p != end;) {
|
||||||
|
if (end - p < 2) {
|
||||||
|
return NGHTTP2_ERR_FRAME_SIZE_ERROR;
|
||||||
|
}
|
||||||
|
originlen = nghttp2_get_uint16(p);
|
||||||
|
p += 2;
|
||||||
|
if (originlen == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (originlen > (size_t)(end - p)) {
|
||||||
|
return NGHTTP2_ERR_FRAME_SIZE_ERROR;
|
||||||
|
}
|
||||||
|
p += originlen;
|
||||||
|
/* 1 for terminal NULL */
|
||||||
|
len += originlen + 1;
|
||||||
|
++nov;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nov == 0) {
|
||||||
|
origin->ov = NULL;
|
||||||
|
origin->nov = 0;
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
len += nov * sizeof(nghttp2_origin_entry);
|
||||||
|
|
||||||
|
ov = nghttp2_mem_malloc(mem, len);
|
||||||
|
if (ov == NULL) {
|
||||||
|
return NGHTTP2_ERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
origin->ov = ov;
|
||||||
|
origin->nov = nov;
|
||||||
|
|
||||||
|
dst = (uint8_t *)ov + nov * sizeof(nghttp2_origin_entry);
|
||||||
|
p = payload;
|
||||||
|
|
||||||
|
for (; p != end;) {
|
||||||
|
originlen = nghttp2_get_uint16(p);
|
||||||
|
p += 2;
|
||||||
|
if (originlen == 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
ov->origin = dst;
|
||||||
|
ov->origin_len = originlen;
|
||||||
|
dst = nghttp2_cpymem(dst, p, originlen);
|
||||||
|
*dst++ = '\0';
|
||||||
|
p += originlen;
|
||||||
|
++ov;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
nghttp2_settings_entry *nghttp2_frame_iv_copy(const nghttp2_settings_entry *iv,
|
nghttp2_settings_entry *nghttp2_frame_iv_copy(const nghttp2_settings_entry *iv,
|
||||||
size_t niv, nghttp2_mem *mem) {
|
size_t niv, nghttp2_mem *mem) {
|
||||||
nghttp2_settings_entry *iv_copy;
|
nghttp2_settings_entry *iv_copy;
|
||||||
|
51
deps/nghttp2/lib/nghttp2_frame.h
vendored
51
deps/nghttp2/lib/nghttp2_frame.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_FRAME_H
|
#define NGHTTP2_FRAME_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
@ -72,6 +72,7 @@
|
|||||||
/* Union of extension frame payload */
|
/* Union of extension frame payload */
|
||||||
typedef union {
|
typedef union {
|
||||||
nghttp2_ext_altsvc altsvc;
|
nghttp2_ext_altsvc altsvc;
|
||||||
|
nghttp2_ext_origin origin;
|
||||||
} nghttp2_ext_frame_payload;
|
} nghttp2_ext_frame_payload;
|
||||||
|
|
||||||
void nghttp2_frame_pack_frame_hd(uint8_t *buf, const nghttp2_frame_hd *hd);
|
void nghttp2_frame_pack_frame_hd(uint8_t *buf, const nghttp2_frame_hd *hd);
|
||||||
@ -392,6 +393,36 @@ int nghttp2_frame_unpack_altsvc_payload2(nghttp2_extension *frame,
|
|||||||
const uint8_t *payload,
|
const uint8_t *payload,
|
||||||
size_t payloadlen, nghttp2_mem *mem);
|
size_t payloadlen, nghttp2_mem *mem);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Packs ORIGIN frame |frame| in wire frame format and store it in
|
||||||
|
* |bufs|.
|
||||||
|
*
|
||||||
|
* The caller must make sure that nghttp2_bufs_reset(bufs) is called
|
||||||
|
* before calling this function.
|
||||||
|
*
|
||||||
|
* This function returns 0 if it succeeds, or one of the following
|
||||||
|
* negative error codes:
|
||||||
|
*
|
||||||
|
* NGHTTP2_ERR_FRAME_SIZE_ERROR
|
||||||
|
* The length of the frame is too large.
|
||||||
|
*/
|
||||||
|
int nghttp2_frame_pack_origin(nghttp2_bufs *bufs, nghttp2_extension *ext);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Unpacks ORIGIN wire format into |frame|. The |payload| of length
|
||||||
|
* |payloadlen| contains the frame payload.
|
||||||
|
*
|
||||||
|
* This function returns 0 if it succeeds, or one of the following
|
||||||
|
* negative error codes:
|
||||||
|
*
|
||||||
|
* NGHTTP2_ERR_NOMEM
|
||||||
|
* Out of memory.
|
||||||
|
* NGHTTP2_ERR_FRAME_SIZE_ERROR
|
||||||
|
* The payload is too small.
|
||||||
|
*/
|
||||||
|
int nghttp2_frame_unpack_origin_payload(nghttp2_extension *frame,
|
||||||
|
const uint8_t *payload,
|
||||||
|
size_t payloadlen, nghttp2_mem *mem);
|
||||||
/*
|
/*
|
||||||
* Initializes HEADERS frame |frame| with given values. |frame| takes
|
* Initializes HEADERS frame |frame| with given values. |frame| takes
|
||||||
* ownership of |nva|, so caller must not free it. If |stream_id| is
|
* ownership of |nva|, so caller must not free it. If |stream_id| is
|
||||||
@ -489,6 +520,24 @@ void nghttp2_frame_altsvc_init(nghttp2_extension *frame, int32_t stream_id,
|
|||||||
*/
|
*/
|
||||||
void nghttp2_frame_altsvc_free(nghttp2_extension *frame, nghttp2_mem *mem);
|
void nghttp2_frame_altsvc_free(nghttp2_extension *frame, nghttp2_mem *mem);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initializes ORIGIN frame |frame| with given values. This function
|
||||||
|
* assumes that frame->payload points to nghttp2_ext_origin object.
|
||||||
|
* Also |ov| and the memory pointed by the field of its elements are
|
||||||
|
* allocated in single buffer, starting with |ov|. On success, this
|
||||||
|
* function takes ownership of |ov|, so caller must not free it.
|
||||||
|
*/
|
||||||
|
void nghttp2_frame_origin_init(nghttp2_extension *frame,
|
||||||
|
nghttp2_origin_entry *ov, size_t nov);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Frees up resources under |frame|. This function does not free
|
||||||
|
* nghttp2_ext_origin object pointed by frame->payload. This function
|
||||||
|
* only frees nghttp2_ext_origin.ov. Therefore, other fields must be
|
||||||
|
* allocated in the same buffer with ov.
|
||||||
|
*/
|
||||||
|
void nghttp2_frame_origin_free(nghttp2_extension *frame, nghttp2_mem *mem);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Returns the number of padding bytes after payload. The total
|
* Returns the number of padding bytes after payload. The total
|
||||||
* padding length is given in the |padlen|. The returned value does
|
* padding length is given in the |padlen|. The returned value does
|
||||||
|
2
deps/nghttp2/lib/nghttp2_hd.h
vendored
2
deps/nghttp2/lib/nghttp2_hd.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_HD_H
|
#define NGHTTP2_HD_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_hd_huffman.h
vendored
2
deps/nghttp2/lib/nghttp2_hd_huffman.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_HD_HUFFMAN_H
|
#define NGHTTP2_HD_HUFFMAN_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_helper.h
vendored
2
deps/nghttp2/lib/nghttp2_helper.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_HELPER_H
|
#define NGHTTP2_HELPER_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_http.h
vendored
2
deps/nghttp2/lib/nghttp2_http.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_HTTP_H
|
#define NGHTTP2_HTTP_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_int.h
vendored
2
deps/nghttp2/lib/nghttp2_int.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_INT_H
|
#define NGHTTP2_INT_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_map.h
vendored
2
deps/nghttp2/lib/nghttp2_map.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_MAP_H
|
#define NGHTTP2_MAP_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_mem.h
vendored
2
deps/nghttp2/lib/nghttp2_mem.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_MEM_H
|
#define NGHTTP2_MEM_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
16
deps/nghttp2/lib/nghttp2_net.h
vendored
16
deps/nghttp2/lib/nghttp2_net.h
vendored
@ -26,15 +26,15 @@
|
|||||||
#define NGHTTP2_NET_H
|
#define NGHTTP2_NET_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#ifdef HAVE_ARPA_INET_H
|
#ifdef HAVE_ARPA_INET_H
|
||||||
#include <arpa/inet.h>
|
# include <arpa/inet.h>
|
||||||
#endif /* HAVE_ARPA_INET_H */
|
#endif /* HAVE_ARPA_INET_H */
|
||||||
|
|
||||||
#ifdef HAVE_NETINET_IN_H
|
#ifdef HAVE_NETINET_IN_H
|
||||||
#include <netinet/in.h>
|
# include <netinet/in.h>
|
||||||
#endif /* HAVE_NETINET_IN_H */
|
#endif /* HAVE_NETINET_IN_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
@ -44,11 +44,11 @@
|
|||||||
define inline functions for those function so that we don't have
|
define inline functions for those function so that we don't have
|
||||||
dependeny on that lib. */
|
dependeny on that lib. */
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
# ifdef _MSC_VER
|
||||||
#define STIN static __inline
|
# define STIN static __inline
|
||||||
#else
|
# else
|
||||||
#define STIN static inline
|
# define STIN static inline
|
||||||
#endif
|
# endif
|
||||||
|
|
||||||
STIN uint32_t htonl(uint32_t hostlong) {
|
STIN uint32_t htonl(uint32_t hostlong) {
|
||||||
uint32_t res;
|
uint32_t res;
|
||||||
|
2
deps/nghttp2/lib/nghttp2_npn.h
vendored
2
deps/nghttp2/lib/nghttp2_npn.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_NPN_H
|
#define NGHTTP2_NPN_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
4
deps/nghttp2/lib/nghttp2_option.c
vendored
4
deps/nghttp2/lib/nghttp2_option.c
vendored
@ -86,6 +86,10 @@ void nghttp2_option_set_builtin_recv_extension_type(nghttp2_option *option,
|
|||||||
option->opt_set_mask |= NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES;
|
option->opt_set_mask |= NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES;
|
||||||
option->builtin_recv_ext_types |= NGHTTP2_TYPEMASK_ALTSVC;
|
option->builtin_recv_ext_types |= NGHTTP2_TYPEMASK_ALTSVC;
|
||||||
return;
|
return;
|
||||||
|
case NGHTTP2_ORIGIN:
|
||||||
|
option->opt_set_mask |= NGHTTP2_OPT_BUILTIN_RECV_EXT_TYPES;
|
||||||
|
option->builtin_recv_ext_types |= NGHTTP2_TYPEMASK_ORIGIN;
|
||||||
|
return;
|
||||||
default:
|
default:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
2
deps/nghttp2/lib/nghttp2_option.h
vendored
2
deps/nghttp2/lib/nghttp2_option.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_OPTION_H
|
#define NGHTTP2_OPTION_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
3
deps/nghttp2/lib/nghttp2_outbound_item.c
vendored
3
deps/nghttp2/lib/nghttp2_outbound_item.c
vendored
@ -86,6 +86,9 @@ void nghttp2_outbound_item_free(nghttp2_outbound_item *item, nghttp2_mem *mem) {
|
|||||||
case NGHTTP2_ALTSVC:
|
case NGHTTP2_ALTSVC:
|
||||||
nghttp2_frame_altsvc_free(&frame->ext, mem);
|
nghttp2_frame_altsvc_free(&frame->ext, mem);
|
||||||
break;
|
break;
|
||||||
|
case NGHTTP2_ORIGIN:
|
||||||
|
nghttp2_frame_origin_free(&frame->ext, mem);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
assert(0);
|
assert(0);
|
||||||
break;
|
break;
|
||||||
|
2
deps/nghttp2/lib/nghttp2_outbound_item.h
vendored
2
deps/nghttp2/lib/nghttp2_outbound_item.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_OUTBOUND_ITEM_H
|
#define NGHTTP2_OUTBOUND_ITEM_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_pq.h
vendored
2
deps/nghttp2/lib/nghttp2_pq.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_PQ_H
|
#define NGHTTP2_PQ_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_priority_spec.h
vendored
2
deps/nghttp2/lib/nghttp2_priority_spec.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_PRIORITY_SPEC_H
|
#define NGHTTP2_PRIORITY_SPEC_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_queue.h
vendored
2
deps/nghttp2/lib/nghttp2_queue.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_QUEUE_H
|
#define NGHTTP2_QUEUE_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include "config.h"
|
# include "config.h"
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_rcbuf.h
vendored
2
deps/nghttp2/lib/nghttp2_rcbuf.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_RCBUF_H
|
#define NGHTTP2_RCBUF_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
161
deps/nghttp2/lib/nghttp2_session.c
vendored
161
deps/nghttp2/lib/nghttp2_session.c
vendored
@ -348,6 +348,12 @@ static void session_inbound_frame_reset(nghttp2_session *session) {
|
|||||||
}
|
}
|
||||||
nghttp2_frame_altsvc_free(&iframe->frame.ext, mem);
|
nghttp2_frame_altsvc_free(&iframe->frame.ext, mem);
|
||||||
break;
|
break;
|
||||||
|
case NGHTTP2_ORIGIN:
|
||||||
|
if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN) == 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
nghttp2_frame_origin_free(&iframe->frame.ext, mem);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1749,6 +1755,13 @@ static int session_predicate_altsvc_send(nghttp2_session *session,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int session_predicate_origin_send(nghttp2_session *session) {
|
||||||
|
if (session_is_closing(session)) {
|
||||||
|
return NGHTTP2_ERR_SESSION_CLOSING;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* Take into account settings max frame size and both connection-level
|
/* Take into account settings max frame size and both connection-level
|
||||||
flow control here */
|
flow control here */
|
||||||
static ssize_t
|
static ssize_t
|
||||||
@ -2280,6 +2293,18 @@ static int session_prep_frame(nghttp2_session *session,
|
|||||||
|
|
||||||
nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
|
nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
case NGHTTP2_ORIGIN:
|
||||||
|
rv = session_predicate_origin_send(session);
|
||||||
|
if (rv != 0) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext);
|
||||||
|
if (rv != 0) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
default:
|
default:
|
||||||
/* Unreachable here */
|
/* Unreachable here */
|
||||||
@ -4385,6 +4410,12 @@ int nghttp2_session_on_settings_received(nghttp2_session *session,
|
|||||||
return session_call_on_frame_received(session, frame);
|
return session_call_on_frame_received(session, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!session->remote_settings_received) {
|
||||||
|
session->remote_settings.max_concurrent_streams =
|
||||||
|
NGHTTP2_DEFAULT_MAX_CONCURRENT_STREAMS;
|
||||||
|
session->remote_settings_received = 1;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < frame->settings.niv; ++i) {
|
for (i = 0; i < frame->settings.niv; ++i) {
|
||||||
nghttp2_settings_entry *entry = &frame->settings.iv[i];
|
nghttp2_settings_entry *entry = &frame->settings.iv[i];
|
||||||
|
|
||||||
@ -4821,6 +4852,11 @@ int nghttp2_session_on_altsvc_received(nghttp2_session *session,
|
|||||||
return session_call_on_frame_received(session, frame);
|
return session_call_on_frame_received(session, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nghttp2_session_on_origin_received(nghttp2_session *session,
|
||||||
|
nghttp2_frame *frame) {
|
||||||
|
return session_call_on_frame_received(session, frame);
|
||||||
|
}
|
||||||
|
|
||||||
static int session_process_altsvc_frame(nghttp2_session *session) {
|
static int session_process_altsvc_frame(nghttp2_session *session) {
|
||||||
nghttp2_inbound_frame *iframe = &session->iframe;
|
nghttp2_inbound_frame *iframe = &session->iframe;
|
||||||
nghttp2_frame *frame = &iframe->frame;
|
nghttp2_frame *frame = &iframe->frame;
|
||||||
@ -4836,6 +4872,25 @@ static int session_process_altsvc_frame(nghttp2_session *session) {
|
|||||||
return nghttp2_session_on_altsvc_received(session, frame);
|
return nghttp2_session_on_altsvc_received(session, frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int session_process_origin_frame(nghttp2_session *session) {
|
||||||
|
nghttp2_inbound_frame *iframe = &session->iframe;
|
||||||
|
nghttp2_frame *frame = &iframe->frame;
|
||||||
|
nghttp2_mem *mem = &session->mem;
|
||||||
|
int rv;
|
||||||
|
|
||||||
|
rv = nghttp2_frame_unpack_origin_payload(&frame->ext, iframe->lbuf.pos,
|
||||||
|
nghttp2_buf_len(&iframe->lbuf), mem);
|
||||||
|
if (rv != 0) {
|
||||||
|
if (nghttp2_is_fatal(rv)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
/* Ignore ORIGIN frame which cannot be parsed. */
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nghttp2_session_on_origin_received(session, frame);
|
||||||
|
}
|
||||||
|
|
||||||
static int session_process_extension_frame(nghttp2_session *session) {
|
static int session_process_extension_frame(nghttp2_session *session) {
|
||||||
int rv;
|
int rv;
|
||||||
nghttp2_inbound_frame *iframe = &session->iframe;
|
nghttp2_inbound_frame *iframe = &session->iframe;
|
||||||
@ -5746,6 +5801,42 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
|
|||||||
iframe->state = NGHTTP2_IB_READ_NBYTE;
|
iframe->state = NGHTTP2_IB_READ_NBYTE;
|
||||||
inbound_frame_set_mark(iframe, 2);
|
inbound_frame_set_mark(iframe, 2);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NGHTTP2_ORIGIN:
|
||||||
|
if (!(session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN)) {
|
||||||
|
busy = 1;
|
||||||
|
iframe->state = NGHTTP2_IB_IGN_PAYLOAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUGF("recv: ORIGIN\n");
|
||||||
|
|
||||||
|
iframe->frame.ext.payload = &iframe->ext_frame_payload.origin;
|
||||||
|
|
||||||
|
if (session->server || iframe->frame.hd.stream_id ||
|
||||||
|
(iframe->frame.hd.flags & 0xf0)) {
|
||||||
|
busy = 1;
|
||||||
|
iframe->state = NGHTTP2_IB_IGN_PAYLOAD;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
|
||||||
|
|
||||||
|
if (iframe->payloadleft) {
|
||||||
|
iframe->raw_lbuf = nghttp2_mem_malloc(mem, iframe->payloadleft);
|
||||||
|
|
||||||
|
if (iframe->raw_lbuf == NULL) {
|
||||||
|
return NGHTTP2_ERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
nghttp2_buf_wrap_init(&iframe->lbuf, iframe->raw_lbuf,
|
||||||
|
iframe->payloadleft);
|
||||||
|
} else {
|
||||||
|
busy = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iframe->state = NGHTTP2_IB_READ_ORIGIN_PAYLOAD;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
busy = 1;
|
busy = 1;
|
||||||
@ -6583,7 +6674,6 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
|
|||||||
DEBUGF("recv: [IB_READ_ALTSVC_PAYLOAD]\n");
|
DEBUGF("recv: [IB_READ_ALTSVC_PAYLOAD]\n");
|
||||||
|
|
||||||
readlen = inbound_frame_payload_readlen(iframe, in, last);
|
readlen = inbound_frame_payload_readlen(iframe, in, last);
|
||||||
|
|
||||||
if (readlen > 0) {
|
if (readlen > 0) {
|
||||||
iframe->lbuf.last = nghttp2_cpymem(iframe->lbuf.last, in, readlen);
|
iframe->lbuf.last = nghttp2_cpymem(iframe->lbuf.last, in, readlen);
|
||||||
|
|
||||||
@ -6601,11 +6691,44 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
|
|||||||
}
|
}
|
||||||
|
|
||||||
rv = session_process_altsvc_frame(session);
|
rv = session_process_altsvc_frame(session);
|
||||||
|
if (nghttp2_is_fatal(rv)) {
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
session_inbound_frame_reset(session);
|
||||||
|
|
||||||
|
break;
|
||||||
|
case NGHTTP2_IB_READ_ORIGIN_PAYLOAD:
|
||||||
|
DEBUGF("recv: [IB_READ_ORIGIN_PAYLOAD]\n");
|
||||||
|
|
||||||
|
readlen = inbound_frame_payload_readlen(iframe, in, last);
|
||||||
|
|
||||||
|
if (readlen > 0) {
|
||||||
|
iframe->lbuf.last = nghttp2_cpymem(iframe->lbuf.last, in, readlen);
|
||||||
|
|
||||||
|
iframe->payloadleft -= readlen;
|
||||||
|
in += readlen;
|
||||||
|
}
|
||||||
|
|
||||||
|
DEBUGF("recv: readlen=%zu, payloadleft=%zu\n", readlen,
|
||||||
|
iframe->payloadleft);
|
||||||
|
|
||||||
|
if (iframe->payloadleft) {
|
||||||
|
assert(nghttp2_buf_avail(&iframe->lbuf) > 0);
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
rv = session_process_origin_frame(session);
|
||||||
|
|
||||||
if (nghttp2_is_fatal(rv)) {
|
if (nghttp2_is_fatal(rv)) {
|
||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (iframe->state == NGHTTP2_IB_IGN_ALL) {
|
||||||
|
return (ssize_t)inlen;
|
||||||
|
}
|
||||||
|
|
||||||
session_inbound_frame_reset(session);
|
session_inbound_frame_reset(session);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
@ -7085,12 +7208,42 @@ int nghttp2_session_set_stream_user_data(nghttp2_session *session,
|
|||||||
int32_t stream_id,
|
int32_t stream_id,
|
||||||
void *stream_user_data) {
|
void *stream_user_data) {
|
||||||
nghttp2_stream *stream;
|
nghttp2_stream *stream;
|
||||||
|
nghttp2_frame *frame;
|
||||||
|
nghttp2_outbound_item *item;
|
||||||
|
|
||||||
stream = nghttp2_session_get_stream(session, stream_id);
|
stream = nghttp2_session_get_stream(session, stream_id);
|
||||||
if (!stream) {
|
if (stream) {
|
||||||
|
stream->stream_user_data = stream_user_data;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (session->server || !nghttp2_session_is_my_stream_id(session, stream_id) ||
|
||||||
|
!nghttp2_outbound_queue_top(&session->ob_syn)) {
|
||||||
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
stream->stream_user_data = stream_user_data;
|
|
||||||
return 0;
|
frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
|
||||||
|
assert(frame->hd.type == NGHTTP2_HEADERS);
|
||||||
|
|
||||||
|
if (frame->hd.stream_id > stream_id ||
|
||||||
|
(uint32_t)stream_id >= session->next_stream_id) {
|
||||||
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (item = session->ob_syn.head; item; item = item->qnext) {
|
||||||
|
if (item->frame.hd.stream_id < stream_id) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item->frame.hd.stream_id > stream_id) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
item->aux_data.headers.stream_user_data = stream_user_data;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) {
|
int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) {
|
||||||
|
35
deps/nghttp2/lib/nghttp2_session.h
vendored
35
deps/nghttp2/lib/nghttp2_session.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_SESSION_H
|
#define NGHTTP2_SESSION_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
@ -61,7 +61,8 @@ typedef enum {
|
|||||||
*/
|
*/
|
||||||
typedef enum {
|
typedef enum {
|
||||||
NGHTTP2_TYPEMASK_NONE = 0,
|
NGHTTP2_TYPEMASK_NONE = 0,
|
||||||
NGHTTP2_TYPEMASK_ALTSVC = 1 << 0
|
NGHTTP2_TYPEMASK_ALTSVC = 1 << 0,
|
||||||
|
NGHTTP2_TYPEMASK_ORIGIN = 1 << 1
|
||||||
} nghttp2_typemask;
|
} nghttp2_typemask;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -121,6 +122,7 @@ typedef enum {
|
|||||||
NGHTTP2_IB_IGN_DATA,
|
NGHTTP2_IB_IGN_DATA,
|
||||||
NGHTTP2_IB_IGN_ALL,
|
NGHTTP2_IB_IGN_ALL,
|
||||||
NGHTTP2_IB_READ_ALTSVC_PAYLOAD,
|
NGHTTP2_IB_READ_ALTSVC_PAYLOAD,
|
||||||
|
NGHTTP2_IB_READ_ORIGIN_PAYLOAD,
|
||||||
NGHTTP2_IB_READ_EXTENSION_PAYLOAD
|
NGHTTP2_IB_READ_EXTENSION_PAYLOAD
|
||||||
} nghttp2_inbound_state;
|
} nghttp2_inbound_state;
|
||||||
|
|
||||||
@ -301,8 +303,10 @@ struct nghttp2_session {
|
|||||||
increased/decreased by submitting WINDOW_UPDATE. See
|
increased/decreased by submitting WINDOW_UPDATE. See
|
||||||
nghttp2_submit_window_update(). */
|
nghttp2_submit_window_update(). */
|
||||||
int32_t local_window_size;
|
int32_t local_window_size;
|
||||||
/* Settings value received from the remote endpoint. We just use ID
|
/* This flag is used to indicate that the local endpoint received initial
|
||||||
as index. The index = 0 is unused. */
|
SETTINGS frame from the remote endpoint. */
|
||||||
|
uint8_t remote_settings_received;
|
||||||
|
/* Settings value received from the remote endpoint. */
|
||||||
nghttp2_settings_storage remote_settings;
|
nghttp2_settings_storage remote_settings;
|
||||||
/* Settings value of the local endpoint. */
|
/* Settings value of the local endpoint. */
|
||||||
nghttp2_settings_storage local_settings;
|
nghttp2_settings_storage local_settings;
|
||||||
@ -698,7 +702,7 @@ int nghttp2_session_on_push_promise_received(nghttp2_session *session,
|
|||||||
* NGHTTP2_ERR_NOMEM
|
* NGHTTP2_ERR_NOMEM
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
* NGHTTP2_ERR_CALLBACK_FAILURE
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
* The callback function failed.
|
* The callback function failed.
|
||||||
* NGHTTP2_ERR_FLOODED
|
* NGHTTP2_ERR_FLOODED
|
||||||
* There are too many items in outbound queue, and this is most
|
* There are too many items in outbound queue, and this is most
|
||||||
* likely caused by misbehaviour of peer.
|
* likely caused by misbehaviour of peer.
|
||||||
@ -716,7 +720,7 @@ int nghttp2_session_on_ping_received(nghttp2_session *session,
|
|||||||
* NGHTTP2_ERR_NOMEM
|
* NGHTTP2_ERR_NOMEM
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
* NGHTTP2_ERR_CALLBACK_FAILURE
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
* The callback function failed.
|
* The callback function failed.
|
||||||
*/
|
*/
|
||||||
int nghttp2_session_on_goaway_received(nghttp2_session *session,
|
int nghttp2_session_on_goaway_received(nghttp2_session *session,
|
||||||
nghttp2_frame *frame);
|
nghttp2_frame *frame);
|
||||||
@ -731,7 +735,7 @@ int nghttp2_session_on_goaway_received(nghttp2_session *session,
|
|||||||
* NGHTTP2_ERR_NOMEM
|
* NGHTTP2_ERR_NOMEM
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
* NGHTTP2_ERR_CALLBACK_FAILURE
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
* The callback function failed.
|
* The callback function failed.
|
||||||
*/
|
*/
|
||||||
int nghttp2_session_on_window_update_received(nghttp2_session *session,
|
int nghttp2_session_on_window_update_received(nghttp2_session *session,
|
||||||
nghttp2_frame *frame);
|
nghttp2_frame *frame);
|
||||||
@ -744,11 +748,24 @@ int nghttp2_session_on_window_update_received(nghttp2_session *session,
|
|||||||
* negative error codes:
|
* negative error codes:
|
||||||
*
|
*
|
||||||
* NGHTTP2_ERR_CALLBACK_FAILURE
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
* The callback function failed.
|
* The callback function failed.
|
||||||
*/
|
*/
|
||||||
int nghttp2_session_on_altsvc_received(nghttp2_session *session,
|
int nghttp2_session_on_altsvc_received(nghttp2_session *session,
|
||||||
nghttp2_frame *frame);
|
nghttp2_frame *frame);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called when ORIGIN is received, assuming |frame| is properly
|
||||||
|
* initialized.
|
||||||
|
*
|
||||||
|
* This function returns 0 if it succeeds, or one of the following
|
||||||
|
* negative error codes:
|
||||||
|
*
|
||||||
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
|
* The callback function failed.
|
||||||
|
*/
|
||||||
|
int nghttp2_session_on_origin_received(nghttp2_session *session,
|
||||||
|
nghttp2_frame *frame);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Called when DATA is received, assuming |frame| is properly
|
* Called when DATA is received, assuming |frame| is properly
|
||||||
* initialized.
|
* initialized.
|
||||||
@ -759,7 +776,7 @@ int nghttp2_session_on_altsvc_received(nghttp2_session *session,
|
|||||||
* NGHTTP2_ERR_NOMEM
|
* NGHTTP2_ERR_NOMEM
|
||||||
* Out of memory.
|
* Out of memory.
|
||||||
* NGHTTP2_ERR_CALLBACK_FAILURE
|
* NGHTTP2_ERR_CALLBACK_FAILURE
|
||||||
* The callback function failed.
|
* The callback function failed.
|
||||||
*/
|
*/
|
||||||
int nghttp2_session_on_data_received(nghttp2_session *session,
|
int nghttp2_session_on_data_received(nghttp2_session *session,
|
||||||
nghttp2_frame *frame);
|
nghttp2_frame *frame);
|
||||||
|
2
deps/nghttp2/lib/nghttp2_stream.h
vendored
2
deps/nghttp2/lib/nghttp2_stream.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_STREAM_H
|
#define NGHTTP2_STREAM_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
83
deps/nghttp2/lib/nghttp2_submit.c
vendored
83
deps/nghttp2/lib/nghttp2_submit.c
vendored
@ -571,6 +571,89 @@ fail_item_malloc:
|
|||||||
return rv;
|
return rv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nghttp2_submit_origin(nghttp2_session *session, uint8_t flags,
|
||||||
|
const nghttp2_origin_entry *ov, size_t nov) {
|
||||||
|
nghttp2_mem *mem;
|
||||||
|
uint8_t *p;
|
||||||
|
nghttp2_outbound_item *item;
|
||||||
|
nghttp2_frame *frame;
|
||||||
|
nghttp2_ext_origin *origin;
|
||||||
|
nghttp2_origin_entry *ov_copy;
|
||||||
|
size_t len = 0;
|
||||||
|
size_t i;
|
||||||
|
int rv;
|
||||||
|
(void)flags;
|
||||||
|
|
||||||
|
mem = &session->mem;
|
||||||
|
|
||||||
|
if (!session->server) {
|
||||||
|
return NGHTTP2_ERR_INVALID_STATE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nov) {
|
||||||
|
for (i = 0; i < nov; ++i) {
|
||||||
|
len += ov[i].origin_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (2 * nov + len > NGHTTP2_MAX_PAYLOADLEN) {
|
||||||
|
return NGHTTP2_ERR_INVALID_ARGUMENT;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The last nov is added for terminal NULL character. */
|
||||||
|
ov_copy =
|
||||||
|
nghttp2_mem_malloc(mem, nov * sizeof(nghttp2_origin_entry) + len + nov);
|
||||||
|
if (ov_copy == NULL) {
|
||||||
|
return NGHTTP2_ERR_NOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
p = (uint8_t *)ov_copy + nov * sizeof(nghttp2_origin_entry);
|
||||||
|
|
||||||
|
for (i = 0; i < nov; ++i) {
|
||||||
|
ov_copy[i].origin = p;
|
||||||
|
ov_copy[i].origin_len = ov[i].origin_len;
|
||||||
|
p = nghttp2_cpymem(p, ov[i].origin, ov[i].origin_len);
|
||||||
|
*p++ = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
assert((size_t)(p - (uint8_t *)ov_copy) ==
|
||||||
|
nov * sizeof(nghttp2_origin_entry) + len + nov);
|
||||||
|
} else {
|
||||||
|
ov_copy = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
item = nghttp2_mem_malloc(mem, sizeof(nghttp2_outbound_item));
|
||||||
|
if (item == NULL) {
|
||||||
|
rv = NGHTTP2_ERR_NOMEM;
|
||||||
|
goto fail_item_malloc;
|
||||||
|
}
|
||||||
|
|
||||||
|
nghttp2_outbound_item_init(item);
|
||||||
|
|
||||||
|
item->aux_data.ext.builtin = 1;
|
||||||
|
|
||||||
|
origin = &item->ext_frame_payload.origin;
|
||||||
|
|
||||||
|
frame = &item->frame;
|
||||||
|
frame->ext.payload = origin;
|
||||||
|
|
||||||
|
nghttp2_frame_origin_init(&frame->ext, ov_copy, nov);
|
||||||
|
|
||||||
|
rv = nghttp2_session_add_item(session, item);
|
||||||
|
if (rv != 0) {
|
||||||
|
nghttp2_frame_origin_free(&frame->ext, mem);
|
||||||
|
nghttp2_mem_free(mem, item);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
fail_item_malloc:
|
||||||
|
free(ov_copy);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
static uint8_t set_request_flags(const nghttp2_priority_spec *pri_spec,
|
static uint8_t set_request_flags(const nghttp2_priority_spec *pri_spec,
|
||||||
const nghttp2_data_provider *data_prd) {
|
const nghttp2_data_provider *data_prd) {
|
||||||
uint8_t flags = NGHTTP2_FLAG_NONE;
|
uint8_t flags = NGHTTP2_FLAG_NONE;
|
||||||
|
2
deps/nghttp2/lib/nghttp2_submit.h
vendored
2
deps/nghttp2/lib/nghttp2_submit.h
vendored
@ -26,7 +26,7 @@
|
|||||||
#define NGHTTP2_SUBMIT_H
|
#define NGHTTP2_SUBMIT_H
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
2
deps/nghttp2/lib/nghttp2_version.c
vendored
2
deps/nghttp2/lib/nghttp2_version.c
vendored
@ -23,7 +23,7 @@
|
|||||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
#include <config.h>
|
# include <config.h>
|
||||||
#endif /* HAVE_CONFIG_H */
|
#endif /* HAVE_CONFIG_H */
|
||||||
|
|
||||||
#include <nghttp2/nghttp2.h>
|
#include <nghttp2/nghttp2.h>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user