From 8ce9042a25cae7091dfd4d276410953b76c36adb Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 18 Jan 2014 00:17:15 +0900 Subject: [PATCH] Update doc --- _sources/apiref.txt | 64 ++++-------------- _sources/tutorial-client.txt | 56 ++++++++++++++-- _sources/tutorial-server.txt | 61 ++++++++++++------ apiref.html | 61 ++++-------------- genindex.html | 8 +-- nghttp2.h.html | 66 ++++--------------- objects.inv | Bin 2151 -> 2130 bytes searchindex.js | 2 +- tutorial-client.html | 121 +++++++++++++++++++++++++++++++---- tutorial-server.html | 104 +++++++++++++++++++++--------- 10 files changed, 321 insertions(+), 222 deletions(-) diff --git a/_sources/apiref.txt b/_sources/apiref.txt index ee838b76..3ef2ea17 100644 --- a/_sources/apiref.txt +++ b/_sources/apiref.txt @@ -836,13 +836,12 @@ Types (structs, unions and typedefs) If the application uses `nghttp2_session_mem_recv()`, it can return :macro:`NGHTTP2_ERR_PAUSE` to make `nghttp2_session_mem_recv()` - return without processing further input bytes. The *frame* - parameter is retained until `nghttp2_session_continue()` is + return without processing further input bytes. The memory by + pointed by the *data* is retained until + `nghttp2_session_mem_recv()` or `nghttp2_session_recv()` is called. The application must retain the input bytes which was used - to produce the *frame* parameter, because it may refer to the - memory region included in the input bytes. The application which - returns :macro:`NGHTTP2_ERR_PAUSE` must call - `nghttp2_session_continue()` before `nghttp2_session_mem_recv()`. + to produce the *data* parameter, because it may refer to the memory + region included in the input bytes. The implementation of this function must return 0 if it succeeds. If nonzero is returned, it is treated as fatal error and @@ -1006,14 +1005,12 @@ Types (structs, unions and typedefs) If the application uses `nghttp2_session_mem_recv()`, it can return :macro:`NGHTTP2_ERR_PAUSE` to make `nghttp2_session_mem_recv()` - return without processing further input bytes. The *frame*, - *name*, *namelen*, *value* and *valuelen* parameters are retained - until `nghttp2_session_continue()` is called. The application must - retain the input bytes which was used to produce the *frame* - parameter, because it may refer to the memory region included in - the input bytes. The application which returns - :macro:`NGHTTP2_ERR_PAUSE` must call `nghttp2_session_continue()` - before `nghttp2_session_mem_recv()`. + return without processing further input bytes. The memory pointed + by *frame*, *name* and *value* parameters are retained until + `nghttp2_session_mem_recv()` or `nghttp2_session_recv()` is + called. The application must retain the input bytes which was used + to produce these parameters, because it may refer to the memory + region included in the input bytes. The implementation of this function must return 0 if it succeeds. It may return :macro:`NGHTTP2_ERR_PAUSE`. If the other @@ -1340,7 +1337,7 @@ Functions In the current implementation, this function always tries to processes all input data unless either an error occurs or :macro:`NGHTTP2_ERR_PAUSE` is returned from - :member:`nghttp2_session_callbacks.on_frame_recv_callback` or + :member:`nghttp2_session_callbacks.on_header_callback` or :member:`nghttp2_session_callbacks.on_data_chunk_recv_callback`. If :macro:`NGHTTP2_ERR_PAUSE` is used, the return value includes the number of bytes which was used to produce the data or frame for the @@ -1354,31 +1351,6 @@ Functions :macro:`NGHTTP2_ERR_CALLBACK_FAILURE` The callback function failed. -.. function:: int nghttp2_session_continue(nghttp2_session *session) - - - Perform post-processing after `nghttp2_session_mem_recv()` was - paused by :macro:`NGHTTP2_ERR_PAUSE` from - :member:`nghttp2_session_callbacks.on_frame_recv_callback` or - :member:`nghttp2_session_callbacks.on_data_chunk_recv_callback`. - - This function frees resources associated with paused frames. It - may also call additional callbacks, such as - :member:`nghttp2_session_callbacks.on_stream_close_callback`. - - If this function succeeds, the application can call - `nghttp2_session_mem_recv()` again. - - This function returns 0 if it succeeds, or one of the following - negative error codes: - - - :macro:`NGHTTP2_ERR_NOMEM` - Out of memory. - :macro:`NGHTTP2_ERR_CALLBACK_FAILURE` - The callback function failed. - - .. function:: int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) @@ -1642,8 +1614,7 @@ Functions negative error codes: :macro:`NGHTTP2_ERR_INVALID_ARGUMENT` - The *pri* is invalid; or the *nva* includes empty name, or name - which contains invalid characters. + The *pri* is invalid :macro:`NGHTTP2_ERR_NOMEM` Out of memory. @@ -1681,9 +1652,6 @@ Functions This function returns 0 if it succeeds, or one of the following negative error codes: - :macro:`NGHTTP2_ERR_INVALID_ARGUMENT` - The *nva* includes empty name or name which contains invalid - characters. :macro:`NGHTTP2_ERR_NOMEM` Out of memory. @@ -1733,8 +1701,7 @@ Functions negative error codes: :macro:`NGHTTP2_ERR_INVALID_ARGUMENT` - The *pri* is invalid; or the *nva* includes empty name, or name - which contains invalid characters. + The *pri* is invalid :macro:`NGHTTP2_ERR_NOMEM` Out of memory. @@ -1855,9 +1822,6 @@ Functions This function returns 0 if it succeeds, or one of the following negative error codes: - :macro:`NGHTTP2_ERR_INVALID_ARGUMENT` - The *nva* includes empty name, or name which contains invalid - characters. :macro:`NGHTTP2_ERR_NOMEM` Out of memory. diff --git a/_sources/tutorial-client.txt b/_sources/tutorial-client.txt index 79756499..bd7aae85 100644 --- a/_sources/tutorial-client.txt +++ b/_sources/tutorial-client.txt @@ -163,11 +163,13 @@ finished successfully. We first initialize nghttp2 session object in callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; + callbacks.on_end_headers_callback = on_end_headers_callback; nghttp2_session_client_new(&session_data->session, &callbacks, session_data); } Since we are creating client, we use `nghttp2_session_client_new()` to -initialize nghttp2 session object. We setup 5 callbacks for the +initialize nghttp2 session object. We setup 7 callbacks for the nghttp2 session. We'll explain these callbacks later. The `delete_http2_session_data()` destroys ``session_data`` and frees @@ -395,9 +397,8 @@ received from the remote peer:: case NGHTTP2_HEADERS: if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && session_data->stream_data->stream_id == frame->hd.stream_id) { - /* Print response headers for the initiated request. */ - fprintf(stderr, "Response headers:\n"); - print_headers(stderr, frame->headers.nva, frame->headers.nvlen); + fprintf(stderr, "Response headers for stream ID=%d:\n", + frame->hd.stream_id); } break; } @@ -409,6 +410,53 @@ HEADERS. We check te frame type and its category (it should be :macro:`NGHTTP2_HCAT_RESPONSE` for HTTP response HEADERS). Also check its stream ID. +Each request header name/value pair is emitted via +``on_header_callback`` function:: + + static int on_header_callback(nghttp2_session *session, + const nghttp2_frame *frame, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen, + void *user_data) + { + http2_session_data *session_data = (http2_session_data*)user_data; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && + session_data->stream_data->stream_id == frame->hd.stream_id) { + /* Print response headers for the initiated request. */ + print_header(stderr, name, namelen, value, valuelen); + break; + } + } + return 0; + } + +In this turotial, we just print the name/value pair. + +After all name/value pairs are emitted for a frame, +``on_end_headers_callback`` function is called:: + + static int on_end_headers_callback(nghttp2_session *session, + const nghttp2_frame *frame, + nghttp2_error_code error_code, + void *user_data) + { + http2_session_data *session_data = (http2_session_data*)user_data; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && + session_data->stream_data->stream_id == frame->hd.stream_id) { + fprintf(stderr, "All headers received with error_code=%d\n", error_code); + } + break; + } + return 0; + } + +This callback may be called prematurely because of errors (e.g., +header decompression failure) which is indicated by ``error_code``. + The ``on_data_chunk_recv_callback()`` function is invoked when a chunk of data is received from the remote peer:: diff --git a/_sources/tutorial-server.txt b/_sources/tutorial-server.txt index 98199365..723c9b6e 100644 --- a/_sources/tutorial-server.txt +++ b/_sources/tutorial-server.txt @@ -243,11 +243,12 @@ We initialize nghttp2 session object which is done in callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_request_recv_callback = on_request_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; nghttp2_session_server_new(&session_data->session, &callbacks, session_data); } Since we are creating server, nghttp2 session object is created using -`nghttp2_session_server_new()` function. We registers 4 callbacks to +`nghttp2_session_server_new()` function. We registers 5 callbacks to nghttp2 session object. We'll talk about these callbacks later. After initialization of nghttp2 session object, we are going to send @@ -421,8 +422,6 @@ received from the remote peer:: { http2_session_data *session_data = (http2_session_data*)user_data; http2_stream_data *stream_data; - size_t i; - const char PATH[] = ":path"; switch(frame->hd.type) { case NGHTTP2_HEADERS: if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) { @@ -431,16 +430,6 @@ received from the remote peer:: stream_data = create_http2_stream_data(session_data, frame->hd.stream_id); nghttp2_session_set_stream_user_data(session, frame->hd.stream_id, stream_data); - for(i = 0; i < frame->headers.nvlen; ++i) { - nghttp2_nv *nv = &frame->headers.nva[i]; - if(nv->namelen == sizeof(PATH) - 1 && - memcmp(PATH, nv->name, nv->namelen) == 0) { - size_t j; - for(j = 0; j < nv->valuelen && nv->value[j] != '?'; ++j); - stream_data->request_path = percent_decode(nv->value, j); - break; - } - } break; default: break; @@ -457,13 +446,47 @@ in nghttp2 session object using `nghttp2_set_stream_user_data()` in order to get the object without searching through doubly linked list. In this example server, we want to serve files relative to the current -working directory the program was invoked. We search ``:path`` header -field in request headers and keep the requested path in -``http2_stream_data`` object. In this example program, we ignore -``:method`` header field and always treat the request as GET request. +working directory the program was invoked. Each header name/value pair +is emitted via ``on_header_callback`` function, which is called after +``on_frame_recv_callback()``:: -It is ok for the server to start sending response in this callback. In -this example, we defer it to ``on_request_recv_callback()`` function. + static int on_header_callback(nghttp2_session *session, + const nghttp2_frame *frame, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen, + void *user_data) + { + http2_stream_data *stream_data; + const char PATH[] = ":path"; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) { + break; + } + stream_data = nghttp2_session_get_stream_user_data(session, + frame->hd.stream_id); + if(stream_data->request_path) { + break; + } + if(namelen == sizeof(PATH) - 1 && memcmp(PATH, name, namelen) == 0) { + size_t j; + for(j = 0; j < valuelen && value[j] != '?'; ++j); + stream_data->request_path = percent_decode(value, j); + } + break; + } + return 0; + } + +We search ``:path`` header field in request headers and keep the +requested path in ``http2_stream_data`` object. In this example +program, we ignore ``:method`` header field and always treat the +request as GET request. + +It is ok for the server to start sending response in this callback (or +in `nghttp2_on_end_headers_callback()`, which is not used in this +tutorial). In this example, we defer it to +``on_request_recv_callback()`` function. The ``on_request_recv_callback()`` function is invoked when all HTTP request, including entity body, was received:: diff --git a/apiref.html b/apiref.html index 1cb28996..2d7d150c 100644 --- a/apiref.html +++ b/apiref.html @@ -1343,13 +1343,12 @@ third argument passed in to the call to nghttp2_session_client_new() or nghttp2_session_server_new().

If the application uses nghttp2_session_mem_recv(), it can return NGHTTP2_ERR_PAUSE to make nghttp2_session_mem_recv() -return without processing further input bytes. The frame -parameter is retained until nghttp2_session_continue() is +return without processing further input bytes. The memory by +pointed by the data is retained until +nghttp2_session_mem_recv() or nghttp2_session_recv() is called. The application must retain the input bytes which was used -to produce the frame parameter, because it may refer to the -memory region included in the input bytes. The application which -returns NGHTTP2_ERR_PAUSE must call -nghttp2_session_continue() before nghttp2_session_mem_recv().

+to produce the data parameter, because it may refer to the memory +region included in the input bytes.

The implementation of this function must return 0 if it succeeds. If nonzero is returned, it is treated as fatal error and nghttp2_session_recv() and nghttp2_session_mem_recv() functions @@ -1511,14 +1510,12 @@ application returns nonzero value from this callback.

can be said about the value.

If the application uses nghttp2_session_mem_recv(), it can return NGHTTP2_ERR_PAUSE to make nghttp2_session_mem_recv() -return without processing further input bytes. The frame, -name, namelen, value and valuelen parameters are retained -until nghttp2_session_continue() is called. The application must -retain the input bytes which was used to produce the frame -parameter, because it may refer to the memory region included in -the input bytes. The application which returns -NGHTTP2_ERR_PAUSE must call nghttp2_session_continue() -before nghttp2_session_mem_recv().

+return without processing further input bytes. The memory pointed +by frame, name and value parameters are retained until +nghttp2_session_mem_recv() or nghttp2_session_recv() is +called. The application must retain the input bytes which was used +to produce these parameters, because it may refer to the memory +region included in the input bytes.

The implementation of this function must return 0 if it succeeds. It may return NGHTTP2_ERR_PAUSE. If the other nonzero value is returned, it is treated as fatal error and @@ -1901,7 +1898,7 @@ other callbacks are called in the same way as they are in

In the current implementation, this function always tries to processes all input data unless either an error occurs or NGHTTP2_ERR_PAUSE is returned from -nghttp2_session_callbacks.on_frame_recv_callback or +nghttp2_session_callbacks.on_header_callback or nghttp2_session_callbacks.on_data_chunk_recv_callback. If NGHTTP2_ERR_PAUSE is used, the return value includes the number of bytes which was used to produce the data or frame for the @@ -1916,28 +1913,6 @@ following negative error codes:

-
-
-int nghttp2_session_continue(nghttp2_session *session)
-

Perform post-processing after nghttp2_session_mem_recv() was -paused by NGHTTP2_ERR_PAUSE from -nghttp2_session_callbacks.on_frame_recv_callback or -nghttp2_session_callbacks.on_data_chunk_recv_callback.

-

This function frees resources associated with paused frames. It -may also call additional callbacks, such as -nghttp2_session_callbacks.on_stream_close_callback.

-

If this function succeeds, the application can call -nghttp2_session_mem_recv() again.

-

This function returns 0 if it succeeds, or one of the following -negative error codes:

-
-
NGHTTP2_ERR_NOMEM
-
Out of memory.
-
NGHTTP2_ERR_CALLBACK_FAILURE
-
The callback function failed.
-
-
-
int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id)
@@ -2194,8 +2169,7 @@ the stream is already opened, negative error codes:

NGHTTP2_ERR_INVALID_ARGUMENT
-
The pri is invalid; or the nva includes empty name, or name -which contains invalid characters.
+
The pri is invalid
NGHTTP2_ERR_NOMEM
Out of memory.
@@ -2229,9 +2203,6 @@ must be reserved using -
NGHTTP2_ERR_INVALID_ARGUMENT
-
The nva includes empty name or name which contains invalid -characters.
NGHTTP2_ERR_NOMEM
Out of memory.
@@ -2276,8 +2247,7 @@ specify flags directly. For usual HTTP request, negative error codes:

NGHTTP2_ERR_INVALID_ARGUMENT
-
The pri is invalid; or the nva includes empty name, or name -which contains invalid characters.
+
The pri is invalid
NGHTTP2_ERR_NOMEM
Out of memory.
@@ -2391,9 +2361,6 @@ server. But in normal HTTP usage, the server may treat it error.

This function returns 0 if it succeeds, or one of the following negative error codes:

-
NGHTTP2_ERR_INVALID_ARGUMENT
-
The nva includes empty name, or name which contains invalid -characters.
NGHTTP2_ERR_NOMEM
Out of memory.
diff --git a/genindex.html b/genindex.html index 38251d93..c2952185 100644 --- a/genindex.html +++ b/genindex.html @@ -614,12 +614,12 @@
nghttp2_on_frame_not_send_callback (C type)
+ +
nghttp2_on_frame_recv_callback (C type)
-
-
nghttp2_on_frame_recv_parse_error_callback (C type)
@@ -869,10 +869,6 @@ -
nghttp2_session_continue (C function) -
- -
nghttp2_session_del (C function)
diff --git a/nghttp2.h.html b/nghttp2.h.html index 3b4ee199..ff1df345 100644 --- a/nghttp2.h.html +++ b/nghttp2.h.html @@ -1051,13 +1051,12 @@ * * If the application uses `nghttp2_session_mem_recv()`, it can return * :enum:`NGHTTP2_ERR_PAUSE` to make `nghttp2_session_mem_recv()` - * return without processing further input bytes. The |frame| - * parameter is retained until `nghttp2_session_continue()` is + * return without processing further input bytes. The memory by + * pointed by the |data| is retained until + * `nghttp2_session_mem_recv()` or `nghttp2_session_recv()` is * called. The application must retain the input bytes which was used - * to produce the |frame| parameter, because it may refer to the - * memory region included in the input bytes. The application which - * returns :enum:`NGHTTP2_ERR_PAUSE` must call - * `nghttp2_session_continue()` before `nghttp2_session_mem_recv()`. + * to produce the |data| parameter, because it may refer to the memory + * region included in the input bytes. * * The implementation of this function must return 0 if it * succeeds. If nonzero is returned, it is treated as fatal error and @@ -1262,14 +1261,12 @@ * * If the application uses `nghttp2_session_mem_recv()`, it can return * :enum:`NGHTTP2_ERR_PAUSE` to make `nghttp2_session_mem_recv()` - * return without processing further input bytes. The |frame|, - * |name|, |namelen|, |value| and |valuelen| parameters are retained - * until `nghttp2_session_continue()` is called. The application must - * retain the input bytes which was used to produce the |frame| - * parameter, because it may refer to the memory region included in - * the input bytes. The application which returns - * :enum:`NGHTTP2_ERR_PAUSE` must call `nghttp2_session_continue()` - * before `nghttp2_session_mem_recv()`. + * return without processing further input bytes. The memory pointed + * by |frame|, |name| and |value| parameters are retained until + * `nghttp2_session_mem_recv()` or `nghttp2_session_recv()` is + * called. The application must retain the input bytes which was used + * to produce these parameters, because it may refer to the memory + * region included in the input bytes. * * The implementation of this function must return 0 if it * succeeds. It may return :enum:`NGHTTP2_ERR_PAUSE`. If the other @@ -1686,7 +1683,7 @@ * In the current implementation, this function always tries to * processes all input data unless either an error occurs or * :enum:`NGHTTP2_ERR_PAUSE` is returned from - * :member:`nghttp2_session_callbacks.on_frame_recv_callback` or + * :member:`nghttp2_session_callbacks.on_header_callback` or * :member:`nghttp2_session_callbacks.on_data_chunk_recv_callback`. * If :enum:`NGHTTP2_ERR_PAUSE` is used, the return value includes the * number of bytes which was used to produce the data or frame for the @@ -1703,33 +1700,6 @@ ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in, size_t inlen); -/** - * @function - * - * Perform post-processing after `nghttp2_session_mem_recv()` was - * paused by :enum:`NGHTTP2_ERR_PAUSE` from - * :member:`nghttp2_session_callbacks.on_frame_recv_callback` or - * :member:`nghttp2_session_callbacks.on_data_chunk_recv_callback`. - * - * This function frees resources associated with paused frames. It - * may also call additional callbacks, such as - * :member:`nghttp2_session_callbacks.on_stream_close_callback`. - * - * If this function succeeds, the application can call - * `nghttp2_session_mem_recv()` again. - * - * This function returns 0 if it succeeds, or one of the following - * negative error codes: - * - * - * :enum:`NGHTTP2_ERR_NOMEM` - * Out of memory. - * :enum:`NGHTTP2_ERR_CALLBACK_FAILURE` - * The callback function failed. - * - */ -int nghttp2_session_continue(nghttp2_session *session); - /** * @function * @@ -2035,8 +2005,7 @@ * negative error codes: * * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |pri| is invalid; or the |nva| includes empty name, or name - * which contains invalid characters. + * The |pri| is invalid * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ @@ -2079,9 +2048,6 @@ * This function returns 0 if it succeeds, or one of the following * negative error codes: * - * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |nva| includes empty name or name which contains invalid - * characters. * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ @@ -2136,8 +2102,7 @@ * negative error codes: * * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |pri| is invalid; or the |nva| includes empty name, or name - * which contains invalid characters. + * The |pri| is invalid * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ @@ -2278,9 +2243,6 @@ * This function returns 0 if it succeeds, or one of the following * negative error codes: * - * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |nva| includes empty name, or name which contains invalid - * characters. * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ diff --git a/objects.inv b/objects.inv index fca7367fcaa01ce01273665f599c5a7a1b229f98..b7573afb56f33c499f2b274ed0147ac03e8cbf81 100644 GIT binary patch delta 2025 zcmVw& zO!+2F60s?xG~uuGiu9FNSs0XJw)wml`)85Q{+R_?l#7?x*t03+{Tl$K;`4lcyKXbnnlqV#l*Q-A9Gcl0z(#Yj5gKB?s*g#FapvEksdBbv8j9 zKL?xdg+{-;Ga218B5%3~t(w%=Iu08gu7j zb5PRag5xL_1HRc+$@jCbn~a273T+o6UY?r`GON~X?Yj?vW~VBl5FAHTN+=Lt zKVk8=&^;Xxr$e!ua`+~S(f$m(q>P|yur&31u76)mpWZQzaC6gk*#eB`1zXY&^1n12 zXJ3u0b@eO+D9piRcr>hq{fMSP8_a|RrP!u9P|lhPJ2W@~bEC?qObVXGOPY%|lwdY@ zB5@w2c~rhBu!zPsXp&Q`I$jqWmhExfl>BLddqE>Fpl@5!cT4KxIkpKQenS_*(knAZ zdVdT<#MZzK`?!IuUuKb6kW(#f14qH#+h0+}qvR!~kmjLKsHRIwO~ja8D9M&YB;CM{lyZCHCV&Cr&z>qsS-D}`5s#lF_S4oaD7MhpHRRseTON~=&dMuT9waf zMFRY&L`6j^`Xw;nsfljK3aM!UyU)5wCSx5UicF1COilF;IBpKR`u#;({8o!vfzx0ELp8KU{dWB_{&HsAl}YX zRyjkvX&^XO99C5-!n#k$+7j|M9{u&=dPjMw^HM{|5zIO4Kc7LZUfq8(tDEH@7%Z9Y zv@sml!z2Fvfh_F1GlgoXr!u!PT!z|h+6dj_UFEd=m4aJQ3Jdnba!RWN5P$utSR~tW zr-J+RVC@Vv2}d;!Ua2$$zHeEkhv|}tW1VOcDr^V_MGF{hC-2M%ZdpSpl8TdfM3yGa zARZQPI@RT}ia1rB4`@N4K6$I;2JIyTp<6oPIAB7Z(L^4+jyNe&N5%pqhvK%Xk*v!o zm7J9wLW>U-u@-=|jZl>6k$>$N-V?ToYkc*`GC+CWmK>l=y-waI&bJH(b2GiHO1>xQ z>z~|Go^NcyDIqpH9)JW!Ar<=9;jw#Lf7GA2ZjxAwC#sJYMpll~M;K}3fKYi#p_(`E zTsjDD@DK3>6~@%>PcQ)`5uf(#>2yG0)Y~wTsa_l=n@5)s(+1l$Mp?xOLHK?+_^^`XOFk-0Jj`{n}?tQ`V~B1@A3 z9B#gM#Rlz%E!$!WJAYl)lCmCGW7h8Ku70m@xhc(pA5}k> zRUsY5qS+gNAqFQ`Qwntd@^!h%cCj`+ysYXcI`BB@%FU<=kAJns#BR*>(TYu)PH)0x zf~e&__$hD3ZmK+&JgyNN!je%@he}p1C_;)-wGXKaP_PwhTLOGibg5XxDapqN%L*)W z)YbrfLX#Pe{51>S;uK9)RqW`+M<^A|0Z=JAqRpP)_J>3nW-kH5T)k^E z0Vqu~iFTgfjAAt)&*1tj=&RP|&21un0;gFpT#@*H H3T_FY5|8a! delta 2046 zcmVwN5r|j3Fs?#rr_?aCRpZ{7Eub+?IKa72SJp8d( z^Rzjzg)RQ{X~*&_i~7HIE80gZ7MIC>`e6IF?y;bKU=#1yr+<96uj}HD@}i~{tBst~ zxT!f!c%HMQ&Uj8=;1m3XHbolOY>|99vg0!=7k@3{A}iUped(Wz&!61;hcMjSQR4g5 zcE6d9ZP6e!Ln0Q%Ny)FQ>Aznz)t(k5KV}s(^3#Fkb6@ILvwqjK!%t_+I z;Wq=rvVJYttjTqq<-3Zqye?ngf4<+K?S{m6O-I<~`3Q?PzD*tPkpv;mg4W$7 zOHNu=Tsb(1#h51hCjWWyI%OotT^RcmbIMD{CT<8P?0>ps8QPxPAD%;8gv~o1zr?R< z8_NnJur67AG+0@3IAorpqPl?dRlojicDJ9xXZG8pNC8!nFWV-U2!Vuxm2a*I+GmRM znVcn+<}1T{ic3B**VMKU8@d{RSq{jPrSF9FZD`aTOLE{9(|p?jz?$alS1mxa<_W*y zfV#;3>VJ64zi)AiIt~G^b8r_HUPI5LYtwy#9j+W3{xLu(0-MAOHog~nh-cU4_nSbu zYMzf-eUV2qe(zVdSYAP?i?QB_+#uR)JU=8B{YLx%z(}X)5La5ZiGl}&Wp7PVq?Tod zCgQDavdGNV&()i#ME5i8b1Ork{>m}$sX3bkgMWY9%`F`-AQsjI#!wfOTN%y|ViXz4 zkG5-hkJuRQA`#NKW;Siv_00SbN3K^;X)I*|oj>_$Wd z4u3Xxzq0~L@Ad$}s>ecBfKZt2_dy||1GWFwu|q;5wqv_?Xamb0kxE?3j_q;1HCbcJ zpcw@OjZKpnQQ8lO!41hd#G(%hF>M+JD@*oo!(hvrs-iEziev8G=z3^T$yj@O2l51|Go>5`Z=W*ofdQY= zD=s}E-5jy<`xS4>L?m&Hsl^urC$!hZi$aYO)Alut;nxfu$d6v+SXiMm;lf7uTYr`P zW&nOk$&RoK9o#Ef)d1EBm*J9i zG6}nkI(I-2LRTmu5Kd+Ul(y?ybUY;5Sh!|hOAPw_(xF)*eme^r&_^14>&hG0b}Oc# zCq@q(oJ~h05a$Y6Pk>f=zJDD);f7^xROmIfX0)}opvq4uS}{Kexn;laM7DCn9mPT; zRFnVA`OE(~mAstLqAOK9$3r%=beqn+sBtZK4H~nh%O^JoM*aqRy_%KPZm^x*<$c0pL8hhwcA6;i#bM~ozPA8zJq{mv$sa!VX_;FwS`EF zW}VrQ3tT7Ng3VpYNO3dyM6yP1RS8n~WIG)C5j=(A`M(3+LUEEj{SbEjA* zuB0!ExU5(|H~knnd2djn(YRFU;Wu3zr2ra`8(S#5w3*MEYx3iA)`pfKqcO4idW)3) z$N@xOY0Z0$Yf-$2;TZe0#t6lkt8xlL&^Zk)en;%bw%P&pH-F%f;@$~b>b+^%sEcUp z7Tm45A>MH9;mh$>g^oVso zJk*!RAJ)Zs^NArPA$-r=vxr|0T*d1959((B&0M;DFoi8=y6f_x7&B!QGHFMvKw ztCEf&ONZzU`gh|_i=L~2arWwqA`M!)h(w?JANB^}-qCeiP1etIh`9#a^wFOc^@=Bn zYfZfwJVYUVMBduQwxKSGgceP~T;LZMLXp?~2c9U24D!a%McJg-ug$dqZzH+`nd~ks c<4VS$^OW=h;`0bc0YKG`V`jGWAIymz8u7#R$N&HU diff --git a/searchindex.js b/searchindex.js index 8f4b089f..e411ec0c 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({objects:{"":{NGHTTP2_ERR_INVALID_STATE:[3,1,1,""],NGHTTP2_ERR_HEADER_COMP:[3,1,1,""],NGHTTP2_SETTINGS_HEADER_TABLE_SIZE:[3,1,1,""],nghttp2_settings_entry:[3,2,1,""],NGHTTP2_INTERNAL_ERROR:[3,1,1,""],NGHTTP2_PRI_LOWEST:[3,1,1,""],nghttp2_on_frame_recv_callback:[3,2,1,""],NGHTTP2_CLIENT_CONNECTION_HEADER_LEN:[3,1,1,""],nghttp2_goaway:[3,2,1,""],nghttp2_ping:[3,2,1,""],NGHTTP2_ERR_INVALID_FRAME:[3,1,1,""],nghttp2_frame_type:[3,2,1,""],nghttp2_on_data_recv_callback:[3,2,1,""],nghttp2_select_next_protocol:[3,3,1,""],NGHTTP2_ERR_INVALID_HEADER_BLOCK:[3,1,1,""],nghttp2_session_callbacks:[3,2,1,""],NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS:[3,1,1,""],NGHTTP2_ERR_PROTO:[3,1,1,""],NGHTTP2_MAX_HEADER_TABLE_SIZE:[3,1,1,""],nghttp2_submit_window_update:[3,3,1,""],NGHTTP2_ERR_UNSUPPORTED_VERSION:[3,1,1,""],NGHTTP2_SETTINGS_ENABLE_PUSH:[3,1,1,""],nghttp2_window_update:[3,2,1,""],nghttp2_session_client_new2:[3,3,1,""],NGHTTP2_DATA:[3,1,1,""],nghttp2_frame_hd:[3,2,1,""],NGHTTP2_ERR_INVALID_STREAM_STATE:[3,1,1,""],nghttp2_on_header_callback:[3,2,1,""],NGHTTP2_FLAG_ACK:[3,1,1,""],NGHTTP2_STREAM_CLOSED:[3,1,1,""],NGHTTP2_SETTINGS_MAX:[3,1,1,""],NGHTTP2_MAX_WINDOW_SIZE:[3,1,1,""],nghttp2_headers_category:[3,2,1,""],nghttp2_error_code:[3,2,1,""],NGHTTP2_REFUSED_STREAM:[3,1,1,""],nghttp2_on_data_chunk_recv_callback:[3,2,1,""],NGHTTP2_ERR_START_STREAM_NOT_ALLOWED:[3,1,1,""],NGHTTP2_ERR_FLOW_CONTROL:[3,1,1,""],nghttp2_strerror:[3,3,1,""],nghttp2_gzip_inflate_del:[3,3,1,""],NGHTTP2_ERR_FATAL:[3,1,1,""],nghttp2_submit_goaway:[3,3,1,""],nghttp2_error:[3,2,1,""],NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE:[3,1,1,""],NGHTTP2_ERR_NOMEM:[3,1,1,""],NGHTTP2_ERR_PAUSE:[3,1,1,""],NGHTTP2_ENHANCE_YOUR_CALM:[3,1,1,""],NGHTTP2_ERR_PUSH_DISABLED:[3,1,1,""],NGHTTP2_NO_ERROR:[3,1,1,""],NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS:[3,1,1,""],nghttp2_session_server_new2:[3,3,1,""],NGHTTP2_ERR_DEFERRED:[3,1,1,""],nghttp2_push_promise:[3,2,1,""],NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE:[3,1,1,""],nghttp2_session_get_outbound_queue_size:[3,3,1,""],nghttp2_rst_stream:[3,2,1,""],NGHTTP2_PROTO_VERSION_ID_LEN:[3,1,1,""],NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS:[3,1,1,""],nghttp2_data_source_read_callback:[3,2,1,""],NGHTTP2_SETTINGS_TIMEOUT:[3,1,1,""],nghttp2_on_end_headers_callback:[3,2,1,""],NGHTTP2_ERR_WOULDBLOCK:[3,1,1,""],nghttp2_session_resume_data:[3,3,1,""],NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:[3,1,1,""],NGHTTP2_PRI_DEFAULT:[3,1,1,""],nghttp2_session_server_new:[3,3,1,""],NGHTTP2_FLAG_END_PUSH_PROMISE:[3,1,1,""],NGHTTP2_ERR_INVALID_ARGUMENT:[3,1,1,""],NGHTTP2_ERR_FRAME_SIZE_ERROR:[3,1,1,""],NGHTTP2_ERR_GOAWAY_ALREADY_SENT:[3,1,1,""],NGHTTP2_HEADERS:[3,1,1,""],nghttp2_flag:[3,2,1,""],NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE:[3,1,1,""],NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS:[3,1,1,""],NGHTTP2_HCAT_REQUEST:[3,1,1,""],NGHTTP2_FLAG_END_HEADERS:[3,1,1,""],nghttp2_gzip:[3,2,1,""],NGHTTP2_FLAG_END_STREAM:[3,1,1,""],NGHTTP2_ERR_EOF:[3,1,1,""],NGHTTP2_HCAT_HEADERS:[3,1,1,""],NGHTTP2_VERSION_NUM:[3,1,1,""],NGHTTP2_SETTINGS:[3,1,1,""],nghttp2_frame:[3,2,1,""],nghttp2_submit_push_promise:[3,3,1,""],NGHTTP2_ERR_DEFERRED_DATA_EXIST:[3,1,1,""],NGHTTP2_CANCEL:[3,1,1,""],nghttp2_send_callback:[3,2,1,""],NGHTTP2_ERR_INVALID_STREAM_ID:[3,1,1,""],nghttp2_on_frame_send_callback:[3,2,1,""],nghttp2_session_mem_recv:[3,3,1,""],NGHTTP2_VERSION:[3,1,1,""],nghttp2_opt_set:[3,2,1,""],nghttp2_session:[3,2,1,""],NGHTTP2_COMPRESSION_ERROR:[3,1,1,""],NGHTTP2_HCAT_PUSH_RESPONSE:[3,1,1,""],nghttp2_submit_rst_stream:[3,3,1,""],nghttp2_submit_headers:[3,3,1,""],nghttp2_recv_callback:[3,2,1,""],nghttp2_session_get_stream_user_data:[3,3,1,""],NGHTTP2_FLAG_PRIORITY:[3,1,1,""],nghttp2_on_data_send_callback:[3,2,1,""],nghttp2_nv:[3,2,1,""],nghttp2_on_invalid_frame_recv_callback:[3,2,1,""],nghttp2_version:[3,3,1,""],nghttp2_on_unknown_frame_recv_callback:[3,2,1,""],nghttp2_session_continue:[3,3,1,""],NGHTTP2_ERR_STREAM_CLOSED:[3,1,1,""],nghttp2_opt:[3,2,1,""],NGHTTP2_ERR_CALLBACK_FAILURE:[3,1,1,""],NGHTTP2_FLOW_CONTROL_ERROR:[3,1,1,""],nghttp2_session_set_stream_user_data:[3,3,1,""],NGHTTP2_ERR_STREAM_CLOSING:[3,1,1,""],nghttp2_session_client_new:[3,3,1,""],nghttp2_info:[3,2,1,""],NGHTTP2_PROTO_VERSION_ID:[3,1,1,""],nghttp2_settings_id:[3,2,1,""],nghttp2_session_send:[3,3,1,""],NGHTTP2_PROTOCOL_ERROR:[3,1,1,""],nghttp2_gzip_inflate:[3,3,1,""],nghttp2_session_upgrade:[3,3,1,""],nghttp2_session_del:[3,3,1,""],NGHTTP2_ERR_INSUFF_BUFSIZE:[3,1,1,""],nghttp2_settings:[3,2,1,""],nghttp2_on_frame_not_send_callback:[3,2,1,""],nghttp2_session_get_effective_recv_data_length:[3,3,1,""],nghttp2_submit_data:[3,3,1,""],nghttp2_submit_response:[3,3,1,""],NGHTTP2_CLIENT_CONNECTION_HEADER:[3,1,1,""],NGHTTP2_FLAG_NONE:[3,1,1,""],nghttp2_session_terminate_session:[3,3,1,""],nghttp2_on_frame_recv_parse_error_callback:[3,2,1,""],nghttp2_submit_settings:[3,3,1,""],NGHTTP2_HCAT_RESPONSE:[3,1,1,""],NGHTTP2_PING:[3,1,1,""],NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE:[3,1,1,""],nghttp2_priority:[3,2,1,""],nghttp2_session_want_read:[3,3,1,""],NGHTTP2_VERSION_AGE:[3,1,1,""],NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,1,""],NGHTTP2_CONNECT_ERROR:[3,1,1,""],NGHTTP2_RST_STREAM:[3,1,1,""],nghttp2_on_stream_close_callback:[3,2,1,""],NGHTTP2_PUSH_PROMISE:[3,1,1,""],nghttp2_data_provider:[3,2,1,""],nghttp2_on_request_recv_callback:[3,2,1,""],nghttp2_session_recv:[3,3,1,""],nghttp2_session_get_effective_local_window_size:[3,3,1,""],NGHTTP2_INITIAL_WINDOW_SIZE:[3,1,1,""],NGHTTP2_WINDOW_UPDATE:[3,1,1,""],NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS:[3,1,1,""],nghttp2_session_want_write:[3,3,1,""],nghttp2_submit_priority:[3,3,1,""],nghttp2_session_get_stream_effective_local_window_size:[3,3,1,""],nghttp2_headers:[3,2,1,""],nghttp2_before_frame_send_callback:[3,2,1,""],NGHTTP2_GOAWAY:[3,1,1,""],NGHTTP2_ERR_GZIP:[3,1,1,""],nghttp2_submit_ping:[3,3,1,""],NGHTTP2_FRAME_SIZE_ERROR:[3,1,1,""],nghttp2_data_source:[3,2,1,""],NGHTTP2_ERR_STREAM_SHUT_WR:[3,1,1,""],NGHTTP2_PRIORITY:[3,1,1,""],nghttp2_submit_request:[3,3,1,""],nghttp2_session_get_stream_effective_recv_data_length:[3,3,1,""],nghttp2_pack_settings_payload:[3,3,1,""],nghttp2_gzip_inflate_new:[3,3,1,""],nghttp2_nv_compare_name:[3,3,1,""]},nghttp2_session_callbacks:{on_invalid_frame_recv_callback:[3,0,1,""],before_frame_send_callback:[3,0,1,""],on_stream_close_callback:[3,0,1,""],on_data_chunk_recv_callback:[3,0,1,""],on_unknown_frame_recv_callback:[3,0,1,""],send_callback:[3,0,1,""],nghttp2_on_frame_recv_parse_error_callback:[3,0,1,""],on_frame_send_callback:[3,0,1,""],on_end_headers_callback:[3,0,1,""],on_frame_recv_callback:[3,0,1,""],on_data_send_callback:[3,0,1,""],on_header_callback:[3,0,1,""],on_frame_not_send_callback:[3,0,1,""],on_request_recv_callback:[3,0,1,""],on_data_recv_callback:[3,0,1,""],recv_callback:[3,0,1,""]},nghttp2_frame:{push_promise:[3,0,1,""],settings:[3,0,1,""],ping:[3,0,1,""],rst_stream:[3,0,1,""],priority:[3,0,1,""],headers:[3,0,1,""],goaway:[3,0,1,""],window_update:[3,0,1,""],hd:[3,0,1,""]},nghttp2_ping:{hd:[3,0,1,""]},nghttp2_data_provider:{source:[3,0,1,""],read_callback:[3,0,1,""]},nghttp2_priority:{pri:[3,0,1,""],hd:[3,0,1,""]},nghttp2_settings_entry:{settings_id:[3,0,1,""],value:[3,0,1,""]},nghttp2_window_update:{hd:[3,0,1,""],window_size_increment:[3,0,1,""]},nghttp2_frame_hd:{stream_id:[3,0,1,""],length:[3,0,1,""],flags:[3,0,1,""],type:[3,0,1,""]},nghttp2_info:{age:[3,0,1,""],version_str:[3,0,1,""],version_num:[3,0,1,""],proto_str:[3,0,1,""]},nghttp2_rst_stream:{error_code:[3,0,1,""],hd:[3,0,1,""]},nghttp2_nv:{valuelen:[3,0,1,""],namelen:[3,0,1,""],name:[3,0,1,""],value:[3,0,1,""]},nghttp2_headers:{nvlen:[3,0,1,""],pri:[3,0,1,""],hd:[3,0,1,""],nva:[3,0,1,""],cat:[3,0,1,""]},nghttp2_opt_set:{no_auto_stream_window_update:[3,0,1,""],peer_max_concurrent_streams:[3,0,1,""],no_auto_connection_window_update:[3,0,1,""]},nghttp2_goaway:{opaque_data:[3,0,1,""],error_code:[3,0,1,""],opaque_data_len:[3,0,1,""],hd:[3,0,1,""],last_stream_id:[3,0,1,""]},nghttp2_data_source:{fd:[3,0,1,""],ptr:[3,0,1,""]},nghttp2_push_promise:{promised_stream_id:[3,0,1,""],nvlen:[3,0,1,""],nva:[3,0,1,""],hd:[3,0,1,""]},nghttp2_settings:{niv:[3,0,1,""],hd:[3,0,1,""],iv:[3,0,1,""]}},terms:{my_obj:[3,6],nghttp2_io_flag:6,nghttp2_cancel:[3,6],opt_set:[3,6],prefix:[2,6,3],nghttp2_session_get_stream_effective_local_window_s:[3,6],"const":[2,6,5,3],nghttp2_submit_:[2,5],under:[3,6,4],bufferevent_getfd:5,spec:[3,6],merchant:[2,6,5,1],digit:5,"void":[2,6,5,3],bufferevent_ssl:[2,5],initialize_nghttp2_setup:[2,5],verif:5,servic:2,warnx:[2,5],on_stream_close_callback:[2,6,5,3],direct:4,ssl_op_no_session_resumption_on_renegoti:[2,5],neg:[3,6],nghttp2_err_insuff_bufs:[3,6],"new":[2,6,4,5,3],tatsuhiro:[0,1,2,4,5,6],nghttp2_session_resume_data:[3,6],ipproto_tcp:[2,5],abov:[2,1,3,4,5,6],initialize_app_context:2,here:[2,6,4,5,3],met:[2,6,5,3],path:[2,4,5],settings_timeout:[3,6],interpret:[3,6],nextprotoneg:[3,6],sslv23_server_method:2,permit:[2,6,5,1],nghttp2_submit_prior:[3,6],aka:[3,6,4],nghttp2_err_gzip:[3,6],nghttp2_frame:[2,6,5,3],bufferevent_ssl_connect:5,substr:2,bev_event_error:[2,5],printabl:5,unit:4,describ:[2,6,5,3],would:[3,6],overhead:4,asset:4,nghttp2_on_invalid_frame_recv_callback:[3,6],nghttp2_version:[3,6,1],type:[0,2,3,4,5,6],tell:[2,6,5,3],relat:[2,5],notic:[2,6,5,1],warn:2,ssl_shutdown:[2,5],herebi:[2,6,5,1],unpack:[3,6],must:[2,6,4,5,3],word:[3,6],err:[2,5],exit_failur:[2,5],setup:[2,5],work:[2,4],lev_opt_close_on_fre:2,nghttp2_flag_ack:[3,6],root:[2,4],syn_repli:[3,6],defer:[2,6,5,3],give:[3,6],indic:[2,6,4,5,3],want:[2,6,5,3],unsign:[2,6,5,3],nghttp2_settings_flow_control_opt:[3,6],end:[2,5],datalen:[2,5],how:5,nghttp2_err_fat:[3,6],nghttp2_frame_typ:[3,6],updat:[3,6],nghttp2_msg_more:6,nghttp2_on_request_recv_callback:[3,6],after:[2,6,4,5,3],badli:[3,6],demonstr:5,request_path:2,attempt:[3,6],third:[2,6,5,3],opaqu:[3,6],exclud:[3,6],receiv:[2,6,5,3],first:[2,6,4,5,3],order:[2,6,4,3],frontend:4,over:[2,4,5],becaus:[2,6,5,3],eagain:[2,5],vari:4,fit:[2,6,5,1],fwrite:5,deflate_s:4,hidden:[3,6],them:[2,6,5,3],thei:[2,6,4,5,3],safe:[2,6,3],"break":[2,6,5,3],promis:[3,6],choic:[3,6],ai_addr:2,timeout:[2,5],each:[2,6,4,3],debug:[3,6,5],side:[2,6,3],mean:[3,6,4,5],slen:2,protocol_error:[3,6],http2_stream_data:[2,5],nghttp2_session_server_new2:[3,6],network:[2,5],content:[0,4,2],end_stream:[3,6,4],situat:[2,5],free:[2,6,5,1,3],spdy:[3,6,4],openssl:[2,4,5],nghttp2_version_num:[3,6,1],sigact:[2,5],rang:[3,6,4],restrict:[2,6,5,1],nghttp2_protocol_error:[3,6],alreadi:[2,6,5,3],primari:[3,6],nghttp2_max_header_table_s:[3,6],too:[2,6,3],memcmp:2,draft:[0,6,4,3],listen:[2,4],tool:[0,4],travers:2,compressor:4,target:[3,6,4],provid:[2,1,3,4,5,6],project:[0,4],increment:[3,6],nghttp2_session_recv:[3,6],nghttp2_session_get_stream_effective_recv_data_length:[3,6],transmit:[3,6,5],sig_ign:[2,5],shall:[2,6,5,1],object:[2,6,4,5,3],writecb:[2,5],nghttp2_settings_timeout:[3,6],simplic:5,don:[2,6,3],hex_to_uint:2,doc:4,flow:[3,6],doe:[2,6,4,5,3],nghttp2_gzip_inflate_new:[3,6],on_invalid_frame_recv_callback:[3,6],bev_event_eof:[2,5],pkg:4,identifi:[2,6,5,3],bufferevent_setcb:[2,5],explain:5,configur:[3,6,4],apach:4,nghttp2_err_invalid_stream_id:[3,6],busi:[2,5],oct:4,nghttp2_err_proto:[3,6],authoritylen:5,stop:[2,5],end_head:[3,6,4],evbuffer_drain:[2,5],bar:4,ai_pass:2,ietf:[0,4],baz:4,push_promis:[3,6],"public":[0,6,4,3],nghttp2_strerror:[2,6,5,3],nghttp2_gzip_inflate_del:[3,6],bufferevent_ssl_accept:2,nghttp2_session_continu:[3,6],nul:[3,6],result:[2,6,5,3],respons:[2,6,4,5,3],corrupt:5,key_fil:2,subject:[2,6,5,1],said:[3,6],figur:4,bev_opt_close_on_fre:[2,5],accord:[3,6],extens:[4,5],advertis:[2,5],setsockopt:[2,5],against:[3,6],ssl_ctx_use_certificate_chain_fil:2,header_t:4,logic:2,browser:4,com:[0,6,4,3],int32_t:[2,6,5,3],assum:[3,6],duplic:[3,6],reciev:5,liabil:[2,6,5,1],evbuffer_get_length:[2,5],union:[0,6,3,2],max_deflate_s:4,been:[2,6,5,3],trigger:[3,6],interest:[2,4,5],basic:4,tini:5,life:2,regul:[2,5],argument:[2,6,4,5,3],ewouldblock:[2,5],ssl_op_no_compress:[2,5],nghttp2_settings_initial_window_s:[3,6],zlib:4,bev_event_timeout:[2,5],bufferevent_socket_connect_hostnam:5,nghttp2_set:[3,6],promised_stream_id:[3,6],conf:4,sever:[2,6,4,5,3],perform:[2,6,4,3],make:[2,6,4,3],headlen:[3,6],version_str:[3,6],nghttp2_on_stream_close_callback:[3,6,5],complet:[2,6,5,3],start_listen:2,bufferevent_openssl_get_ssl:[2,5],nghttp2_err_deferred_data_exist:[3,6],ssl_ctx_new:[2,5],zlib1g:4,ownership:[3,6],niv:[3,6,4],thu:[2,6,3],nghttp2_session_get_effective_local_window_s:[3,6],client:[0,2,3,4,5,6],thi:[0,1,2,3,4,5,6],endif:[2,6,1],gzip:[3,6,4],opaque_data:[3,6,4],protocol:[0,2,3,4,5,6],just:[2,6,4,5,3],"0x01":4,initiate_connect:5,ifdef:[2,6],previous:[3,6],easi:4,els:[2,5],applic:[2,6,4,5,3],initialize_nghttp2_sess:[2,5],specif:[2,6,5,3],arbitrari:[3,6],http2_session_data:[2,5],client_addr:2,manual:4,html:[0,6,4,3,2],tcp_nodelai:[2,5],unnecessari:5,underli:[2,5],www:[3,6],right:[2,6,5,1],deal:[2,6,5,1,3],on_frame_recv_parse_error_callback:[3,6],successfulli:[2,5],transmiss:[2,6,5,3],ni_numerichost:2,bottom:[3,6],nghttp2_data_source_read_callback:[3,6],buffer:[2,6,4,5,3],condit:[2,6,5,1,3],foo:4,localhost:4,particular:[2,6,5,1,3],sensibl:[3,6],repositori:[2,5],peer:[2,6,5,3],post:[3,6,4],decompressor:4,inlen_ptr:[3,6],nghttp2_submit_data:[3,6],nghttp2_settings_max_concurrent_stream:[2,6,5,3],produc:[3,6],evbuff:[2,5],encod:[2,6,4,3],down:[2,5],nghttp2_before_frame_send_callback:[3,6,5],errx:[2,5],nghttp2_on_end_headers_callback:[3,6],git:[0,6,4,3],session_send:[2,5],wai:[3,6,4],support:[2,6,4,5,3],verbos:4,call:[2,6,4,5,3],fork:4,head:[2,6,3],form:[3,6],offer:4,bev_event_connect:[2,5],"true":4,hddeflat:4,ssl_ctx_free:[2,5],maximum:[3,6,4],until:[3,6],deafult:4,autoconf:4,nghttp2_initial_window_s:[3,6],featur:4,httpbi:[0,4],"abstract":[2,5],unreleas:4,exist:[3,6,4],ai_flag:2,ends_with:2,check:[2,6,5,3],delete_http2_session_data:[2,5],when:[2,6,4,5,3],role:[2,6,5,3],test:[0,4],send_client_connection_head:5,unlimit:[3,6],intend:2,af_unspec:[2,5],nghttp2_max_window_s:[3,6],technot:[3,6],max_siz:4,evconnlistener_new_bind:2,longer:[2,4],ignor:[2,6,3],time:[2,6,4,3],push:[3,6,4],skip:[3,6],evbuffer_remov:2,nghttp2_on_frame_recv_callback:[3,6,5],nghttp2ver_h:1,decid:[3,6],create_ssl_ctx:[2,5],depend:[2,5],readabl:5,sourc:[0,6,5,3,2],string:[2,6,4,5,3],nghttp2_settings_enable_push:[3,6],level:[2,6,3],did:[3,6,5],item:4,settings_id:[3,6],conhead:2,prevent:[3,6],sign:4,port:[2,4,5],appear:[3,6,4],event_base_fre:[2,5],current:[2,6,4,3],gener:[3,6,4],address:4,nghttp2_submit_rst_stream:[2,6,3],connect_error:[3,6],queue:[2,6,5,3],behav:[3,6],ourselv:[2,5],nghttp2_err_goaway_already_s:[3,6],regardless:[3,6],extra:[4,5],modul:4,prefer:[3,6],instal:4,hdinflat:4,memori:[2,6,4,5,3],strdup:2,prev:2,reorder:[3,6,5],rst_stream:[2,6,5,3],ctype:2,nghttp2_submit_window_upd:[3,6],prepar:[3,6],stream_user_data:[3,6,5],cat:[2,6,5,3],descriptor:[2,6,3],can:[2,6,4,5,3],http2:[0,6,4,3],purpos:[2,6,5,1],uf_path:5,claim:[2,6,5,1],stream:[2,6,4,5,3],agent:4,abort:[3,6],nghttp2_header:[2,6,5,3],occur:[3,6],alwai:[2,6,3],multipl:[2,6,5,3],charset:4,ping:[3,6],write:[2,4,5],opt_set_mask:[3,6],max:5,intrus:2,mai:[2,6,4,5,3],acceptcb:2,data:[2,6,4,5,3],autotool:4,stdin:4,inform:[2,6,4,5,3],"switch":[2,4,5],aaaabaaaagqaaaahaad__w:4,talk:[2,4],nghttp2_err_stream_shut_wr:[3,6],size_t:[2,6,5,3],nghttp2_err_unsupported_vers:[3,6],still:[3,6,4],pointer:[2,6,3],entiti:2,disconnect:[2,5],precondit:[3,6],tort:[2,6,5,1],window:[3,6],main:[2,5],non:[2,6,4,5,3],recal:5,initi:[2,6,5,3],nghttp2_submit_head:[3,6],nghttp2_on_header_callback:[3,6],name:[2,6,4,5,3],version_num:[3,6],config:4,no_error:4,drop:[2,6,5,3],replac:[3,6],individu:[3,6],continu:[2,6,4,5,3],event_base_loop:[2,5],happen:[2,4,5],ai_addrlen:2,space:[3,6,4],output_length:4,nghttp2_flag_end_push_promis:[3,6],earlier:[2,4,5],event_base_new:[2,5],argv:[2,5],org:[0,6,4,3],"byte":[2,6,4,5,3],argc:[2,5],nghttp2_opt_no_auto_connection_window_upd:[3,6],nghttp2ver:[0,6,1,3],"88448504252dd5918485":4,befor:[2,6,4,5,3],thing:[2,6,5,3],nghttp2_flag_non:[2,6,5,3],place:[3,6],evdns_base_new:5,oper:[3,6,4],directli:[2,6,5,3],onc:[3,6],arrai:[3,6,4,5],yourself:4,nghttp2_flow_control_error:[3,6],submit:[3,6,5],on_frame_recv_callback:[2,6,5,3],open:[2,6,4,3],size:[2,6,4,3],avail:[2,6,4,5,3],given:[3,6],necessarili:[3,6],sigpip:[2,5],internal_error:[3,6],conveni:[3,6],ssl_ctx:[2,6,5,3],copi:[2,6,5,1,3],specifi:[2,6,4,5,3],github:[0,4],holder:[2,6,5,1],than:[2,6,4,3],serv:2,wide:2,nghttp2_session_get_outbound_queue_s:[3,6],were:[2,5],posit:[3,6],read_callback:[2,6,3],enhance_your_calm:[3,6],lowest:[3,6],sai:[3,6],pri:[3,6],ani:[2,1,3,4,5,6],bitwis:[3,6],event_bas:[2,5],nghttp2_flag_prior:[3,6],destroi:[2,5],payloadlen:[3,6],note:[2,4,5],take:[2,6,4,5,3],properti:[2,5],noth:[3,6],begin:5,sure:[2,4,5],normal:[3,6],track:[2,4,5],compress:[0,4],nghttp2_hcat_request:[2,6,5,3],pathlen:5,sublicens:[2,6,5,1],pair:[3,6,4],http2_select:[3,6],later:[2,6,5,3],gracefulli:5,show:[4,5],unprocess:[2,5],concurr:[2,6,3],permiss:[2,6,5,1],threshold:2,onli:[2,6,4,5,3],state:[2,6,4,3],"4e5535a027780":4,overwritten:[3,6],reset:5,variou:[3,6],get:[2,6,4,5,3],outlen:[3,6,5],ssl:[2,6,4,5,3],cannot:[2,6,3],nghttpd:4,requir:[0,6,4,3],nghttp2_set_stream_user_data:2,nghttp2_frame_size_error:[3,6],reserv:[3,6],detect:[3,6,4],"import":4,fcntl:2,pipefd:2,bump:[3,6],evdns_bas:5,typedef:[0,6,5,3,2],submit_request:5,region:[3,6],"0x000300":1,contract:[2,6,5,1],tutori:[0,5,2],deflatehd:4,mani:[3,6],nghttp2_data_provid:[2,6,3],unistd:[2,5],nghttp2_err_too_many_inflight_set:[3,6],cancel:[3,6],damag:[2,6,5,1],nghttp2_on_data_send_callback:[3,6],header_table_s:4,nghttp2_settings_max:[3,6],netdb:2,nghttp2_on_unknown_frame_recv_callback:[3,6],nghttp2_opt:[3,6],those:[2,6,5,3],"case":[2,6,4,5,3],hdr:[2,4,5],invok:[2,6,5,3],invoc:[2,6,3],on_data_chunk_recv_callback:[3,6,5],stdout:[4,5],ascii:[3,6],develop:[0,4],author:[2,6,4,5,1],bev_opt_defer_callback:[2,5],same:[2,6,4,5,3],ssl_library_init:[2,5],binari:5,pac:4,document:[0,1,2,4,5,6],finish:[2,5],decompress:[3,6,4],handshake_leftlen:2,extern:6,postpon:[3,6],macro:[0,6,1,3],without:[2,1,3,4,5,6],nghttp2_push_promis:[3,6],event2:[2,5],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],execut:4,multiplex:[2,4],struct:[0,6,5,3,2],hint:2,except:[3,6],identif:[3,6],on_data_send_callback:[3,6],nghttp2_select_next_protocol:[3,6,5],real:5,read:[2,6,4,5,3],nghttp2_version_ag:[3,6],next_proto_cb:2,integ:[3,6],server:[0,2,3,4,5,6],either:[2,6,3],output:[2,6,4,5,3],manag:2,stream_clos:[3,6],ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],nonzero:[2,6,3],easili:5,exit:[2,5],refer:[0,6,4,3],base64url:[3,6],nghttp2_session_server_new:[2,6,3],fulli:[3,6],getnameinfo:2,src:4,inflater_ptr:[3,6],ack:[3,6,4],dnsbase:5,settings_payload:[3,6],act:[2,5],routin:[2,5],no_auto_stream_window_upd:[3,6],least_vers:[3,6],error_repli:2,insuffici:[3,6],b2a_hex:4,nghttp2_hcat_respons:[3,6,5],hex:[2,4],start:[2,6,4,5,3],nghttp2_err_stream_clos:[3,6],low:[3,6],lot:[3,6],ipv6:4,strictli:[3,6],next_proto_list:2,nghttp2_proto_version_id_len:[2,6,3],nghttp2_err_invalid_st:[3,6],possibl:[2,6,5,3],"default":[2,6,4,3],hpack:[0,4],err_get_error:[2,5],connect:[2,1,3,4,5,6],creat:[2,6,4,5,3],mainli:[3,6],decreas:[3,6],file:[2,1,3,4,5,6],nghttp2_err_invalid_header_block:[3,6],fill:2,again:[3,6],functypedef:6,googl:4,field:[2,6,4,5,3],valid:[3,6,4],nghttp2_prioriti:[3,6],print_head:5,you:[2,6,4,5,3],sequenc:[2,6,4,5,3],reduc:[3,6],cunit:4,directori:[2,4,5],mask:[3,6],represent:[3,1],all:[2,6,5,1,3],on_unknown_frame_recv_callback:[3,6],illustr:4,nghttp2_err_start_stream_not_allow:[3,6],lack:[3,6],on_end_headers_callback:[3,6],follow:[2,1,3,4,5,6],ptr:[2,6,5,3],app_cont:2,uint8_t:[2,6,5,3],readcb:[2,5],program:[0,4,5,2],bufferevent_writ:[2,5],uf_queri:5,far:[2,5],settings_header_table_s:[3,6,4],nghttp2_client_connection_header_len:[2,6,5,3],failur:[3,6],veri:[3,6,5],no_auto_connection_window_upd:[3,6],"__cplusplu":6,list:[2,6,3],nghttp2_headers_categori:[3,6],adjust:[3,6],stderr:[2,4,5],small:[3,6],session_recv:2,zero:[3,6],pass:[3,6,5],further:[2,6,5,3],what:[3,6,4],sub:2,sun:4,sum:4,delet:5,version:[0,6,4,1,3],method:[2,6,4,5,3],libjansson:4,percentage_of_original_s:4,excess:2,modifi:[2,6,4,5,1],valu:[2,6,4,5,3],search:2,ai_addrconfig:2,nghttp2_err_push_dis:[3,6],prior:4,amount:[2,5],action:[2,6,5,1],via:4,primit:5,famili:[2,5],establish:[2,5],select:[3,6,4,5],regist:2,libev:[0,4,5,2],taken:[3,6],minor:[3,1],more:[2,6,4,5,3],tsujikawa:[2,6,5,1],nghttp2_settings_header_table_s:[3,6],nghttp2_pri_default:[3,6,5],flag:[2,6,4,5,3],sens:[3,6],known:[3,6],nghttp2_err_wouldblock:[2,6,5,3],endpoint:[3,6,4],dev:[4,1],remain:[2,6,5,3],share:4,accept:[2,6,4,3],minimum:2,ssl_op_al:[2,5],create_ssl:[2,5],strlen:[2,5],huge:[2,5],netinet:[2,5],secur:4,anoth:[3,6],serveraddr:4,reject:[3,6],sec9:[3,6],simpl:[2,6,5,3],resourc:[0,6,4,5,3],referenc:4,variant:[3,6],spdylai:4,associ:[2,1,3,4,5,6],"short":[2,5],caus:[3,6],callback:[2,6,5,3],alpn:[3,6,4],authroiti:5,hypertext:[0,4],libcunit1:4,through:[2,4],left:[3,6],paramet:[3,6,5],style:4,nghttp2_hcat_push_respons:[3,6],pend:[2,6,5,3],nghttp2_err_eof:[3,6],progoram:5,valuelen:[2,6,5,3],"0x010203":[3,1],"return":[2,6,4,5,3],check_path:2,synopsi:[2,5],nghttp2_initial_max_concurrent_stream:[3,6],readlen:2,nghttp2_err_callback_failur:[2,6,5,3],tear:[2,5],achiev:[2,6,3],found:[2,6,3],trailer:[3,6],nghttp2_on_frame_send_callback:[3,6],monoton:5,realli:5,expect:4,field_set:5,event:[2,6,5,1],app_ctx:2,publish:[2,6,5,1],payload:[3,6],etag:4,print:[4,5],on_frame_not_send_callback:[3,6],proxi:[0,4],differ:[3,6],effect:[3,6],reason:[2,6,3],base:[2,4,5],put:[3,6],nghttp2_session_mem_recv:[2,6,5,3],nghttp2_flag:[3,6],recv:4,thread:[2,4],omit:[3,6,5],nghttp2_err_invalid_stream_st:[3,6],assign:[2,6,5,3],feed:[2,5],major:[3,1],notifi:2,number:[2,6,1,3],"0x8":[3,6],done:[2,4,5],stdlib:6,nghttp2_internal_error:[2,6,3],script:4,data_prd:[2,6,3],nghttp2_session_get_stream_user_data:[2,6,5,3],least:[3,6,4],scheme:[4,5],store:[2,6,5,3],input_length:4,memset:[2,5],option:[2,6,4,5,3],similarli:[3,6],nghttp2_client_connection_head:[2,6,5,3],pars:[3,6,5],kind:[2,6,5,1,3],doubli:2,remot:[2,6,4,5,3],remov:[2,6,3],bridg:4,ai_next:2,consumpt:[2,5],nghttp2_error:[3,6],window_size_incr:[3,6,4],lib_error_cod:[3,6],arrlen:[2,5],packag:4,"null":[2,6,5,3],nghttp2_on_frame_recv_parse_error_callback:[3,6],syn_stream:[3,6],sell:[2,6,5,1],outbound:[3,6],equival:[3,6],self:4,also:[2,6,4,5,3],build:[0,4,5],nghttp2_err_frame_size_error:[3,6],make_nv:[2,5],distribut:[2,6,5,1],reacb:5,reach:[3,6],chart:[3,6],most:[3,6],vnu:4,charg:[2,6,5,1],addr:2,"01881f3468e5891afcbf83868a3d856659c62e3f":4,compar:[3,6,5],frame_size_error:[3,6,4],session:[2,6,5,3],nghttp2_submit_push_promis:[3,6],copyright:[2,6,5,1],refused_stream:[3,6],nghttp2_opt_no_auto_stream_window_upd:[3,6],queu:[2,6,5,3],express:[2,6,5,1],window_upd:[3,6,4],liabl:[2,6,5,1],before_frame_send_callback:[3,6,5],retreiv:5,crt:2,certif:[2,4,5],set:[2,6,4,5,3],seq:4,sep:4,ousid:4,remove_stream:2,nghttp2_submit_goawai:[3,6],arg:[2,6,5,3],close:[2,6,4,5,3],analog:[3,6],strchr:2,someth:[3,6],won:[2,6,3],hold:[3,6],nghttp2_on_data_chunk_recv_callback:[3,6,5],numer:[3,6,1],succeed:[3,6],percent_decod:2,both:[2,6,4,5,3],last:[3,6,4],delimit:4,nghttp2_session_want_writ:[2,6,5,3],tempor:[3,6],context:[2,6,4,5,3],compression_error:[3,6],whole:[3,6],simpli:[2,5],point:[2,6,5,3],header:[0,2,3,4,5,6],shutdown:[2,6,5,3],suppli:[3,6],nghttp2_session:[2,6,5,3],backend:4,due:[3,6],empti:[2,6,4,5,3],send_respons:2,whom:[2,6,5,1],stdint:6,add_stream:2,flight:[3,6],nghttp2_err_nomem:[3,6],settings_enable_push:[3,6,4],nghttp2_session_terminate_sess:[3,6,5],buflen:[3,6],func:6,next_proto_list_len:2,look:[2,5],"while":[2,6,5,3],behavior:[3,6],error:[2,6,4,5,3],loop:[2,5],malloc:[2,5],nghttp2_session_callback:[2,6,5,3],readi:2,user_data:[2,6,5,3],itself:[2,6,5,3],flow_control_error:[3,6],grant:[2,6,5,1],belong:[3,6],create_http2_session_data:[2,5],decod:[2,6,3],uf_schema:5,mytyp:[3,6],inflat:[3,6,4],alert:4,moment:4,user:[3,6,4,5],implement:[0,2,3,4,5,6],nghttp2_h:6,noninfring:[2,6,5,1],entri:[3,6,4],nghttp:4,person:[2,6,5,1],uint32_t:[3,6],hd_side_request:4,end_push_promis:[3,6],nghttp2_gzip_infl:[3,6],on_frame_send_callback:[3,6],nghttp2_ping:[3,6],input:[2,6,4,5,3],subsequ:[3,6],bin:4,format:[2,6,4,5,3],http_parser:5,bit:[3,6,1],strstr:2,signal:[2,6,5,3],api:[0,6,3],some:[2,6,5,3],back:[3,6],sampl:4,sizeof:[2,5],libssl:4,lev_opt_reus:2,though:4,per:[3,6],larg:[3,6],make_nv2:5,machin:4,run:[2,6,4,5,3],step:[3,6],handshake_readcb:2,idl:[3,6],block:[2,6,4,5,3],nghttp2_err_paus:[3,6],nsm:6,within:4,nghttp2_send_callback:[3,6,5],nghttp2_opt_set:[3,6],occupi:4,inclus:[3,6],errno:2,bodi:[2,6,5,3],"long":[3,6],nghttp2:[0,1,2,3,4,5,6],includ:[0,1,2,3,4,5,6],forward:4,session_ptr:[3,6],link:[2,4],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],line:4,concaten:[3,6],utf:4,caller:[2,6,3],nghttpx:4,clear:[3,6],parser:5,repres:[3,6],"char":[2,6,5,3],incomplet:4,sublen:2,titl:2,invalid:[3,6],librari:[0,1,2,3,4,5,6],libtool:4,create_http2_stream_data:[2,5],algorithm:[3,6],nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],getaddrinfo:2,code:[2,6,4,5,3],queri:5,nghttp2_frame_hd:[3,6],cython:4,privat:2,send:[2,6,4,5,3],http_parser_url:5,lower:[3,6],aris:[2,6,5,1],fatal:[2,6,5,3],sent:[2,6,5,3],nghttp2_submit_p:[3,6],untouch:[3,6],relev:[2,5],tri:[3,6],magic:[2,5],http_parser_parse_url:5,"try":4,freed:4,pleas:[2,4,5],impli:[2,6,5,1],smaller:4,snprintf:5,"0x1":[3,6],"0x0":[3,6],"0x4":[3,6],download:[0,4],index:4,o_rdonli:2,settings_flow_control_opt:[3,6],access:4,experiment:[0,4],inspect:[3,6],ssl_ctx_set_opt:[2,5],nghttp2_enhance_your_calm:[3,6],len:[2,6,5,3],closur:[3,6,5],nghttp2_rst_stream:[3,6],ubuntu:4,becom:[2,6,1,3],sinc:[2,6,4,5,3],remark:[0,3],larger:[3,6],settings_payloadlen:[3,6],autoreconf:4,jansson:4,greac:[2,5],chang:[2,6,3],output_wouldblock_threshold:2,appli:[3,6],bufferev:[2,5],from:[0,1,2,3,4,5,6],commun:[2,4,5],binascii:4,upgrad:[3,6,4],next:[2,6,4,5,3],findproxyforurl:4,usr:4,nghttp2_nv:[2,6,5,3],jxck:4,goawai:[2,6,4,5,3],deflat:[3,6,4],account:[3,6,4,5],retriev:[2,6,5,3],tunnel:4,nghttp2_settings_id:[3,6],sslv23_client_method:5,control:[3,6],process:[2,6,4,5,3],fprintf:[2,5],onlin:[3,4],serial:[2,6,5,3],evdns_base_fre:5,nghttp2_session_want_read:[2,6,5,3],ssl_ctx_use_privatekey_fil:2,evbas:[2,5],instead:[3,6],nullifi:[3,6],npn:[2,6,4,5,3],eventcb:[2,5],nghttp2_compression_error:[3,6],alloc:[2,6,3],bind:[0,4],nvlen:[2,6,5,3],correspond:[2,4],element:[2,6,3],issu:[0,6,3],stream_id:[2,6,4,5,3],nghttp2_connect_error:[3,6],ssize_t:[2,6,5,3],furnish:[2,6,5,1],move:[3,6],max_outlen:[3,6],therefor:[3,6,5],nghttp2_session_send:[2,6,5,3],inlen:[3,6,5],recept:[2,6,5,3],crash:3,greater:[3,6],handl:[2,6,5,3],nghttp2_goawai:[3,6],handi:5,automat:[3,6],anyth:5,uf_port:5,mode:4,ssl_filetype_pem:2,chunk:[3,6,5],nghttp2_err_temporal_callback_failur:[2,6,3],"static":[2,6,4,5,3],our:5,patch:[3,1],out:[2,1,3,4,5,6],variabl:4,req:[3,6],categori:[3,6,5],suitabl:[3,6],rel:2,field_data:5,recv_callback:[3,6],insid:4,releas:[0,1,3],could:[2,6,5,3],keep:[2,6,4,5,3],length:[2,6,4,5,3],outsid:[3,4],retain:[3,6],softwar:[2,6,5,1],addrinfo:2,date:4,prioriti:[3,6,5],unknown:[2,6,3],system:[2,5],messag:[3,6,5],attach:[2,5],termin:[2,6,4,5,3],"final":[3,6],ipv4:4,sa_handl:[2,5],enqueu:5,exactli:[2,4],nghttp2_err_header_comp:[3,6],see:[2,6,4,5,3],structur:[2,6,5,3],charact:[2,6,5,3],nghttp2_session_del:[2,6,5,3],bev:[2,5],ssl_new:[2,5],"function":[0,2,3,4,5,6],bufferevent_get_input:[2,5],fail:[3,6],have:[2,6,4,5,3],tabl:[3,6,4],need:[3,6,4,5],ai_socktyp:2,"0x04":4,"0x05":4,"0x00":4,nghttp2_err_flow_control:[3,6],nghttp2_refused_stream:[3,6],evbuffer_pullup:[2,5],which:[2,6,4,5,3],singl:[2,6,4,3],opaque_data_len:[3,6],unless:[3,6],bufferevent_openssl_socket_new:[2,5],settings_max_concurrent_stream:[2,6,4,5,3],stream_data:[2,5],deploi:4,"class":4,nghttp2_error_cod:[2,6,5,3],nghttp2_err_stream_id_not_avail:[3,6],url:[2,4],request:[2,6,4,5,3],uri:[4,5],pipe:2,determin:4,nghttp2_pack_settings_payload:[3,6],ssl_load_error_str:[2,5],text:4,bufferevent_get_output:[2,5],redirect:5,locat:5,should:[2,6,5,3],local:[3,6],meant:5,familiar:4,memcpi:[2,5],nghttp2_session_client_new2:[3,6],settings_initial_window_s:[3,6,4],nghttp2_data:[3,6],increas:[3,6,5],portion:[2,6,5,1,3],nghttp2_submit_respons:[2,6,3],enabl:[3,6,4],whether:[2,6,5,1],stuff:[3,6],contain:[2,6,4,5,3],nghttp2_window_upd:[3,6],frame:[2,6,4,5,3],knowledg:4,temporarili:[3,6],statu:[0,6,4,3,2],wire:[2,4,5],correctli:[3,6],nghttp2_settings_entri:[2,6,5,3],written:[2,6,4,5,3],https_uri:5,nghttp2_initial_connection_window_s:[3,6],kei:[2,6,4,3],supporet:4,entir:[2,6,3],last_stream_id:[3,6,4],addit:[2,6,3],file_read_callback:2,nghttp2_proto_version_id:[2,6,5,3],equal:2,etc:[2,4,5],instanc:[3,6],on_request_recv_callback:[2,6,3],uint16_t:[3,6,5],rfc2616:[3,6],commenc:5,respect:5,nghttp2_recv_callback:[3,6],ssl_ctx_set_next_proto_select_cb:[3,6,5],adjsut:4,compon:5,json:4,treat:[2,6,3],nghttp2_err_invalid_argu:[3,6],immedi:[3,6],nghttp2_hcat_head:[3,6],sock_stream:2,evconnlisten:2,on_header_callback:[3,6],multi:4,defin:[2,6,5,1,3],eintr:2,helper:[3,6],libxml2:4,squid:4,select_next_proto_cb:[3,6,5],archiv:[2,5],substanti:[2,6,5,1],incom:[2,6,4,3],let:[2,5],member:[2,6,3],python:[0,4],ifndef:[6,1],dyanmic:4,http:[0,1,2,3,4,5,6],hostnam:4,denot:[3,6,5],uf_host:5,dealloc:4,peer_max_concurrent_stream:[3,6],off:5,well:[2,5],app_context:2,inflatehd:4,exampl:[2,6,4,5,3],command:4,error_cod:[2,6,4,5,3],nghttp2_data_sourc:[2,6,3],usual:[3,6],paus:[3,6],less:[3,6],nghttp2_on_data_recv_callback:[3,6],send_callback:[2,6,5,3],half:[3,6],obtain:[2,6,5,1],tcp:[2,5],web:[2,4],cert_fil:2,send_server_connection_head:2,priorit:[3,6],addrlen:2,add:[2,6,3],match:[2,5],gmt:4,know:[3,6],nva:[2,6,5,3],python3:4,resid:[2,5],like:[2,6,4,5,3],success:4,nghttp2_pri_lowest:[3,6],nghttp2_flag_end_head:[3,6],necessari:2,tlen:[3,6],page:[2,5],revers:4,nghttp2_session_client_new:[3,6,5],"export":2,nghttp2_session_get_effective_recv_data_length:[3,6],error_html:2,transport:5,lead:[3,6],avoid:[2,6,5,3],octet:[2,6,5,3],overlap:[3,6],isxdigit:2,outgo:[2,6,3],nghttp2_session_upgrad:[3,6],delete_http2_stream_data:[2,5],"enum":[0,6,3],usag:[2,6,4,5,3],host:[0,4,5,2],nghttp2_nv_compare_nam:[3,6],about:[2,6,5,3],actual:[2,6,5,3],socket:[2,4,5],nghttp2_gzip:[3,6],chrome:4,fals:4,ssl_tlsext_err_ok:[2,6,5,3],disabl:[3,6,4],on_data_recv_callback:[3,6],nghttp2_err_invalid_fram:[3,6],ssl_op_no_sslv2:[2,5],warranti:[2,6,5,1],automak:4,merg:[2,6,5,1],val:[2,5],ai_famili:2,transfer:[0,6,4,3],intention:[3,6],much:2,buz:4,unexpect:[3,6],bufferevent_fre:[2,5],overflow:[3,6],highest:[3,6],buf:[2,6,3],count:[3,6],succe:[3,6],nghttp2_stream_clos:[3,6],nghttp2_info:[3,6],googlecod:[3,6],displai:4,asynchron:[3,6],limit:[2,6,5,1],otherwis:[2,1,3,4,5,6],problem:[3,6],sockaddr:2,nghttp2_on_frame_not_send_callback:[3,6],strndup:5,"int":[2,6,5,3],nghttp2_flag_end_stream:[3,6],allow:[3,6,4],percent:2,detail:[3,6],other:[2,6,5,1,3],futur:[3,6],rememb:[2,5],outlen_ptr:[3,6],stat:2,err_error_str:[2,5],nghttp2_opt_peer_max_concurrent_stream:[3,6],rel_path:2,proto_str:[3,6],debian:4,session_data:[2,5],sphinx:4,eof:[2,6,3],reliabl:[3,6],indirectli:3,nghttp2_no_error:[3,6,5]},objtypes:{"0":"c:member","1":"c:macro","2":"c:type","3":"c:function"},titles:["nghttp2 - HTTP/2.0 C Library","nghttp2ver.h","Tutorial: HTTP/2.0 server","API Reference","nghttp2 - HTTP/2.0 C Library","Tutorial: HTTP/2.0 client","nghttp2.h"],objnames:{"0":["c","member","C member"],"1":["c","macro","C macro"],"2":["c","type","C type"],"3":["c","function","C function"]},filenames:["index","nghttp2ver.h","tutorial-server","apiref","package_README","tutorial-client","nghttp2.h"]}) \ No newline at end of file +Search.setIndex({objects:{"":{NGHTTP2_ERR_INVALID_STATE:[3,1,1,""],NGHTTP2_ERR_HEADER_COMP:[3,1,1,""],NGHTTP2_SETTINGS_HEADER_TABLE_SIZE:[3,1,1,""],nghttp2_settings_entry:[3,2,1,""],NGHTTP2_INTERNAL_ERROR:[3,1,1,""],NGHTTP2_PRI_LOWEST:[3,1,1,""],nghttp2_on_frame_recv_callback:[3,2,1,""],NGHTTP2_CLIENT_CONNECTION_HEADER_LEN:[3,1,1,""],nghttp2_goaway:[3,2,1,""],nghttp2_ping:[3,2,1,""],NGHTTP2_ERR_INVALID_FRAME:[3,1,1,""],nghttp2_frame_type:[3,2,1,""],nghttp2_on_data_recv_callback:[3,2,1,""],nghttp2_select_next_protocol:[3,3,1,""],NGHTTP2_ERR_INVALID_HEADER_BLOCK:[3,1,1,""],nghttp2_session_callbacks:[3,2,1,""],NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS:[3,1,1,""],NGHTTP2_ERR_PROTO:[3,1,1,""],NGHTTP2_MAX_HEADER_TABLE_SIZE:[3,1,1,""],nghttp2_submit_window_update:[3,3,1,""],NGHTTP2_ERR_UNSUPPORTED_VERSION:[3,1,1,""],NGHTTP2_SETTINGS_ENABLE_PUSH:[3,1,1,""],nghttp2_window_update:[3,2,1,""],NGHTTP2_DATA:[3,1,1,""],nghttp2_frame_hd:[3,2,1,""],NGHTTP2_ERR_INVALID_STREAM_STATE:[3,1,1,""],nghttp2_on_header_callback:[3,2,1,""],NGHTTP2_FLAG_ACK:[3,1,1,""],NGHTTP2_STREAM_CLOSED:[3,1,1,""],NGHTTP2_SETTINGS_MAX:[3,1,1,""],NGHTTP2_MAX_WINDOW_SIZE:[3,1,1,""],nghttp2_headers_category:[3,2,1,""],nghttp2_error_code:[3,2,1,""],nghttp2_send_callback:[3,2,1,""],nghttp2_on_data_chunk_recv_callback:[3,2,1,""],NGHTTP2_ERR_START_STREAM_NOT_ALLOWED:[3,1,1,""],NGHTTP2_ERR_FLOW_CONTROL:[3,1,1,""],nghttp2_strerror:[3,3,1,""],nghttp2_gzip_inflate_del:[3,3,1,""],NGHTTP2_ERR_FATAL:[3,1,1,""],nghttp2_submit_goaway:[3,3,1,""],NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE:[3,1,1,""],NGHTTP2_ERR_NOMEM:[3,1,1,""],NGHTTP2_ERR_PAUSE:[3,1,1,""],nghttp2_session_client_new:[3,3,1,""],nghttp2_on_request_recv_callback:[3,2,1,""],NGHTTP2_GOAWAY:[3,1,1,""],NGHTTP2_NO_ERROR:[3,1,1,""],NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS:[3,1,1,""],nghttp2_session_server_new2:[3,3,1,""],NGHTTP2_ERR_DEFERRED:[3,1,1,""],nghttp2_push_promise:[3,2,1,""],NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE:[3,1,1,""],nghttp2_session_get_outbound_queue_size:[3,3,1,""],NGHTTP2_PROTO_VERSION_ID_LEN:[3,1,1,""],NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS:[3,1,1,""],nghttp2_data_source_read_callback:[3,2,1,""],NGHTTP2_SETTINGS_TIMEOUT:[3,1,1,""],nghttp2_before_frame_send_callback:[3,2,1,""],NGHTTP2_ERR_WOULDBLOCK:[3,1,1,""],nghttp2_session_resume_data:[3,3,1,""],NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:[3,1,1,""],NGHTTP2_PRI_DEFAULT:[3,1,1,""],nghttp2_session_server_new:[3,3,1,""],NGHTTP2_FLAG_END_PUSH_PROMISE:[3,1,1,""],NGHTTP2_ERR_INVALID_ARGUMENT:[3,1,1,""],NGHTTP2_ERR_FRAME_SIZE_ERROR:[3,1,1,""],nghttp2_session_del:[3,3,1,""],nghttp2_submit_rst_stream:[3,3,1,""],nghttp2_flag:[3,2,1,""],nghttp2_recv_callback:[3,2,1,""],NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS:[3,1,1,""],NGHTTP2_HCAT_REQUEST:[3,1,1,""],NGHTTP2_FLAG_END_HEADERS:[3,1,1,""],nghttp2_gzip:[3,2,1,""],NGHTTP2_RST_STREAM:[3,1,1,""],nghttp2_rst_stream:[3,2,1,""],NGHTTP2_HCAT_HEADERS:[3,1,1,""],NGHTTP2_VERSION_NUM:[3,1,1,""],NGHTTP2_SETTINGS:[3,1,1,""],nghttp2_frame:[3,2,1,""],nghttp2_submit_push_promise:[3,3,1,""],nghttp2_session_mem_recv:[3,3,1,""],NGHTTP2_ERR_DEFERRED_DATA_EXIST:[3,1,1,""],NGHTTP2_CANCEL:[3,1,1,""],NGHTTP2_REFUSED_STREAM:[3,1,1,""],NGHTTP2_ERR_INVALID_STREAM_ID:[3,1,1,""],nghttp2_on_frame_send_callback:[3,2,1,""],NGHTTP2_ENHANCE_YOUR_CALM:[3,1,1,""],nghttp2_opt_set:[3,2,1,""],NGHTTP2_VERSION:[3,1,1,""],NGHTTP2_COMPRESSION_ERROR:[3,1,1,""],NGHTTP2_HCAT_PUSH_RESPONSE:[3,1,1,""],nghttp2_on_end_headers_callback:[3,2,1,""],nghttp2_submit_headers:[3,3,1,""],NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE:[3,1,1,""],nghttp2_session_get_stream_user_data:[3,3,1,""],NGHTTP2_FLAG_PRIORITY:[3,1,1,""],nghttp2_on_data_send_callback:[3,2,1,""],nghttp2_nv:[3,2,1,""],nghttp2_on_invalid_frame_recv_callback:[3,2,1,""],nghttp2_version:[3,3,1,""],nghttp2_on_unknown_frame_recv_callback:[3,2,1,""],NGHTTP2_ERR_STREAM_CLOSED:[3,1,1,""],nghttp2_opt:[3,2,1,""],NGHTTP2_FLAG_END_STREAM:[3,1,1,""],NGHTTP2_ERR_CALLBACK_FAILURE:[3,1,1,""],NGHTTP2_FLOW_CONTROL_ERROR:[3,1,1,""],nghttp2_session_set_stream_user_data:[3,3,1,""],NGHTTP2_ERR_STREAM_CLOSING:[3,1,1,""],nghttp2_settings:[3,2,1,""],nghttp2_info:[3,2,1,""],NGHTTP2_PROTO_VERSION_ID:[3,1,1,""],nghttp2_settings_id:[3,2,1,""],NGHTTP2_HEADERS:[3,1,1,""],nghttp2_session_send:[3,3,1,""],NGHTTP2_PROTOCOL_ERROR:[3,1,1,""],nghttp2_gzip_inflate:[3,3,1,""],nghttp2_session_upgrade:[3,3,1,""],NGHTTP2_ERR_GOAWAY_ALREADY_SENT:[3,1,1,""],NGHTTP2_ERR_INSUFF_BUFSIZE:[3,1,1,""],nghttp2_error:[3,2,1,""],nghttp2_on_frame_not_send_callback:[3,2,1,""],nghttp2_session_get_effective_recv_data_length:[3,3,1,""],nghttp2_submit_response:[3,3,1,""],NGHTTP2_CLIENT_CONNECTION_HEADER:[3,1,1,""],NGHTTP2_FLAG_NONE:[3,1,1,""],nghttp2_session_terminate_session:[3,3,1,""],nghttp2_on_frame_recv_parse_error_callback:[3,2,1,""],nghttp2_submit_settings:[3,3,1,""],NGHTTP2_HCAT_RESPONSE:[3,1,1,""],NGHTTP2_PING:[3,1,1,""],NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE:[3,1,1,""],nghttp2_priority:[3,2,1,""],nghttp2_session_want_read:[3,3,1,""],NGHTTP2_VERSION_AGE:[3,1,1,""],NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,1,""],NGHTTP2_CONNECT_ERROR:[3,1,1,""],nghttp2_submit_data:[3,3,1,""],nghttp2_on_stream_close_callback:[3,2,1,""],NGHTTP2_PUSH_PROMISE:[3,1,1,""],nghttp2_data_provider:[3,2,1,""],NGHTTP2_ERR_PUSH_DISABLED:[3,1,1,""],nghttp2_session_recv:[3,3,1,""],nghttp2_session_get_effective_local_window_size:[3,3,1,""],NGHTTP2_INITIAL_WINDOW_SIZE:[3,1,1,""],NGHTTP2_ERR_EOF:[3,1,1,""],NGHTTP2_WINDOW_UPDATE:[3,1,1,""],NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS:[3,1,1,""],nghttp2_session_want_write:[3,3,1,""],nghttp2_submit_priority:[3,3,1,""],nghttp2_session_client_new2:[3,3,1,""],nghttp2_headers:[3,2,1,""],nghttp2_session:[3,2,1,""],nghttp2_session_get_stream_effective_local_window_size:[3,3,1,""],NGHTTP2_ERR_GZIP:[3,1,1,""],nghttp2_submit_ping:[3,3,1,""],NGHTTP2_FRAME_SIZE_ERROR:[3,1,1,""],nghttp2_gzip_inflate_new:[3,3,1,""],NGHTTP2_ERR_STREAM_SHUT_WR:[3,1,1,""],NGHTTP2_PRIORITY:[3,1,1,""],nghttp2_submit_request:[3,3,1,""],nghttp2_session_get_stream_effective_recv_data_length:[3,3,1,""],nghttp2_pack_settings_payload:[3,3,1,""],nghttp2_data_source:[3,2,1,""],nghttp2_nv_compare_name:[3,3,1,""]},nghttp2_session_callbacks:{before_frame_send_callback:[3,0,1,""],on_invalid_frame_recv_callback:[3,0,1,""],on_stream_close_callback:[3,0,1,""],on_data_chunk_recv_callback:[3,0,1,""],on_unknown_frame_recv_callback:[3,0,1,""],send_callback:[3,0,1,""],on_frame_send_callback:[3,0,1,""],on_end_headers_callback:[3,0,1,""],on_frame_recv_callback:[3,0,1,""],on_request_recv_callback:[3,0,1,""],on_data_send_callback:[3,0,1,""],on_header_callback:[3,0,1,""],on_frame_not_send_callback:[3,0,1,""],nghttp2_on_frame_recv_parse_error_callback:[3,0,1,""],on_data_recv_callback:[3,0,1,""],recv_callback:[3,0,1,""]},nghttp2_frame:{push_promise:[3,0,1,""],settings:[3,0,1,""],ping:[3,0,1,""],rst_stream:[3,0,1,""],priority:[3,0,1,""],headers:[3,0,1,""],goaway:[3,0,1,""],window_update:[3,0,1,""],hd:[3,0,1,""]},nghttp2_ping:{hd:[3,0,1,""]},nghttp2_data_provider:{source:[3,0,1,""],read_callback:[3,0,1,""]},nghttp2_priority:{pri:[3,0,1,""],hd:[3,0,1,""]},nghttp2_settings_entry:{settings_id:[3,0,1,""],value:[3,0,1,""]},nghttp2_window_update:{hd:[3,0,1,""],window_size_increment:[3,0,1,""]},nghttp2_frame_hd:{stream_id:[3,0,1,""],length:[3,0,1,""],type:[3,0,1,""],flags:[3,0,1,""]},nghttp2_info:{age:[3,0,1,""],version_str:[3,0,1,""],version_num:[3,0,1,""],proto_str:[3,0,1,""]},nghttp2_rst_stream:{error_code:[3,0,1,""],hd:[3,0,1,""]},nghttp2_nv:{valuelen:[3,0,1,""],namelen:[3,0,1,""],name:[3,0,1,""],value:[3,0,1,""]},nghttp2_headers:{nvlen:[3,0,1,""],pri:[3,0,1,""],hd:[3,0,1,""],nva:[3,0,1,""],cat:[3,0,1,""]},nghttp2_opt_set:{no_auto_stream_window_update:[3,0,1,""],peer_max_concurrent_streams:[3,0,1,""],no_auto_connection_window_update:[3,0,1,""]},nghttp2_goaway:{opaque_data:[3,0,1,""],error_code:[3,0,1,""],opaque_data_len:[3,0,1,""],hd:[3,0,1,""],last_stream_id:[3,0,1,""]},nghttp2_data_source:{fd:[3,0,1,""],ptr:[3,0,1,""]},nghttp2_push_promise:{promised_stream_id:[3,0,1,""],nvlen:[3,0,1,""],nva:[3,0,1,""],hd:[3,0,1,""]},nghttp2_settings:{niv:[3,0,1,""],hd:[3,0,1,""],iv:[3,0,1,""]}},terms:{my_obj:[3,6],nghttp2_io_flag:6,nghttp2_cancel:[3,6],opt_set:[3,6],prefix:[2,6,3],nghttp2_session_get_stream_effective_local_window_s:[3,6],"const":[2,6,5,3],nghttp2_submit_:[2,5],under:[3,6,4],bufferevent_getfd:5,spec:[3,6],merchant:[2,6,5,1],digit:5,"void":[2,6,5,3],bufferevent_ssl:[2,5],initialize_nghttp2_setup:[2,5],verif:5,nghttp2_settings_initial_window_s:[3,6],warnx:[2,5],on_stream_close_callback:[2,6,5,3],direct:4,ssl_op_no_session_resumption_on_renegoti:[2,5],neg:[3,6],nghttp2_err_insuff_bufs:[3,6],"new":[2,6,4,5,3],tatsuhiro:[0,1,2,4,5,6],nghttp2_session_resume_data:[3,6],ipproto_tcp:[2,5],abov:[2,1,3,4,5,6],initialize_app_context:2,here:[2,6,4,5,3],met:[2,6,5,3],path:[2,4,5],settings_timeout:[3,6],interpret:[3,6],nextprotoneg:[3,6],sslv23_server_method:2,permit:[2,6,5,1],nghttp2_submit_prior:[3,6],aka:[3,6,4],nghttp2_err_gzip:[3,6],nghttp2_frame:[2,6,5,3],bufferevent_ssl_connect:5,substr:2,bev_event_error:[2,5],bufferevent_socket_connect_hostnam:5,unit:4,describ:[2,6,5,3],would:[3,6],call:[2,6,4,5,3],asset:4,nghttp2_on_invalid_frame_recv_callback:[3,6],nghttp2_version:[3,6,1],type:[0,2,3,4,5,6],tell:[2,6,5,3],relat:[2,5],notic:[2,6,5,1],warn:2,ssl_shutdown:[2,5],herebi:[2,6,5,1],unpack:[3,6],must:[2,6,4,5,3],word:[3,6],err:[2,5],exit_failur:[2,5],setup:[2,5],work:[2,4],lev_opt_close_on_fre:2,nghttp2_flag_ack:[3,6],root:[2,4],syn_repli:[3,6],defer:[2,6,5,3],give:[3,6],indic:[2,6,4,5,3],want:[2,6,5,3],unsign:[2,6,5,3],nghttp2_settings_flow_control_opt:[3,6],end:[2,5],datalen:[2,5],how:5,nghttp2_err_fat:[3,6],nghttp2_frame_typ:[3,6],updat:[3,6],nghttp2_msg_more:6,nghttp2_on_request_recv_callback:[3,6],after:[2,6,4,5,3],befor:[2,6,4,5,3],demonstr:5,request_path:2,attempt:[3,6],third:[2,6,5,3],opaqu:[3,6],exclud:[3,6],receiv:[2,6,5,3],first:[2,6,4,5,3],order:[2,6,4,3],frontend:4,over:[2,4,5],becaus:[2,6,5,3],eagain:[2,5],vari:4,fit:[2,6,5,1],fwrite:5,deflate_s:4,hidden:[3,6],them:[2,6,5,3],thei:[2,6,4,5,3],safe:[2,6,3],"break":[2,6,5,3],promis:[3,6],choic:[3,6],ai_addr:2,timeout:[2,5],each:[2,6,4,5,3],debug:[3,6,5],side:[2,6,3],mean:[3,6,4,5],slen:2,protocol_error:[3,6],http2_stream_data:[2,5],nghttp2_session_server_new2:[3,6],network:[2,5],content:[0,4,2],end_stream:[3,6,4],situat:[2,5],free:[2,6,5,1,3],spdy:[3,6,4],openssl:[2,4,5],nghttp2_version_num:[3,6,1],sigact:[2,5],rang:[3,6,4],restrict:[2,6,5,1],nghttp2_protocol_error:[3,6],alreadi:[2,6,5,3],opaque_data:[3,6,4],payload:[3,6],nghttp2_max_header_table_s:[3,6],too:[2,6,3],memcmp:2,sigpip:[2,5],listen:[2,4],tool:[0,4],travers:2,compressor:4,target:[3,6,4],provid:[2,1,3,4,5,6],project:[0,4],increment:[3,6],nghttp2_session_recv:[3,6],nghttp2_session_get_stream_effective_recv_data_length:[3,6],transmit:[3,6,5],sig_ign:[2,5],shall:[2,6,5,1],object:[2,6,4,5,3],writecb:[2,5],nghttp2_settings_timeout:[3,6],prematur:5,simplic:5,don:[2,6,3],hex_to_uint:2,doc:4,flow:[3,6],doe:[2,6,4,5,3],nghttp2_gzip_inflate_new:[3,6],on_invalid_frame_recv_callback:[3,6],bev_event_eof:[2,5],pkg:4,identifi:[2,6,5,3],bufferevent_setcb:[2,5],explain:5,configur:[3,6,4],apach:4,nghttp2_err_invalid_stream_id:[3,6],busi:[2,5],oct:4,nghttp2_err_proto:[3,6],authoritylen:5,stop:[2,5],end_head:[3,6,4],evbuffer_drain:[2,5],nghttp2_no_error:[3,6,5],bar:4,ai_pass:2,ietf:[0,4],baz:4,push_promis:[3,6],method:[2,6,4,5,3],nghttp2_strerror:[2,6,5,3],nghttp2_gzip_inflate_del:[3,6],bufferevent_ssl_accept:2,nul:[3,6],result:[2,6,5,3],respons:[2,6,4,5,3],corrupt:5,key_fil:2,subject:[2,6,5,1],said:[3,6],figur:4,bev_opt_close_on_fre:[2,5],accord:[3,6],extens:[4,5],advertis:[2,5],setsockopt:[2,5],against:[3,6],ssl_ctx_use_certificate_chain_fil:2,header_t:4,logic:2,enhance_your_calm:[3,6],com:[0,6,4,3],int32_t:[2,6,5,3],assum:[3,6],duplic:[3,6],reciev:5,liabil:[2,6,5,1],evbuffer_get_length:[2,5],union:[0,6,3,2],max_deflate_s:4,been:[2,6,5,3],trigger:[3,6],interest:[2,4,5],basic:4,tini:5,life:2,regul:[2,5],ani:[2,1,3,4,5,6],ewouldblock:[2,5],ssl_op_no_compress:[2,5],servic:2,properti:[2,5],bev_event_timeout:[2,5],printabl:5,nghttp2_set:[3,6],promised_stream_id:[3,6],conf:4,sever:[2,6,4,5,3],perform:[2,6,4,3],make:[2,6,4,3],headlen:[3,6],version_str:[3,6],nghttp2_on_stream_close_callback:[3,6,5],complet:[2,6,5,3],start_listen:2,bufferevent_openssl_get_ssl:[2,5],nghttp2_err_deferred_data_exist:[3,6],ssl_ctx_new:[2,5],zlib1g:4,ownership:[3,6],niv:[3,6,4],thu:[2,6,3],nghttp2_session_get_effective_local_window_s:[3,6],client:[0,2,3,4,5,6],thi:[0,1,2,3,4,5,6],endif:[2,6,1],gzip:[3,6,4],left:[3,6],protocol:[0,2,3,4,5,6],just:[2,6,4,5,3],"0x01":4,initiate_connect:5,ifdef:[2,6],previous:[3,6],easi:4,nghttp2_on_end_head:[],els:[2,5],applic:[2,6,4,5,3],initialize_nghttp2_sess:[2,5],specif:[2,6,5,3],arbitrari:[3,6],http2_session_data:[2,5],client_addr:2,manual:4,html:[0,6,4,3,2],tcp_nodelai:[2,5],unnecessari:5,underli:[2,5],www:[3,6],right:[2,6,5,1],deal:[2,6,5,1,3],on_frame_recv_parse_error_callback:[3,6],successfulli:[2,5],transmiss:[2,6,5,3],ni_numerichost:2,bottom:[3,6],nghttp2_data_source_read_callback:[3,6],track:[2,4,5],condit:[2,6,5,1,3],foo:4,localhost:4,sensibl:[3,6],repositori:[2,5],peer:[2,6,5,3],post:[3,6,4],decompressor:4,inlen_ptr:[3,6],nghttp2_submit_data:[3,6],nghttp2_settings_max_concurrent_stream:[2,6,5,3],produc:[3,6],evbuff:[2,5],encod:[2,6,4,3],down:[2,5],pair:[2,6,4,5,3],errx:[2,5],nghttp2_on_end_headers_callback:[2,6,5,3],git:[0,6,4,3],session_send:[2,5],wai:[3,6,4],support:[2,6,4,5,3],verbos:4,overhead:4,lowest:[3,6],head:[2,6,3],event_bas:[2,5],offer:4,taken:[3,6],"true":4,reset:5,ssl_ctx_free:[2,5],maximum:[3,6,4],until:[3,6],deafult:4,autoconf:4,emit:[2,5],nghttp2_initial_window_s:[3,6],featur:4,httpbi:[0,4],netdb:2,unreleas:4,exist:[3,6,4],ai_flag:2,ends_with:2,check:[2,6,5,3],delete_http2_session_data:[2,5],when:[2,6,4,5,3],role:[2,6,5,3],test:[0,4],send_client_connection_head:5,unlimit:[3,6],intend:2,af_unspec:[2,5],nghttp2_max_window_s:[3,6],technot:[3,6],max_siz:4,evconnlistener_new_bind:2,longer:[2,4],print_head:5,time:[2,6,4,3],push:[3,6,4],skip:[3,6],evbuffer_remov:2,nghttp2_on_frame_recv_callback:[3,6,5],nghttp2ver_h:1,decid:[3,6],create_ssl_ctx:[2,5],depend:[2,5],readabl:5,sourc:[0,6,5,3,2],string:[2,6,4,5,3],nghttp2_settings_enable_push:[3,6],level:[2,6,3],did:[3,6,5],item:4,settings_id:[3,6],conhead:2,prevent:[3,6],sign:4,port:[2,4,5],appear:[3,6,4],event_base_fre:[2,5],current:[2,6,4,3],gener:[3,6,4],address:4,nghttp2_submit_rst_stream:[2,6,3],connect_error:[3,6],queue:[2,6,5,3],behav:[3,6],ourselv:[2,5],nghttp2_err_goaway_already_s:[3,6],regardless:[3,6],extra:[4,5],modul:4,prefer:[3,6],instal:4,hdinflat:4,memori:[2,6,4,5,3],strdup:2,prev:2,reorder:[3,6,5],rst_stream:[2,6,5,3],ctype:2,nghttp2_submit_window_upd:[3,6],prepar:[3,6],stream_user_data:[3,6,5],cat:[2,6,5,3],descriptor:[2,6,3],can:[2,6,4,5,3],http2:[0,6,4,3],purpos:[2,6,5,1],uf_path:5,claim:[2,6,5,1],stream:[2,6,4,5,3],agent:4,abort:[3,6],tabl:[3,6,4],nghttp2_header:[2,6,5,3],occur:[3,6],alwai:[2,6,3],multipl:[2,6,5,3],charset:4,ping:[3,6],write:[2,4,5],opt_set_mask:[3,6],max:5,intrus:2,mai:[2,6,4,5,3],acceptcb:2,data:[2,6,4,5,3],autotool:4,stdin:4,inform:[2,6,4,5,3],"switch":[2,4,5],aaaabaaaagqaaaahaad__w:4,talk:[2,4],nghttp2_err_stream_shut_wr:[3,6],size_t:[2,6,5,3],nghttp2_err_unsupported_vers:[3,6],still:[3,6,4],pointer:[2,6,3],entiti:2,disconnect:[2,5],precondit:[3,6],tort:[2,6,5,1],window:[3,6],main:[2,5],non:[2,6,4,5,3],recal:5,initi:[2,6,5,3],nghttp2_submit_head:[3,6],nghttp2_on_header_callback:[2,6,5,3],name:[2,6,4,5,3],version_num:[3,6],config:4,no_error:4,drop:[2,6,5,3],replac:[3,6],individu:[3,6],continu:[2,6,4,5,3],event_base_loop:[2,5],turoti:5,happen:[2,4,5],ai_addrlen:2,space:[3,6,4],output_length:4,nghttp2_flag_end_push_promis:[3,6],earlier:[2,4,5],event_base_new:[2,5],argv:[2,5],org:[0,6,4,3],"byte":[2,6,4,5,3],argc:[2,5],nghttp2_opt_no_auto_connection_window_upd:[3,6],nghttp2ver:[0,6,1,3],"88448504252dd5918485":4,badli:[3,6],thing:[2,6,5,3],nghttp2_flag_non:[2,6,5,3],place:[3,6],evdns_base_new:5,oper:[3,6,4],directli:[2,6,5,3],onc:[3,6],arrai:[3,6,4,5],yourself:4,nghttp2_flow_control_error:[3,6],submit:[3,6,5],on_frame_recv_callback:[2,6,5,3],open:[2,6,4,3],size:[2,6,4,3],avail:[2,6,4,5,3],given:[3,6],necessarili:[3,6],draft:[0,6,4,3],internal_error:[3,6],conveni:[3,6],ssl_ctx:[2,6,5,3],copi:[2,6,5,1,3],specifi:[2,6,4,5,3],"short":[2,5],holder:[2,6,5,1],than:[2,6,4,3],serv:2,wide:2,nghttp2_session_get_outbound_queue_s:[3,6],were:[2,5],posit:[3,6],read_callback:[2,6,3],browser:4,fork:4,sai:[3,6],pri:[3,6],argument:[2,6,4,5,3],bitwis:[3,6],form:[3,6],nghttp2_flag_prior:[3,6],destroi:[2,5],payloadlen:[3,6],note:[2,4,5],take:[2,6,4,5,3],noth:[3,6],begin:5,sure:[2,4,5],normal:[3,6],buffer:[2,6,4,5,3],compress:[0,4],nghttp2_hcat_request:[2,6,5,3],pathlen:5,sublicens:[2,6,5,1],nghttp2_before_frame_send_callback:[3,6,5],http2_select:[3,6],later:[2,6,5,3],gracefulli:5,show:[4,5],unprocess:[2,5],concurr:[2,6,3],permiss:[2,6,5,1],threshold:2,onli:[2,6,4,5,3],state:[2,6,4,3],"4e5535a027780":4,overwritten:[3,6],hddeflat:4,variou:[3,6],get:[2,6,4,5,3],outlen:[3,6,5],ssl:[2,6,4,5,3],cannot:[2,6,3],nghttpd:4,requir:[0,6,4,3],nghttp2_set_stream_user_data:2,multi:4,aris:[2,6,5,1],detect:[3,6,4],"import":4,fcntl:2,pipefd:2,evdns_bas:5,style:4,submit_request:5,region:[3,6],"0x000300":1,contract:[2,6,5,1],tutori:[0,5,2],deflatehd:4,mani:[3,6],nghttp2_data_provid:[2,6,3],unistd:[2,5],nghttp2_err_too_many_inflight_set:[3,6],cancel:[3,6],damag:[2,6,5,1],nghttp2_on_data_send_callback:[3,6],header_table_s:4,nghttp2_settings_max:[3,6],"abstract":[2,5],nghttp2_on_unknown_frame_recv_callback:[3,6],nghttp2_opt:[3,6],those:[2,6,5,3],uf_queri:5,hdr:[2,4,5],invok:[2,6,5,3],invoc:[2,6,3],on_data_chunk_recv_callback:[3,6,5],stdout:[4,5],ascii:[3,6],develop:[0,4],author:[2,6,4,5,1],bev_opt_defer_callback:[2,5],same:[2,6,4,5,3],ssl_library_init:[2,5],binari:5,pac:4,document:[0,1,2,4,5,6],finish:[2,5],decompress:[3,6,4,5],handshake_leftlen:2,extern:6,postpon:[3,6],macro:[0,6,1,3],without:[2,1,3,4,5,6],nghttp2_push_promis:[3,6],event2:[2,5],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],execut:4,multiplex:[2,4],struct:[0,6,5,3,2],hint:2,except:[3,6],identif:[3,6],on_data_send_callback:[3,6],nghttp2_select_next_protocol:[3,6,5],real:5,create_http2_session_data:[2,5],nghttp2_version_ag:[3,6],next_proto_cb:2,integ:[3,6],server:[0,2,3,4,5,6],either:[2,6,3],output:[2,6,4,5,3],manag:2,stream_clos:[3,6],ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],nonzero:[2,6,3],easili:5,exit:[2,5],freed:4,base64url:[3,6],inspect:[3,6],found:[2,6,3],getnameinfo:2,src:4,inflater_ptr:[3,6],ack:[3,6,4],dnsbase:5,settings_payload:[3,6],act:[2,5],routin:[2,5],no_auto_stream_window_upd:[3,6],least_vers:[3,6],error_repli:2,adjsut:4,b2a_hex:4,nghttp2_hcat_respons:[3,6,5],hex:[2,4],start:[2,6,4,5,3],nghttp2_err_stream_clos:[3,6],low:[3,6],lot:[3,6],ipv6:4,strictli:[3,6],next_proto_list:2,nghttp2_proto_version_id_len:[2,6,3],nghttp2_err_invalid_st:[3,6],possibl:[2,6,5,3],"default":[2,6,4,3],hpack:[0,4],err_get_error:[2,5],connect:[2,1,3,4,5,6],creat:[2,6,4,5,3],mainli:[3,6],decreas:[3,6],file:[2,1,3,4,5,6],nghttp2_err_invalid_header_block:[3,6],fill:2,denot:[3,6,5],functypedef:6,googl:4,field:[2,6,4,5,3],valid:[3,6,4],nghttp2_prioriti:[3,6],ignor:[2,6,3],you:[2,6,4,5,3],sequenc:[2,6,4,5,3],reduc:[3,6],cunit:4,directori:[2,4,5],mask:[3,6],represent:[3,1],all:[2,6,5,1,3],on_unknown_frame_recv_callback:[3,6],illustr:4,nghttp2_err_start_stream_not_allow:[3,6],lack:[3,6],on_end_headers_callback:[3,6,5],follow:[2,1,3,4,5,6],ptr:[2,6,5,3],app_cont:2,uint8_t:[2,6,5,3],readcb:[2,5],program:[0,4,5,2],bufferevent_writ:[2,5],"case":[2,6,4,5,3],far:[2,5],settings_header_table_s:[3,6,4],print:[4,5],failur:[3,6,5],veri:[3,6,5],no_auto_connection_window_upd:[3,6],"__cplusplu":6,list:[2,6,3],nghttp2_headers_categori:[3,6],adjust:[3,6],stderr:[2,4,5],small:[3,6],session_recv:2,zero:[3,6],pass:[3,6,5],further:[2,6,5,3],what:[3,6,4],sub:2,sun:4,sum:4,delet:5,version:[0,6,4,1,3],"public":[0,6,4,3],libjansson:4,percentage_of_original_s:4,excess:2,modifi:[2,6,4,5,1],valu:[2,6,4,5,3],search:2,ai_addrconfig:2,nghttp2_err_push_dis:[3,6],prior:4,amount:[2,5],action:[2,6,5,1],via:[2,4,5],primit:5,famili:[2,5],establish:[2,5],select:[3,6,4,5],regist:2,libev:[0,4,5,2],bev_event_connect:[2,5],minor:[3,1],more:[2,6,4,5,3],tsujikawa:[2,6,5,1],nghttp2_settings_header_table_s:[3,6],nghttp2_pri_default:[3,6,5],flag:[2,6,4,5,3],particular:[2,6,5,1,3],known:[3,6],nghttp2_err_wouldblock:[2,6,5,3],endpoint:[3,6,4],dev:[4,1],remain:[2,6,5,3],share:4,accept:[2,6,4,3],minimum:2,ssl_op_al:[2,5],create_ssl:[2,5],strlen:[2,5],huge:[2,5],netinet:[2,5],secur:4,anoth:[3,6],serveraddr:4,reject:[3,6],sec9:[3,6],simpl:[2,6,5,3],resourc:[0,6,4,5,3],referenc:4,variant:[3,6],spdylai:4,associ:[2,1,3,4,5,6],github:[0,4],caus:[3,6],callback:[2,6,5,3],alpn:[3,6,4],authroiti:5,hypertext:[0,4],libcunit1:4,through:[2,4],paramet:[3,6,5],typedef:[0,6,5,3,2],nghttp2_hcat_push_respons:[3,6],pend:[2,6,5,3],nghttp2_err_eof:[3,6],progoram:5,valuelen:[2,6,5,3],tri:[3,6],"return":[2,6,4,5,3],check_path:2,synopsi:[2,5],nghttp2_initial_max_concurrent_stream:[3,6],readlen:2,nghttp2_err_callback_failur:[2,6,5,3],tear:[2,5],achiev:[2,6,3],fulli:[3,6],trailer:[3,6],nghttp2_on_frame_send_callback:[3,6],monoton:5,realli:5,expect:4,field_set:5,event:[2,6,5,1],app_ctx:2,publish:[2,6,5,1],primari:[3,6],etag:4,nghttp2_client_connection_header_len:[2,6,5,3],on_frame_not_send_callback:[3,6],proxi:[0,4],differ:[3,6],effect:[3,6],reason:[2,6,3],base:[2,4,5],put:[3,6],nghttp2_session_mem_recv:[2,6,5,3],nghttp2_flag:[3,6],recv:4,thread:[2,4],omit:[3,6,5],nghttp2_err_invalid_stream_st:[3,6],assign:[2,6,5,3],feed:[2,5],major:[3,1],notifi:2,number:[2,6,1,3],"0x8":[3,6],done:[2,4,5],stdlib:6,nghttp2_internal_error:[2,6,3],script:4,data_prd:[2,6,3],nghttp2_session_get_stream_user_data:[2,6,5,3],least:[3,6,4],scheme:[4,5],store:[2,6,5,3],input_length:4,"0x0":[3,6],option:[2,6,4,5,3],similarli:[3,6],nghttp2_client_connection_head:[2,6,5,3],pars:[3,6,5],kind:[2,6,5,1,3],doubli:2,remot:[2,6,4,5,3],remov:[2,6,3],bridg:4,ai_next:2,consumpt:[2,5],nghttp2_error:[3,6],window_size_incr:[3,6,4],lib_error_cod:[3,6],arrlen:[2,5],packag:4,"null":[2,6,5,3],nghttp2_on_frame_recv_parse_error_callback:[3,6],syn_stream:[3,6],sell:[2,6,5,1],outbound:[3,6],equival:[3,6],self:4,also:[2,6,4,5,3],build:[0,4,5],nghttp2_err_frame_size_error:[3,6],make_nv:[2,5],distribut:[2,6,5,1],reacb:5,reach:[3,6],chart:[3,6],most:[3,6],vnu:4,charg:[2,6,5,1],addr:2,"01881f3468e5891afcbf83868a3d856659c62e3f":4,o_rdonli:2,frame_size_error:[3,6,4],session:[2,6,5,3],nghttp2_submit_push_promis:[3,6],copyright:[2,6,5,1],refused_stream:[3,6],nghttp2_opt_no_auto_stream_window_upd:[3,6],queu:[2,6,5,3],express:[2,6,5,1],window_upd:[3,6,4],liabl:[2,6,5,1],before_frame_send_callback:[3,6,5],retreiv:5,crt:2,certif:[2,4,5],set:[2,6,4,5,3],seq:4,sep:4,ousid:4,remove_stream:2,nghttp2_submit_goawai:[3,6],arg:[2,6,5,3],close:[2,6,4,5,3],analog:[3,6],strchr:2,someth:[3,6],won:[2,6,3],hold:[3,6],nghttp2_on_data_chunk_recv_callback:[3,6,5],numer:[3,6,1],succeed:[3,6],percent_decod:2,both:[2,6,4,5,3],last:[3,6,4],delimit:4,nghttp2_session_want_writ:[2,6,5,3],tempor:[3,6],context:[2,6,4,5,3],compression_error:[3,6],whole:[3,6],simpli:[2,5],send_server_connection_head:2,header:[0,2,3,4,5,6],shutdown:[2,6,5,3],nghttp2_session_client_new:[3,6,5],nghttp2_session:[2,6,5,3],backend:4,due:[3,6],empti:[2,6,4,5,3],send_respons:2,whom:[2,6,5,1],stdint:6,add_stream:2,flight:[3,6],nghttp2_err_nomem:[3,6],settings_enable_push:[3,6,4],nghttp2_session_terminate_sess:[3,6,5],buflen:[3,6],func:6,next_proto_list_len:2,look:[2,5],"while":[2,6,5,3],behavior:[3,6],error:[2,6,4,5,3],loop:[2,5],malloc:[2,5],nghttp2_session_callback:[2,6,5,3],readi:2,user_data:[2,6,5,3],itself:[2,6,5,3],flow_control_error:[3,6],grant:[2,6,5,1],belong:[3,6],read:[2,6,4,5,3],decod:[2,6,3],uf_schema:5,mytyp:[3,6],inflat:[3,6,4],alert:4,moment:4,user:[3,6,4,5],implement:[0,2,3,4,5,6],nghttp2_h:6,noninfring:[2,6,5,1],entri:[3,6,4],nghttp:4,person:[2,6,5,1],uint32_t:[3,6],hd_side_request:4,end_push_promis:[3,6],nghttp2_gzip_infl:[3,6],on_frame_send_callback:[3,6],nghttp2_ping:[3,6],input:[2,6,4,5,3],subsequ:[3,6],bin:4,format:[2,6,4,5,3],http_parser:5,bit:[3,6,1],strstr:2,signal:[2,6,5,3],bufferev:[2,5],some:[2,6,5,3],back:[3,6],sampl:4,sizeof:[2,5],libssl:4,lev_opt_reus:2,though:4,per:[3,6],larg:[3,6],make_nv2:5,machin:4,run:[2,6,4,5,3],step:[3,6],handshake_readcb:2,idl:[3,6],block:[2,6,4,5,3],nghttp2_err_paus:[3,6],nsm:6,within:4,nghttp2_send_callback:[3,6,5],nghttp2_opt_set:[3,6],occupi:4,inclus:[3,6],errno:2,bodi:[2,6,5,3],"long":[3,6],nghttp2:[0,1,2,3,4,5,6],includ:[0,1,2,3,4,5,6],forward:4,session_ptr:[3,6],link:[2,4],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],line:4,concaten:[3,6],utf:4,caller:[2,6,3],nghttpx:4,clear:[3,6],parser:5,repres:[3,6],"char":[2,6,5,3],incomplet:4,sublen:2,titl:2,invalid:[3,6],transport:5,libtool:4,create_http2_stream_data:[2,5],algorithm:[3,6],nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],getaddrinfo:2,code:[2,6,4,5,3],queri:5,nghttp2_frame_hd:[3,6],cython:4,privat:2,send:[2,6,4,5,3],http_parser_url:5,lower:[3,6],sens:[3,6],fatal:[2,6,5,3],sent:[2,6,5,3],nghttp2_submit_p:[3,6],untouch:[3,6],relev:[2,5],"0x010203":[3,1],magic:[2,5],http_parser_parse_url:5,"try":4,refer:[0,6,4,3],pleas:[2,4,5],impli:[2,6,5,1],smaller:4,snprintf:5,"0x1":[3,6],memset:[2,5],"0x4":[3,6],download:[0,4],index:4,compar:[3,6,5],settings_flow_control_opt:[3,6],access:4,experiment:[0,4],nghttp2_session_server_new:[2,6,3],ssl_ctx_set_opt:[2,5],nghttp2_enhance_your_calm:[3,6],len:[2,6,5,3],closur:[3,6,5],nghttp2_rst_stream:[3,6],ubuntu:4,becom:[2,6,1,3],sinc:[2,6,4,5,3],remark:[0,3],larger:[3,6],host:[0,4,5,2],autoreconf:4,jansson:4,greac:[2,5],chang:[2,6,3],output_wouldblock_threshold:2,appli:[3,6],api:[0,6,3],from:[0,1,2,3,4,5,6],commun:[2,4,5],binascii:4,upgrad:[3,6,4],next:[2,6,4,5,3],findproxyforurl:4,usr:4,nghttp2_nv:[2,6,5,3],jxck:4,goawai:[2,6,4,5,3],deflat:[3,6,4],account:[3,6,4,5],retriev:[2,6,5,3],tunnel:4,nghttp2_settings_id:[3,6],sslv23_client_method:5,control:[3,6],process:[2,6,4,5,3],fprintf:[2,5],onlin:[3,4],serial:[2,6,5,3],evdns_base_fre:5,nghttp2_session_want_read:[2,6,5,3],ssl_ctx_use_privatekey_fil:2,evbas:[2,5],instead:[3,6],nullifi:[3,6],npn:[2,6,4,5,3],eventcb:[2,5],nghttp2_compression_error:[3,6],alloc:[2,6,3],bind:[0,4],nvlen:[2,6,5,3],correspond:[2,4],element:[2,6,3],issu:[0,6,3],stream_id:[2,6,4,5,3],nghttp2_connect_error:[3,6],ssize_t:[2,6,5,3],furnish:[2,6,5,1],move:[3,6],max_outlen:[3,6],therefor:[3,6,5],nghttp2_session_send:[2,6,5,3],inlen:[3,6,5],recept:[2,6,5,3],crash:3,greater:[3,6],handl:[2,6,5,3],nghttp2_goawai:[3,6],handi:5,automat:[3,6],anyth:5,uf_port:5,mode:4,bump:[3,6],chunk:[3,6,5],nghttp2_err_temporal_callback_failur:[2,6,3],"static":[2,6,4,5,3],our:5,patch:[3,1],out:[2,1,3,4,5,6],variabl:4,req:[3,6],categori:[3,6,5],suitabl:[3,6],rel:2,field_data:5,recv_callback:[3,6],insid:4,releas:[0,1,3],could:[2,6,5,3],keep:[2,6,4,5,3],length:[2,6,4,5,3],outsid:[3,4],retain:[3,6],softwar:[2,6,5,1],addrinfo:2,date:4,prioriti:[3,6,5],intention:[3,6],unknown:[2,6,3],system:[2,5],messag:[3,6,5],attach:[2,5],termin:[2,6,4,5,3],"final":[3,6],ipv4:4,sa_handl:[2,5],enqueu:5,exactli:[2,4],nghttp2_err_header_comp:[3,6],see:[2,6,4,5,3],structur:[2,6,5,3],charact:[2,6,5,3],nghttp2_session_del:[2,6,5,3],bev:[2,5],ssl_new:[2,5],"function":[0,2,3,4,5,6],bufferevent_get_input:[2,5],fail:[3,6],have:[2,6,4,5,3],reserv:[3,6],need:[3,6,4,5],ai_socktyp:2,"0x04":4,"0x05":4,"0x00":4,nghttp2_err_flow_control:[3,6],nghttp2_refused_stream:[3,6],evbuffer_pullup:[2,5],which:[2,6,4,5,3],zlib:4,singl:[2,6,4,5,3],opaque_data_len:[3,6],unless:[3,6],bufferevent_openssl_socket_new:[2,5],settings_max_concurrent_stream:[2,6,4,5,3],stream_data:[2,5],deploi:4,"class":4,nghttp2_error_cod:[2,6,5,3],nghttp2_err_stream_id_not_avail:[3,6],url:[2,4],request:[2,6,4,5,3],uri:[4,5],pipe:2,determin:4,nghttp2_pack_settings_payload:[3,6],ssl_load_error_str:[2,5],text:4,bufferevent_get_output:[2,5],redirect:5,locat:5,should:[2,6,5,3],local:[3,6],meant:5,familiar:4,memcpi:[2,5],nghttp2_session_client_new2:[3,6],settings_initial_window_s:[3,6,4],nghttp2_data:[3,6],increas:[3,6,5],nghttp2_submit_respons:[2,6,3],enabl:[3,6,4],whether:[2,6,5,1],stuff:[3,6],contain:[2,6,4,5,3],nghttp2_window_upd:[3,6],frame:[2,6,4,5,3],knowledg:4,temporarili:[3,6],statu:[0,6,4,3,2],wire:[2,4,5],correctli:[3,6],nghttp2_settings_entri:[2,6,5,3],written:[2,6,4,5,3],https_uri:5,nghttp2_initial_connection_window_s:[3,6],kei:[2,6,4,3],supporet:4,entir:[2,6,3],last_stream_id:[3,6,4],addit:[2,6,3],revers:4,nghttp2_proto_version_id:[2,6,5,3],equal:2,etc:[2,4,5],instanc:[3,6],on_request_recv_callback:[2,6,3],uint16_t:[3,6,5],rfc2616:[3,6],commenc:5,respect:5,nghttp2_recv_callback:[3,6],ssl_ctx_set_next_proto_select_cb:[3,6,5],insuffici:[3,6],compon:5,json:4,treat:[2,6,3],nghttp2_err_invalid_argu:[3,6],immedi:[3,6],nghttp2_hcat_head:[3,6],sock_stream:2,evconnlisten:2,on_header_callback:[2,6,5,3],nghttp2_frame_size_error:[3,6],defin:[2,6,5,1,3],eintr:2,helper:[3,6],libxml2:4,squid:4,select_next_proto_cb:[3,6,5],archiv:[2,5],substanti:[2,6,5,1],incom:[2,6,4,3],let:[2,5],member:[2,6,3],python:[0,4],ifndef:[6,1],dyanmic:4,http:[0,1,2,3,4,5,6],hostnam:4,uf_host:5,dealloc:4,peer_max_concurrent_stream:[3,6],off:5,well:[2,5],app_context:2,inflatehd:4,exampl:[2,6,4,5,3],command:4,error_cod:[2,6,4,5,3],nghttp2_data_sourc:[2,6,3],usual:[3,6],paus:[3,6],less:[3,6],nghttp2_on_data_recv_callback:[3,6],send_callback:[2,6,5,3],half:[3,6],obtain:[2,6,5,1],tcp:[2,5],web:[2,4],cert_fil:2,point:[2,6,5,3],priorit:[3,6],addrlen:2,add:[2,6,3],match:[2,5],gmt:4,know:[3,6],nva:[2,6,5,3],python3:4,resid:[2,5],like:[2,6,4,5,3],success:4,nghttp2_pri_lowest:[3,6],nghttp2_flag_end_head:[3,6],necessari:2,tlen:[3,6],page:[2,5],file_read_callback:2,suppli:[3,6],"export":2,nghttp2_session_get_effective_recv_data_length:[3,6],error_html:2,librari:[0,1,2,3,4,5,6],lead:[3,6],avoid:[2,6,5,3],octet:[2,6,5,3],overlap:[3,6],isxdigit:2,outgo:[2,6,3],nghttp2_session_upgrad:[3,6],delete_http2_stream_data:[2,5],"enum":[0,6,3],usag:[2,6,4,5,3],settings_payloadlen:[3,6],nghttp2_nv_compare_nam:[3,6],about:[2,6,5,3],actual:[2,6,5,3],socket:[2,4,5],nghttp2_gzip:[3,6],chrome:4,fals:4,ssl_tlsext_err_ok:[2,6,5,3],disabl:[3,6,4],on_data_recv_callback:[3,6],nghttp2_err_invalid_fram:[3,6],ssl_op_no_sslv2:[2,5],warranti:[2,6,5,1],automak:4,merg:[2,6,5,1],val:[2,5],ai_famili:2,transfer:[0,6,4,3],ssl_filetype_pem:2,much:2,buz:4,unexpect:[3,6],bufferevent_fre:[2,5],overflow:[3,6],highest:[3,6],buf:[2,6,3],count:[3,6],succe:[3,6],nghttp2_stream_clos:[3,6],nghttp2_info:[3,6],googlecod:[3,6],displai:4,asynchron:[3,6],limit:[2,6,5,1],otherwis:[2,1,3,4,5,6],problem:[3,6],sockaddr:2,nghttp2_on_frame_not_send_callback:[3,6],strndup:5,"int":[2,6,5,3],nghttp2_flag_end_stream:[3,6],allow:[3,6,4],percent:2,detail:[3,6],other:[2,6,5,1,3],futur:[3,6],rememb:[2,5],outlen_ptr:[3,6],stat:2,err_error_str:[2,5],nghttp2_opt_peer_max_concurrent_stream:[3,6],rel_path:2,proto_str:[3,6],debian:4,session_data:[2,5],sphinx:4,eof:[2,6,3],reliabl:[3,6],indirectli:3,portion:[2,6,5,1,3]},objtypes:{"0":"c:member","1":"c:macro","2":"c:type","3":"c:function"},titles:["nghttp2 - HTTP/2.0 C Library","nghttp2ver.h","Tutorial: HTTP/2.0 server","API Reference","nghttp2 - HTTP/2.0 C Library","Tutorial: HTTP/2.0 client","nghttp2.h"],objnames:{"0":["c","member","C member"],"1":["c","macro","C macro"],"2":["c","type","C type"],"3":["c","function","C function"]},filenames:["index","nghttp2ver.h","tutorial-server","apiref","package_README","tutorial-client","nghttp2.h"]}) \ No newline at end of file diff --git a/tutorial-client.html b/tutorial-client.html index 988175f1..b993db36 100644 --- a/tutorial-client.html +++ b/tutorial-client.html @@ -292,12 +292,14 @@ finished successfully. We first initialize nghttp2 session object in callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; + callbacks.on_end_headers_callback = on_end_headers_callback; nghttp2_session_client_new(&session_data->session, &callbacks, session_data); }

Since we are creating client, we use nghttp2_session_client_new() to -initialize nghttp2 session object. We setup 5 callbacks for the +initialize nghttp2 session object. We setup 7 callbacks for the nghttp2 session. We’ll explain these callbacks later.

The delete_http2_session_data() destroys session_data and frees its bufferevent, so it closes underlying connection as well. It also @@ -516,9 +518,8 @@ received from the remote peer:

case NGHTTP2_HEADERS: if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && session_data->stream_data->stream_id == frame->hd.stream_id) { - /* Print response headers for the initiated request. */ - fprintf(stderr, "Response headers:\n"); - print_headers(stderr, frame->headers.nva, frame->headers.nvlen); + fprintf(stderr, "Response headers for stream ID=%d:\n", + frame->hd.stream_id); } break; } @@ -530,6 +531,51 @@ received from the remote peer:

HEADERS. We check te frame type and its category (it should be NGHTTP2_HCAT_RESPONSE for HTTP response HEADERS). Also check its stream ID.

+

Each request header name/value pair is emitted via +on_header_callback function:

+
static int on_header_callback(nghttp2_session *session,
+                              const nghttp2_frame *frame,
+                              const uint8_t *name, size_t namelen,
+                              const uint8_t *value, size_t valuelen,
+                              void *user_data)
+{
+  http2_session_data *session_data = (http2_session_data*)user_data;
+  switch(frame->hd.type) {
+  case NGHTTP2_HEADERS:
+    if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE &&
+       session_data->stream_data->stream_id == frame->hd.stream_id) {
+      /* Print response headers for the initiated request. */
+      print_header(stderr, name, namelen, value, valuelen);
+      break;
+    }
+  }
+  return 0;
+}
+
+
+

In this turotial, we just print the name/value pair.

+

After all name/value pairs are emitted for a frame, +on_end_headers_callback function is called:

+
static int on_end_headers_callback(nghttp2_session *session,
+                                   const nghttp2_frame *frame,
+                                   nghttp2_error_code error_code,
+                                   void *user_data)
+{
+  http2_session_data *session_data = (http2_session_data*)user_data;
+  switch(frame->hd.type) {
+  case NGHTTP2_HEADERS:
+    if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE &&
+       session_data->stream_data->stream_id == frame->hd.stream_id) {
+      fprintf(stderr, "All headers received with error_code=%d\n", error_code);
+    }
+    break;
+  }
+  return 0;
+}
+
+
+

This callback may be called prematurely because of errors (e.g., +header decompression failure) which is indicated by error_code.

The on_data_chunk_recv_callback() function is invoked when a chunk of data is received from the remote peer:

static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags,
@@ -733,6 +779,16 @@ here.

free(session_data); } +static void print_header(FILE *f, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen) +{ + fwrite(name, namelen, 1, f); + fprintf(f, ": "); + fwrite(value, valuelen, 1, f); + fprintf(f, "\n"); +} + /* Print HTTP headers to |f|. Please note that this function does not take into account that header name and value are sequence of octets, therefore they may contain non-printable characters. */ @@ -740,12 +796,11 @@ here.

{ size_t i; for(i = 0; i < nvlen; ++i) { - fwrite(nva[i].name, nva[i].namelen, 1, stderr); - fprintf(stderr, ": "); - fwrite(nva[i].value, nva[i].valuelen, 1, stderr); - fprintf(stderr, "\n"); + print_header(f, + nva[i].name, nva[i].namelen, + nva[i].value, nva[i].valuelen); } - fprintf(stderr, "\n"); + fprintf(f, "\n"); } /* nghttp2_send_callback. Here we transmit the |data|, |length| bytes, @@ -783,6 +838,47 @@ here.

return 0; } +/* nghttp2_on_header_callback: Called when nghttp2 library emits + single header name/value pair. */ +static int on_header_callback(nghttp2_session *session, + const nghttp2_frame *frame, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen, + void *user_data) +{ + http2_session_data *session_data = (http2_session_data*)user_data; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && + session_data->stream_data->stream_id == frame->hd.stream_id) { + /* Print response headers for the initiated request. */ + print_header(stderr, name, namelen, value, valuelen); + break; + } + } + return 0; +} + +/* nghttp2_on_end_headers_callback: Called when nghttp2 library emits + all header name/value pairs, or may be called prematurely because + of errors which is indicated by |error_code|. */ +static int on_end_headers_callback(nghttp2_session *session, + const nghttp2_frame *frame, + nghttp2_error_code error_code, + void *user_data) +{ + http2_session_data *session_data = (http2_session_data*)user_data; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && + session_data->stream_data->stream_id == frame->hd.stream_id) { + fprintf(stderr, "All headers received with error_code=%d\n", error_code); + } + break; + } + return 0; +} + /* nghttp2_on_frame_recv_callback: Called when nghttp2 library received a frame from the remote peer. */ static int on_frame_recv_callback(nghttp2_session *session, @@ -793,9 +889,8 @@ here.

case NGHTTP2_HEADERS: if(frame->headers.cat == NGHTTP2_HCAT_RESPONSE && session_data->stream_data->stream_id == frame->hd.stream_id) { - /* Print response headers for the initiated request. */ - fprintf(stderr, "Response headers:\n"); - print_headers(stderr, frame->headers.nva, frame->headers.nvlen); + fprintf(stderr, "Response headers for stream ID=%d:\n", + frame->hd.stream_id); } break; } @@ -893,6 +988,8 @@ here.

callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_data_chunk_recv_callback = on_data_chunk_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; + callbacks.on_end_headers_callback = on_end_headers_callback; nghttp2_session_client_new(&session_data->session, &callbacks, session_data); } diff --git a/tutorial-server.html b/tutorial-server.html index 0ef021ae..6b9bc810 100644 --- a/tutorial-server.html +++ b/tutorial-server.html @@ -369,12 +369,13 @@ these 2 functions later.

callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_request_recv_callback = on_request_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; nghttp2_session_server_new(&session_data->session, &callbacks, session_data); }

Since we are creating server, nghttp2 session object is created using -nghttp2_session_server_new() function. We registers 4 callbacks to +nghttp2_session_server_new() function. We registers 5 callbacks to nghttp2 session object. We’ll talk about these callbacks later.

After initialization of nghttp2 session object, we are going to send server connection header in send_server_connection_header():

@@ -540,8 +541,6 @@ received from the remote peer:

{ http2_session_data *session_data = (http2_session_data*)user_data; http2_stream_data *stream_data; - size_t i; - const char PATH[] = ":path"; switch(frame->hd.type) { case NGHTTP2_HEADERS: if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) { @@ -550,16 +549,6 @@ received from the remote peer:

stream_data = create_http2_stream_data(session_data, frame->hd.stream_id); nghttp2_session_set_stream_user_data(session, frame->hd.stream_id, stream_data); - for(i = 0; i < frame->headers.nvlen; ++i) { - nghttp2_nv *nv = &frame->headers.nva[i]; - if(nv->namelen == sizeof(PATH) - 1 && - memcmp(PATH, nv->name, nv->namelen) == 0) { - size_t j; - for(j = 0; j < nv->valuelen && nv->value[j] != '?'; ++j); - stream_data->request_path = percent_decode(nv->value, j); - break; - } - } break; default: break; @@ -576,12 +565,46 @@ data. We associate created http2_ in nghttp2 session object using nghttp2_set_stream_user_data() in order to get the object without searching through doubly linked list.

In this example server, we want to serve files relative to the current -working directory the program was invoked. We search :path header -field in request headers and keep the requested path in -http2_stream_data object. In this example program, we ignore -:method header field and always treat the request as GET request.

-

It is ok for the server to start sending response in this callback. In -this example, we defer it to on_request_recv_callback() function.

+working directory the program was invoked. Each header name/value pair +is emitted via on_header_callback function, which is called after +on_frame_recv_callback():

+
static int on_header_callback(nghttp2_session *session,
+                              const nghttp2_frame *frame,
+                              const uint8_t *name, size_t namelen,
+                              const uint8_t *value, size_t valuelen,
+                              void *user_data)
+{
+  http2_stream_data *stream_data;
+  const char PATH[] = ":path";
+  switch(frame->hd.type) {
+  case NGHTTP2_HEADERS:
+    if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) {
+      break;
+    }
+    stream_data = nghttp2_session_get_stream_user_data(session,
+                                                       frame->hd.stream_id);
+    if(stream_data->request_path) {
+      break;
+    }
+    if(namelen == sizeof(PATH) - 1 && memcmp(PATH, name, namelen) == 0) {
+      size_t j;
+      for(j = 0; j < valuelen && value[j] != '?'; ++j);
+      stream_data->request_path = percent_decode(value, j);
+    }
+    break;
+  }
+  return 0;
+}
+
+
+

We search :path header field in request headers and keep the +requested path in http2_stream_data object. In this example +program, we ignore :method header field and always treat the +request as GET request.

+

It is ok for the server to start sending response in this callback (or +in nghttp2_on_end_headers_callback(), which is not used in this +tutorial). In this example, we defer it to +on_request_recv_callback() function.

The on_request_recv_callback() function is invoked when all HTTP request, including entity body, was received:

static int on_request_recv_callback(nghttp2_session *session,
@@ -1033,13 +1056,41 @@ stream is about to close and we no longer use that object.

return res; } +/* nghttp2_on_header_callback: Called when nghttp2 library emits + single header name/value pair. */ +static int on_header_callback(nghttp2_session *session, + const nghttp2_frame *frame, + const uint8_t *name, size_t namelen, + const uint8_t *value, size_t valuelen, + void *user_data) +{ + http2_stream_data *stream_data; + const char PATH[] = ":path"; + switch(frame->hd.type) { + case NGHTTP2_HEADERS: + if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) { + break; + } + stream_data = nghttp2_session_get_stream_user_data(session, + frame->hd.stream_id); + if(stream_data->request_path) { + break; + } + if(namelen == sizeof(PATH) - 1 && memcmp(PATH, name, namelen) == 0) { + size_t j; + for(j = 0; j < valuelen && value[j] != '?'; ++j); + stream_data->request_path = percent_decode(value, j); + } + break; + } + return 0; +} + static int on_frame_recv_callback(nghttp2_session *session, const nghttp2_frame *frame, void *user_data) { http2_session_data *session_data = (http2_session_data*)user_data; http2_stream_data *stream_data; - size_t i; - const char PATH[] = ":path"; switch(frame->hd.type) { case NGHTTP2_HEADERS: if(frame->headers.cat != NGHTTP2_HCAT_REQUEST) { @@ -1048,16 +1099,6 @@ stream is about to close and we no longer use that object.

stream_data = create_http2_stream_data(session_data, frame->hd.stream_id); nghttp2_session_set_stream_user_data(session, frame->hd.stream_id, stream_data); - for(i = 0; i < frame->headers.nvlen; ++i) { - nghttp2_nv *nv = &frame->headers.nva[i]; - if(nv->namelen == sizeof(PATH) - 1 && - memcmp(PATH, nv->name, nv->namelen) == 0) { - size_t j; - for(j = 0; j < nv->valuelen && nv->value[j] != '?'; ++j); - stream_data->request_path = percent_decode(nv->value, j); - break; - } - } break; default: break; @@ -1211,6 +1252,7 @@ stream is about to close and we no longer use that object.

callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_request_recv_callback = on_request_recv_callback; callbacks.on_stream_close_callback = on_stream_close_callback; + callbacks.on_header_callback = on_header_callback; nghttp2_session_server_new(&session_data->session, &callbacks, session_data); }