diff --git a/_sources/tutorial-client.txt b/_sources/tutorial-client.txt index 1a2b63b4..79756499 100644 --- a/_sources/tutorial-client.txt +++ b/_sources/tutorial-client.txt @@ -12,7 +12,7 @@ resource denoted by the URI. Its synopsis is like this:: $ libevent-client HTTPS_URI We use libevent in this tutorial to handle networking I/O. Please -note that nghttp2 iteself does not depends on libevent. +note that nghttp2 itself does not depend on libevent. First we do some setup routine for libevent and OpenSSL library in function ``main()`` and ``run()``, which is not so relevant to nghttp2 @@ -119,8 +119,8 @@ We set 3 callbacks for the bufferevent: ``reacb``, ``writecb`` and ``eventcb``. The ``eventcb()`` is invoked by libevent event loop when an event -(e.g., connection established, timeout, etc) happens on the underlying -network socket:: +(e.g., connection has been established, timeout, etc) happens on the +underlying network socket:: static void eventcb(struct bufferevent *bev, short events, void *ptr) { @@ -281,8 +281,8 @@ frames. The ``session_send()`` function is defined as follows:: } The `nghttp2_session_send()` function serializes the frame into wire -format and call :member:`nghttp2_callbacks.nghttp2_send_callback` with -it. We set ``send_callback()`` function as +format and call :member:`nghttp2_session_callbacks.send_callback` with +it. We set ``send_callback()`` function to :member:`nghttp2_session_callbacks.send_callback` in ``initialize_nghttp2_session()`` function described earlier. It is defined as follows:: @@ -332,7 +332,7 @@ conditions as well. Using these information, nghttp2 session object will tell whether the connection should be dropped or not. More specifically, both `nghttp2_session_want_read()` and `nghttp2_session_want_write()` return 0, we have no business in the -connection. But since we have using bufferevent and its deferred +connection. But since we are using bufferevent and its deferred callback option, the bufferevent output buffer may contain the pending data when the ``writecb()`` is called. To handle this situation, we also check whether the output buffer is empty or not. If these diff --git a/_sources/tutorial-server.txt b/_sources/tutorial-server.txt index 5ede14a3..98199365 100644 --- a/_sources/tutorial-server.txt +++ b/_sources/tutorial-server.txt @@ -2,10 +2,10 @@ Tutorial: HTTP/2.0 server ========================= In this tutorial, we are going to write single-threaded, event-based -HTTP/2.0 web server, which supports HTTPS. It can handle concurrent -multiple requests, but only GET method is supported. The complete -source code, `libevent-server.c`_, is attached at the end of this -page. It also resides in examples directory in the archive or +HTTP/2.0 web server, which supports HTTPS only. It can handle +concurrent multiple requests, but only GET method is supported. The +complete source code, `libevent-server.c`_, is attached at the end of +this page. It also resides in examples directory in the archive or repository. This simple server takes 3 arguments, a port number to listen to, a @@ -15,17 +15,17 @@ is like this:: $ libevent-server PORT /path/to/server.key /path/to/server.crt We use libevent in this tutorial to handle networking I/O. Please -note that nghttp2 iteself does not depends on libevent. +note that nghttp2 itself does not depend on libevent. First we do some setup routine for libevent and OpenSSL library in function ``main()`` and ``run()``, which is not so relevant to nghttp2 library use. The one thing you should look at is setup NPN callback. The NPN callback is used for the server to advertise the application protocols the server supports to a client. In this example program, -when creating SSL_CTX object, we stores the application protocol name -in the wire format of NPN in statically allocated buffer. This is safe -because we only create 1 SSL_CTX object in the entire program life -time:: +when creating ``SSL_CTX`` object, we stores the application protocol +name in the wire format of NPN in statically allocated buffer. This is +safe because we only create 1 ``SSL_CTX`` object in the entire program +life time:: static unsigned char next_proto_list[256]; static size_t next_proto_list_len; @@ -55,14 +55,14 @@ time:: return ssl_ctx; } -The wire format of NPN is array of length prefixed string. The exactly -one byte is used to specify the length of the protocol identifier. In -this tutorial, we advertise the HTTP/2.0 protocol the nghttp2 library -supports. We export its identifier in -:macro:`NGHTTP2_PROTO_VERSION_ID`. The ``next_proto_cb()`` function is -the server-side NPN callback. In OpenSSL implementation, We just +The wire format of NPN is a sequence of length prefixed string. The +exactly one byte is used to specify the length of each protocol +identifier. In this tutorial, we advertise the HTTP/2.0 protocol the +nghttp2 library supports. The nghttp2 library exports its identifier +in :macro:`NGHTTP2_PROTO_VERSION_ID`. The ``next_proto_cb()`` function +is the server-side NPN callback. In OpenSSL implementation, we just assign the pointer to the NPN buffers we filled earlier. The NPN -callback function is set to SSL_CTX object using +callback function is set to ``SSL_CTX`` object using ``SSL_CTX_set_next_protos_advertised_cb()``. We use ``app_content`` structure to store the application-wide data:: @@ -100,7 +100,8 @@ object in O(1). The first element of this list is pointed by the ``root->next`` in ``http2_session_data``. Initially, ``root->next`` is ``NULL``. The ``handshake_leftlen`` member of ``http2_session_data`` is used to track the number of bytes remaining -when receiving first 24 bytes magic values from the client. We use +when receiving first 24 bytes magic value +(:macro:`NGHTTP2_CLIENT_CONNECTION_HEADER`) from the client. We use libevent's bufferevent structure to perform network I/O. Notice that bufferevent object is in ``http2_session_data`` and not in ``http2_stream_data``. This is because ``http2_stream_data`` is just a @@ -161,8 +162,8 @@ connection is also initialized at this time. We specify 2 callbacks for the bufferevent: ``handshake_readcb`` and ``eventcb``. The ``eventcb()`` is invoked by libevent event loop when an event -(e.g., connection established, timeout, etc) happens on the underlying -network socket:: +(e.g., connection has been established, timeout, etc) happens on the +underlying network socket:: static void eventcb(struct bufferevent *bev, short events, void *ptr) { @@ -223,13 +224,13 @@ it:: } } -Nothing special here, we just compare the magic byte string received -and expected one :macro:`NGHTTP2_CLIENT_CONNECTION_HEADER`. When -whole magic byte string is received, the connection state is ready for -starting HTTP/2.0 communication. First we change the callback -functions for the bufferevent object. We use same ``eventcb`` as -before. But we specify new ``readcb`` and ``writecb`` function to -handle HTTP/2.0 communication. We describe these 2 functions later. +We check that the received byte string matches +:macro:`NGHTTP2_CLIENT_CONNECTION_HEADER`. When they match, the +connection state is ready for starting HTTP/2.0 communication. First +we change the callback functions for the bufferevent object. We use +same ``eventcb`` as before. But we specify new ``readcb`` and +``writecb`` function to handle HTTP/2.0 communication. We describe +these 2 functions later. We initialize nghttp2 session object which is done in ``initialize_nghttp2_session()``:: @@ -303,9 +304,9 @@ functions for these pending data. To process received data, we call In this function, we feed all unprocessed, received data to nghttp2 session object using `nghttp2_session_mem_recv()` function. The `nghttp2_session_mem_recv()` processes the received data and may -invoke nghttp2 callbacks and also queue frames. Since there may be -pending frames, we call ``session_send()`` function to send those -frames. The ``session_send()`` function is defined as follows:: +invoke nghttp2 callbacks and also queue outgoing frames. Since there +may be pending frames, we call ``session_send()`` function to send +those frames. The ``session_send()`` function is defined as follows:: static int session_send(http2_session_data *session_data) { @@ -319,8 +320,8 @@ frames. The ``session_send()`` function is defined as follows:: } The `nghttp2_session_send()` function serializes the frame into wire -format and call :member:`nghttp2_callbacks.nghttp2_send_callback` with -it. We set ``send_callback()`` function as +format and call :member:`nghttp2_session_callbacks.send_callback` with +it. We set ``send_callback()`` function to :member:`nghttp2_session_callbacks.send_callback` in ``initialize_nghttp2_session()`` function described earlier. It is defined as follows:: @@ -397,7 +398,7 @@ frame and other error conditions as well. Using these information, nghttp2 session object will tell whether the connection should be dropped or not. More specifically, both `nghttp2_session_want_read()` and `nghttp2_session_want_write()` return 0, we have no business in -the connection. But since we have using bufferevent and its deferred +the connection. But since we are using bufferevent and its deferred callback option, the bufferevent output buffer may contain the pending data when the ``writecb()`` is called. To handle this situation, we also check whether the output buffer is empty or not. If these @@ -406,7 +407,7 @@ conditions are met, we drop connection. Otherwise, we call ``session_send()`` to process pending output data. Remember that in ``send_callback()``, we may not write all data to bufferevent to avoid excessive buffering. We continue process -pending data if output buffer becomes empty. +pending data when output buffer becomes empty. We have already described about nghttp2 callback ``send_callback()``. Let's describe remaining nghttp2 callbacks we setup in @@ -447,17 +448,17 @@ received from the remote peer:: return 0; } -We only interested HEADERS frame in this function. Since HEADERS frame -has several roles in HTTP/2.0 protocol, we check that it is a request -HEADERS, which opens new stream. If frame is request HEADERS, then we -create ``http2_stream_data`` object to store stream related data. We -associate created ``http2_stream_data`` object to the stream in -nghttp2 session object using `nghttp2_set_stream_user_data()` in order -to get the object without searching through doubly linked list. +We only interested in HEADERS frame in this function. Since HEADERS +frame has several roles in HTTP/2.0 protocol, we check that it is a +request HEADERS, which opens new stream. If frame is request HEADERS, +then we create ``http2_stream_data`` object to store stream related +data. We associate created ``http2_stream_data`` object to the stream +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 server static file relative to the -current working directory the program was invoked. We search ``:path`` -header field in request headers and keep the requested path in +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. @@ -588,7 +589,7 @@ is about to close:: } We destroy ``http2_stream_data`` object in this function since the -stream is about to close and we no longer to use that object. +stream is about to close and we no longer use that object. libevent-server.c diff --git a/_static/jquery.js b/_static/jquery.js index 12581195..e2efc335 100644 --- a/_static/jquery.js +++ b/_static/jquery.js @@ -11,7 +11,7 @@ * Copyright 2011, The Dojo Foundation * Released under the MIT, BSD, and GPL Licenses. * - * Date: Thu Aug 1 23:20:30 BRT 2013 + * Date: Fri Jul 5 14:07:58 UTC 2013 */ (function( window, undefined ) { diff --git a/_static/searchtools.js b/_static/searchtools.js index 6018a1db..11b85cb8 100644 --- a/_static/searchtools.js +++ b/_static/searchtools.js @@ -239,8 +239,13 @@ var Search = { }, loadIndex : function(url) { - $.ajax({type: "GET", url: url, data: null, success: null, - dataType: "script", cache: true}); + $.ajax({type: "GET", url: url, data: null, + dataType: "script", cache: true, + complete: function(jqxhr, textstatus) { + if (textstatus != "success") { + document.getElementById("searchindexloader").src = url; + } + }}); }, setIndex : function(index) { @@ -457,16 +462,18 @@ var Search = { displayNextItem(); }); } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { - $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + - item[0] + '.txt', function(data) { - if (data != '') { - listItem.append($.makeSearchSummary(data, searchterms, hlterms)); - Search.output.append(listItem); - } - listItem.slideDown(5, function() { - displayNextItem(); - }); - }, "text"); + $.ajax({url: DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + item[0] + '.txt', + dataType: "text", + complete: function(jqxhr, textstatus) { + var data = jqxhr.responseText; + if (data !== '') { + listItem.append($.makeSearchSummary(data, searchterms, hlterms)); + } + Search.output.append(listItem); + listItem.slideDown(5, function() { + displayNextItem(); + }); + }}); } else { // no source available, just display title Search.output.append(listItem); diff --git a/objects.inv b/objects.inv index ad8b5498..327a28a2 100644 Binary files a/objects.inv and b/objects.inv differ diff --git a/searchindex.js b/searchindex.js index 5cedcae7..73137592 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_DATA:[3,1,1,""],nghttp2_frame_hd:[3,2,1,""],NGHTTP2_ERR_INVALID_STREAM_STATE:[3,1,1,""],NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,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_HEADERS:[3,1,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_submit_rst_stream:[3,3,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_submit_ping:[3,3,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_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_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_session_continue:[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_frame_recv_callback:[3,0,1,""],on_request_recv_callback:[3,0,1,""],on_data_send_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:{represent:[3,1],all:[2,6,5,1,3],code:[2,6,4,5,3],evconnlisten:2,on_unknown_frame_recv_callback:[3,6],illustr:4,nghttp2_err_start_stream_not_allow:[3,6],my_obj:[3,6],lack:[3,6],getaddrinfo:2,nghttp2_frame_hd:[3,6],nghttp2_cancel:[3,6],opt_set:[3,6],prefix:[2,6,3],per:[3,6],nghttp2_session_get_stream_effective_local_window_s:[3,6],follow:[2,1,3,4,5,6],ptr:[2,6,5,3],content:[0,4,2],decid:[3,6],create_ssl_ctx:[2,5],"const":[2,6,5,3],uint8_t:[2,6,5,3],"0284f77778ff":4,unpack:[3,6],readabl:5,send:[2,6,4,5,3],http_parser_url:5,readcb:[2,5],program:[0,4,5,2],bufferevent_writ:[2,5],under:[3,6,4],sens:[3,6],fatal:[2,6,5,3],bufferevent_getfd:5,spec:[3,6],sent:[2,6,5,3],make_nv2:5,merchant:[2,6,5,1],uf_queri:5,digit:5,sourc:[0,6,5,3,2],string:[2,6,4,5,3],val:[2,5],without:[2,1,3,4,5,6],percentageoforiginals:4,"void":[2,6,5,3],nghttp2_ping:[3,6],settings_header_table_s:[3,6,4],nghttp2_settings_enable_push:[3,6],nghttp2_client_connection_header_len:[2,6,5,3],bufferevent_ssl:[2,5],nghttp2_submit_p:[3,6],failur:[3,6],veri:[3,6,5],untouch:[3,6],no_auto_connection_window_upd:[3,6],relev:[2,5],hdr:[2,5],tri:[3,6],nghttp2_on_frame_recv_callback:[3,6,5],percent:2,magic:[2,5],level:[2,6,3],did:[3,6,5],ipv6:4,list:[2,6,3],http_parser_parse_url:5,"try":4,nghttp2_headers_categori:[3,6],settings_id:[3,6],adjust:[3,6],initialize_nghttp2_setup:[2,5],conhead:2,stderr:[2,4,5],verif:5,small:[3,6],nghttp2_pri_lowest:[3,6],though:4,freed:4,nghttp2_settings_id:[3,6],address:4,pleas:[2,4,5],prevent:[3,6],impli:[2,6,5,1],on_stream_close_callback:[2,6,5,3],snprintf:5,session_recv:2,"0x1":[3,6],memset:[2,5],direct:4,"0x4":[3,6],zero:[3,6],pass:[3,6,5],download:[0,4],further:[2,6,5,3],otherwis:[2,6,5,1,3],port:[2,4,5],proxi:[0,4],index:4,what:[3,6],appear:[3,6,4],compar:[2,6,5,3],settings_flow_control_opt:[3,6],ssl_op_no_session_resumption_on_renegoti:[2,5],neg:[3,6],sum:4,"while":[2,6,5,3],current:[2,6,3],delet:5,version:[0,6,4,1,3],nghttp2_err_insuff_bufs:[3,6],decompress:4,"new":[2,6,4,5,3],tatsuhiro:[0,1,2,4,5,6],"public":[0,6,4,3],app_cont:2,nghttp2_session_resume_data:[3,6],inspect:[3,6],uf_schema:5,behavior:[3,6],nghttp2_submit_goawai:[3,6],titl:2,initialize_app_context:2,gener:[3,6,4],http2:[0,6,4,3],nghttp2_submit_push_promis:[3,6],here:[2,6,4,5,3],closur:[3,6,5],met:[2,6,5,3],test:[0,4],nghttp2_rst_stream:[3,6],argv:[2,5],ubuntu:4,path:[2,4,5],becom:[2,6,1,3],modifi:[2,6,4,5,1],sinc:[2,6,4,5,3],valu:[2,6,4,5,3],nextprotoneg:[3,6],remark:[0,3],sslv23_server_method:2,nghttp2_err_push_dis:[3,6],create_http2_session_data:[2,5],larger:[3,6],connect_error:[3,6],settings_payloadlen:[3,6],autoreconf:4,queue:[2,6,5,3],jansson:4,amount:[2,5],behav:[3,6],permit:[2,6,5,1],action:[2,6,5,1],nghttp2_submit_prior:[3,6],chang:[2,6,3],nghttp2_err_gzip:[3,6],ourselv:[2,5],nghttp2_frame:[2,6,5,3],nghttp2_err_goaway_already_s:[3,6],regardless:[3,6],extra:[4,5],appli:[3,6],transit:[3,6],prefer:[3,6],bufferevent_ssl_connect:5,put:[3,6],bev_event_error:[2,5],bufferev:[2,5],queri:5,famili:[2,5],org:[0,6,4,3],instal:4,errx:[2,5],establish:[2,5],nghttp2_flag:[3,6],select:[3,6,4,5],from:[0,1,2,3,4,5,6],describ:[2,6,5,3],would:[3,6],commun:[2,4,5],zlib1g:4,stdout:[4,5],regist:2,upgrad:[3,6,4],next:[2,6,4,5,3],error:[2,6,4,5,3],busi:[2,5],call:[2,6,4,5,3],asset:4,nghttp2_nv:[2,6,5,3],nghttp2_on_invalid_frame_recv_callback:[3,6],strdup:2,nghttp2_version:[3,6,1],type:[0,2,3,4,5,6],until:[3,6],reorder:[3,6,5],more:[2,6,4,5,3],spdy:[3,6,4],goawai:[2,6,4,5,3],squid:4,nghttp2_settings_header_table_s:[3,6],handshake_readcb:2,nghttp2_pri_default:[3,6,5],relat:[2,5],rst_stream:[2,6,5,3],inflater_ptr:[3,6],notic:[2,6,5,1],select_next_proto_cb:[3,6,5],warn:2,flag:[2,6,4,5,3],accept:[2,6,4,3],nghttp2_submit_window_upd:[3,6],particular:[2,6,5,1,3],known:[3,6],hold:[3,6],nghttp2_err_wouldblock:[2,6,5,3],must:[2,6,4,5,3],inputlen:4,account:[3,6,4,5],endpoint:[3,6,4],word:[3,6],nghttp2_session_recv:[3,6],err:[2,5],exit:[2,5],tunnel:4,exit_failur:[2,5],prepar:[3,6],work:[2,4],stream_user_data:[3,6,5],dev:[4,1],cat:[2,6,5,3],descriptor:[2,6,3],remain:[2,6,5,3],minimum:2,can:[2,6,4,5,3],lev_opt_close_on_fre:2,nghttp2_enhance_your_calm:[3,6],nghttp2_flag_ack:[3,6],purpos:[2,6,5,1],root:2,could:[2,6,5,3],uf_path:5,sslv23_client_method:5,control:[3,6],claim:[2,6,5,1],greac:[2,5],conf:4,stream:[2,6,4,5,3],give:[3,6],process:[2,6,4,5,3],uint32_t:[3,6],meant:5,indic:[2,6,5,3],abort:[3,6],fprintf:[2,5],ssl_op_al:[2,5],want:[2,6,5,3],nghttp2_header:[2,6,5,3],onlin:[3,4],serial:[2,6,5,3],keep:[2,6,4,5,3],unsign:[2,6,5,3],occur:[3,6],nghttp2_settings_flow_control_opt:[3,6],huge:[2,5],multipl:[2,6,5,3],secur:4,anoth:[3,6],charset:4,ping:[3,6],length:[2,6,4,5,3],decreas:[3,6],write:[2,4,5],fals:4,nghttp2_err_fat:[3,6],ssl_ctx_use_privatekey_fil:2,pair:[3,6,4],low:[3,6],serveraddr:4,reject:[3,6],sec9:[3,6],instead:[3,6],nghttp2_frame_typ:[3,6],opt_set_mask:[3,6],updat:[3,6],nullifi:[3,6],nghttp2_msg_more:6,nghttp2_on_request_recv_callback:[3,6],npn:[2,6,4,5,3],resourc:[0,6,4,5,3],referenc:4,alwai:[2,6,3],max:5,after:[2,6,4,5,3],variant:[3,6],spdylai:4,nghttp2_gzip_inflate_new:[3,6],befor:[2,6,5,3],lot:[3,6],mai:[2,6,4,5,3],end:[2,5],herebi:[2,6,5,1],acceptcb:2,nghttp2_compression_error:[3,6],demonstr:5,request_path:2,subsequ:[3,6],alloc:[2,6,3],github:[0,4],attempt:[3,6],third:[2,6,5,3],tutori:[0,5,2],opaqu:[3,6],stdin:4,nvlen:[2,6,5,3],correspond:[2,4],exclud:[3,6],issu:[0,6,3],nghttp2_flag_prior:[3,6],nghttp2_err_flow_control:[3,6],nghttp2_connect_error:[3,6],ssize_t:[2,6,5,3],aaaabaaaagqaaaahaad__w:4,evdns_base_new:5,dnsbase:5,order:[2,6,4,3],furnish:[2,6,5,1],feed:[2,5],frontend:4,nghttp2_err_stream_shut_wr:[3,6],routin:[2,5],hypertext:[0,4],move:[3,6],major:[3,6,1],libcunit1:4,through:[2,4],left:[3,6],size_t:[2,6,5,3],eagain:[2,5],nghttp2_err_unsupported_vers:[3,6],still:[3,6,4],pointer:[2,6,3],paramet:[3,6,5],typedef:[0,6,5,3,2],outer:4,fit:[2,6,5,1],how:5,fwrite:5,precondit:[3,6],max_outlen:[3,6],nghttp2_hcat_push_respons:[3,6],tort:[2,6,5,1],window:[3,6],pend:[2,6,5,3],whole:[2,6,3],nghttp2_err_eof:[3,6],hidden:[3,6],therefor:[3,6,5],nghttp2_session_send:[2,6,5,3],inlen:[3,6,5],valuelen:[2,6,5,3],"0x010203":[3,1],them:[2,6,5,3],recal:5,greater:[3,6],thei:[2,6,4,5,3],handl:[2,5],nghttp2_goawai:[3,6],safe:[2,6,3],compress:[0,4],handi:5,initi:[2,6,5,3],"break":[2,6,5,3],nghttp2_initial_max_concurrent_stream:[3,6],nghttp2_submit_head:[3,6],promis:[3,6],ssl_op_no_sslv2:[2,5],half:[3,6],readlen:2,ai_pass:2,choic:[3,6],document:[0,1,2,4,5,6],name:[2,6,4,5,3],nghttp2_err_callback_failur:[2,6,5,3],anyth:5,simpl:[2,6,5,3],uf_port:5,drop:[2,6,5,3],tear:[2,5],achiev:[2,6,3],nghttp2_flow_control_error:[3,6],event_bas:[2,5],mode:4,timeout:[2,5],each:[3,6,4],debug:[3,6,5],fulli:[3,6],compression_error:[3,6],side:[2,6,3],trailer:[3,6],mean:[3,6,4,5],slen:2,stdlib:6,bump:[3,6],protocol_error:[3,6],chunk:[3,6,5],monoton:5,continu:[2,6,4,5,3],realli:5,line:4,nghttp2_err_temporal_callback_failur:[2,6,3],"static":[2,6,4,5,3],expect:[2,4],event_base_loop:[2,5],o_rdonli:2,our:5,nghttp2_session_server_new2:[3,6],ai_addrlen:2,field_set:5,event:[2,6,5,1],special:2,out:[2,1,3,4,5,6],nghttp2_session_want_read:[2,6,5,3],evconnlistener_new_bind:2,app_ctx:2,network:[2,5],space:[3,6,4],printabl:5,req:[3,6],connect:[2,1,3,4,5,6],publish:[2,6,5,1],payload:[3,6],categori:[3,6,5],etag:4,suitabl:[3,6],rel:2,check:[2,6,5,3],nghttp2_flag_end_push_promis:[3,6],got:[3,6],merg:[2,6,5,1],on_frame_not_send_callback:[3,6],sphinx:4,recv_callback:[3,6],prioriti:[3,6,5],earlier:[2,4,5],event_base_new:[2,5],insid:4,written:[2,6,4,5,3],bufferevent_openssl_get_ssl:[2,5],ssl_filetype_pem:2,situat:[2,5],nghttp2_internal_error:[2,6,3],free:[2,6,5,1,3],uf_host:5,reason:[2,6,3],base:[2,4,5],releas:[0,1,3],nghttp2_session_mem_recv:[2,6,5,3],"byte":[2,6,4,5,3],argc:[2,5],recv:4,session_send:[2,5],nghttp2_opt_no_auto_connection_window_upd:[3,6],nghttp2ver:[0,6,1,3],inlen_ptr:[3,6],thread:[2,4],badli:[3,6],syn_repli:[3,6],omit:[3,6,5],openssl:[2,4,5],nghttp2_err_invalid_stream_st:[3,6],thing:[2,5],nghttp2_flag_non:[2,6,5,3],handshake_leftlen:2,place:[3,6],outsid:[3,4],errno:2,retain:[3,6],travers:2,assign:[2,6,5,3],nghttp2_version_num:[3,6,1],first:[2,6,4,5,3],oper:[3,6,4],softwar:[2,6,5,1],rang:[3,6,4],data_prd:[2,6,3],addrinfo:2,directli:[2,6,5,3],warnx:[2,5],check_path:2,onc:[3,6],arrai:[2,6,4,5,3],number:[2,6,1,3],yourself:4,restrict:[2,6,5,1],nghttp2_protocol_error:[3,6],ai_addr:2,done:[2,4,5],least:[3,6,4],nghttp2_on_frame_send_callback:[3,6],on_frame_recv_callback:[2,6,5,3],evdns_base_fre:5,open:[2,6,4,3],primari:[3,6],size:[2,6,4,3],end_stream:[3,6,4],given:[3,6],"long":[3,6],smaller:4,bufferevent_ssl_accept:2,script:4,unknown:[2,6,3],nghttp2_max_header_table_s:[3,6],system:[2,5],messag:[3,6,5],defer:[2,6,5,3],attach:[2,5],necessarili:[3,6],draft:[0,6,4,3],too:[2,6,3],memcmp:2,termin:[2,6,4,5,3],internal_error:[3,6],scheme:[4,5],"final":[3,6],store:[2,6,5,3],listen:[2,4],"0x0":[3,6],sigact:[2,5],option:[2,6,4,5,3],overhead:4,tool:[0,4],similarli:[3,6],nghttp2_proto_version_id_len:[2,6,3],noninfring:[2,6,5,1],specifi:[2,6,4,5,3],nghttp2_client_connection_head:[2,6,5,3],compressor:4,autotool:4,pars:[3,6,5],enqueu:5,alreadi:[2,6,5,3],sign:4,holder:[2,6,5,1],than:[2,6,4,3],serv:2,wide:2,kind:[2,6,5,1,3],conveni:[3,6],target:[3,6],nghttp2_err_header_comp:[3,6],remov:[2,6,3],see:[2,6,4,5,3],structur:[2,6,5,3],charact:[2,6,5,3],project:[0,4],bridg:4,headert:4,were:[2,5],posit:[3,6],nghttp2_session_del:[2,6,5,3],read_callback:[2,6,3],bev:[2,5],ssl_new:[2,5],browser:4,send_server_connection_head:2,fork:4,sai:[3,6],bufferevent_get_input:[2,5],window_size_incr:[3,6,4],nghttp2_session_get_effective_local_window_s:[3,6],eventcb:[2,5],pri:[3,6],argument:[2,6,4,5,3],rememb:[2,5],ssl_ctx_free:[2,5],arrlen:[2,5],packag:4,increment:[3,6],close:[2,6,4,5,3],need:[3,6,4,5],element:[2,6,4,3],nghttp2_on_frame_recv_parse_error_callback:[3,6],ai_socktyp:2,syn_stream:[3,6],sell:[2,6,5,1],caus:[3,6],bitwis:[3,6],date:4,form:[3,6],equival:[3,6],callback:[2,6,5,3],"0x04":4,"0x05":4,nghttp2_io_flag:6,"0x00":4,"0x01":4,next_proto_cb:2,note:[2,6,4,5,3],nghttp2_refused_stream:[3,6],exampl:[2,6,4,5,3],take:[2,6,4,5,3],which:[2,6,4,5,3],transmit:[3,6,5],properti:[2,5],noth:[2,6,3],singl:[2,6,4,3],opaque_data_len:[3,6],make_nv:[2,5],copi:[2,6,5,1,3],unless:[3,6],bufferevent_openssl_socket_new:[2,5],reacb:5,iteself:[2,5],buffer:[2,6,4,5,3],"__cplusplu":6,object:[2,6,4,5,3],reach:[3,6],chart:[3,6],nghttp2_hcat_request:[2,6,5,3],"short":[2,5],crash:3,most:[3,6,4],vnu:4,nghttp2_settings_timeout:[3,6],stream_data:[2,5],pathlen:5,thi:[0,1,2,3,4,5,6],nghttp2_before_frame_send_callback:[3,6,5],sun:4,nghttp2_err_invalid_st:[3,6],charg:[2,6,5,1],sub:2,nghttp2_error_cod:[2,6,5,3],nghttp2_err_stream_id_not_avail:[3,6],simplic:5,don:[2,6,3],http2_select:[3,6],hex_to_uint:2,url:[2,4],doc:4,frame_size_error:[3,6,4],later:[2,6,5,3],flow:[3,6],uri:[4,5],doe:[2,6,4,5,3],pipe:2,intention:[3,6],talk:[2,4],nghttp2_pack_settings_payload:[3,6],sa_handl:[2,5],opaque_data:[3,6,4],event_base_fre:[2,5],gracefulli:5,on_invalid_frame_recv_callback:[3,6],next_proto_list_len:2,ipproto_tcp:[2,5],hdtest:4,show:[4,5],text:4,bufferevent_get_output:[2,5],bev_event_eof:[2,5],unprocess:[2,5],concurr:[2,6,3],pkg:4,permiss:[2,6,5,1],threshold:2,authroiti:5,deploi:4,data:[2,6,4,5,3],bufferevent_setcb:[2,5],bev_event_connect:[2,5],redirect:5,access:4,onli:[2,6,4,5,3],exactli:2,locat:5,copyright:[2,6,5,1],refused_stream:[3,6],explain:5,configur:[3,6,4],apach:4,figur:4,should:[2,6,5,3],nghttp2_opt_no_auto_stream_window_upd:[3,6],nghttp2_err_invalid_stream_id:[3,6],outputlength:4,queu:[2,6,5,3],"4e5535a027780":4,send_callback:[2,6,5,3],local:[3,6],oct:4,ssl_tlsext_err_ok:[2,6,5,3],nghttp2_session_get_stream_effective_recv_data_length:[3,6],overwritten:[3,6],reset:5,over:[2,4,5],nghttp2_err_proto:[3,6],nghttp2ver_h:1,variou:[3,6],get:[2,6,4,5,3],authoritylen:5,familiar:4,express:[2,6,5,1],stop:[2,5],memcpi:[2,5],nghttp2_session_client_new2:[3,6],outlen:[3,6,5],end_head:[3,6,4],ssl:[2,6,4,5,3],settings_initial_window_s:[3,6,4],cannot:[2,6,3],nghttp2_data:[3,6],evbuffer_drain:[2,5],increas:[3,6,5],liabl:[2,6,5,1],requir:[0,6,4,3],doubli:2,before_frame_send_callback:[3,6,5],portion:[2,6,5,1,3],nghttp2_submit_respons:[2,6,3],retreiv:5,enabl:[3,6,4],crt:2,ietf:[0,4],bev_opt_close_on_fre:[2,5],nghttp2_set_stream_user_data:2,possibl:[2,6,5,3],multi:4,push_promis:[3,6],method:[2,6,4,5,3],provid:[2,6,5,1,3],stuff:[3,6],ctype:2,nghttp2_strerror:[2,6,5,3],frame:[2,6,4,5,3],contain:[2,6,4,5,3],nghttp2_window_upd:[3,6],netinet:[2,5],setup:[2,5],nghttp2_gzip_inflate_del:[3,6],certif:[2,4,5],set:[2,6,4,5,3],initiate_connect:5,seq:4,sep:4,nghttp2_session_continu:[3,6],ousid:4,remove_stream:2,knowledg:4,displai:4,nul:[3,6],temporarili:[3,6],result:[2,6,5,3],arg:[2,6,5,3],corrupt:5,reserv:[3,6],key_fil:2,becaus:[2,6,5,3],analog:[3,6],subject:[2,6,5,1],strchr:2,statu:[0,6,4,3,2],wire:[2,5],correctli:[3,6],down:[2,5],vari:4,someth:[3,6],supporet:4,state:[2,6,4,3],won:[2,6,3],https_uri:5,author:[2,6,4,5,1],entiti:2,nghttp2_on_data_chunk_recv_callback:[3,6,5],nghttp2_initial_connection_window_s:[3,6],fcntl:2,accord:[3,6],libjansson:4,kei:[2,6,4,3],web:[2,4],numer:[3,6,1],pipefd:2,prior:4,evdns_bas:5,style:4,extens:[4,5],intrus:2,entir:[2,6,3],len:[2,6,5,3],percent_decod:2,consumpt:[2,5],destroi:[2,5],disconnect:[2,5],advertis:[2,5],valid:[3,6,4],addit:[2,6,3],verbos:4,setsockopt:[2,5],file_read_callback:2,last:[3,6,4],nghttp2_session_get_stream_user_data:[2,6,5,3],submit_request:5,nghttp2_proto_version_id:[2,6,5,3],region:[3,6],"0x000300":1,nghttp2_session_want_writ:[2,6,5,3],against:[3,6],tempor:[3,6],damag:[2,6,5,1],etc:[2,4,5],instanc:[3,6],deflatehd:4,agent:4,logic:2,sockaddr:2,mani:[3,6],on_request_recv_callback:[2,6,3],enhance_your_calm:[3,6],com:[0,6,3],nghttp2_data_provid:[2,6,3],simpli:[2,5],nghttp2_settings_entri:[2,6,5,3],point:[2,6,5,3],int32_t:[2,6,5,3],excess:2,nghttp2_err_too_many_inflight_set:[3,6],rfc2616:[3,6],ssl_load_error_str:[2,5],header:[0,2,3,4,5,6],differ:[3,6],nghttp2_error:[3,6],shutdown:[2,6,5,3],suppli:[3,6],cancel:[3,6],respect:5,nghttp2_session:[2,6,5,3],assum:[3,6],window_upd:[3,6,4],backend:4,reciev:5,liabil:[2,6,5,1],evbuffer_get_length:[2,5],settings_timeout:[3,6],nghttp2_recv_callback:[3,6],union:[0,6,3,2],patch:[3,1],due:[3,6],been:[2,6,5,3],insuffici:[3,6],compon:5,whom:[2,6,5,1],nghttp2_on_data_send_callback:[3,6],trigger:[3,6],treat:[2,6,3],interest:[2,4,5],httpbi:[0,4],stdint:6,futur:[3,6],immedi:[3,6],nghttp2_hcat_head:[3,6],netdb:2,add_stream:2,nghttp2_on_unknown_frame_recv_callback:[3,6],field:[2,6,4,5,3],life:2,flight:[3,6],nghttp2_err_nomem:[3,6],settings_enable_push:[3,6,4],both:[2,6,4,5,3],nghttp2_opt:[3,6],lib_error_cod:[3,6],buflen:[3,6],sock_stream:2,search:2,ani:[2,1,3,4,5,6],send_respons:2,ai_addrconfig:2,no_error:4,func:6,ssl_op_no_compress:[2,5],those:[2,6,5,3],delimit:4,"case":[2,6,4,5,3],nghttp2_frame_size_error:[3,6],main:[2,5],look:[2,5],servic:2,zlib:4,progoram:5,defin:[2,6,5,1,3],invok:[2,6,5,3],abov:[2,1,3,4,5,6],nghttp2_callback:[2,5],exist:[3,6,4],invoc:[2,6,3],loop:[2,5],bev_event_timeout:[2,5],create_ssl:[2,5],malloc:[2,5],bufferevent_socket_connect_hostnam:5,nghttp2_session_callback:[2,6,5,3],helper:[3,6],recept:[2,6,5,3],readi:2,libxml2:4,nghttp2_set:[3,6],user_data:[2,6,5,3],equal:2,ai_flag:2,promised_stream_id:[3,6],inform:[2,6,4,5,3],contract:[2,6,5,1],substanti:[2,6,5,1],identifi:[2,6,5,3],incom:[2,6,4,3],flow_control_error:[3,6],ascii:[3,6],nghttp2_settings_initial_window_s:[3,6],sever:[2,6,4,5,3],addr:2,"null":[2,6,5,3],let:[2,5],grant:[2,6,5,1],perform:[2,6,4,3],make:[2,6,4,3],belong:[3,6],same:[2,6,4,5,3],ssl_library_init:[2,5],member:[2,6,3],binari:5,pac:4,decod:[2,6,3],version_str:[3,6],ifndef:[6,1],success:4,nghttp2_on_stream_close_callback:[3,6,5],dyanmic:4,http_parser:5,complet:[2,6,5,3],start_listen:2,finish:[2,5],archiv:[2,5],hostnam:4,stream_id:[2,6,4,5,3],denot:[3,6,5],mytyp:[3,6],effect:[3,6],inflat:[3,6],nghttp2_err_deferred_data_exist:[3,6],synopsi:[2,5],remot:[2,6,4,5,3],moment:4,"0185fafd3c3c7f81":4,ssl_ctx_new:[2,5],user:[3,6,4,5],ownership:[3,6],dealloc:4,extern:6,outbound:[3,6],postpon:[3,6],niv:[3,6,4],aka:[3,6,4],peer_max_concurrent_stream:[3,6],deflates:4,nghttp2_h:6,lower:[3,6],off:5,datalen:[2,5],ai_next:2,thu:[2,6,3],nghttp:4,well:[2,5],app_context:2,non:[2,6,4,5,3],inflatehd:4,person:[2,6,5,1],client:[0,2,3,4,5,6],command:4,nghttp2_push_promis:[3,6],endif:[2,6,1],error_cod:[2,6,4,5,3],fail:[3,6],tlen:[3,6],event2:[2,5],nghttp2_data_sourc:[2,6,3],usual:[3,6],end_push_promis:[3,6],interpret:[3,6],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],protocol:[0,2,3,4,5,6],paus:[3,6],just:[2,6,4,5,3],less:[3,6],nghttp2_on_data_recv_callback:[3,6],entri:[3,6,4],obtain:[2,6,5,1],tcp:[2,5],payloadlen:[3,6],nghttp2_gzip_infl:[3,6],via:4,multiplex:[2,4],"87038504252dd5918386":4,ifdef:[2,6],config:4,on_frame_send_callback:[3,6],previous:[3,6],far:[2,5],sublicens:[2,6,5,1],"0x8":[3,6],struct:[0,6,5,3,2],easi:4,also:[2,6,5,3],cert_fil:2,output_wouldblock_threshold:2,priorit:[3,6],except:[3,6],aris:[2,6,5,1],identif:[3,6],addrlen:2,add:[2,6,3],evbuffer_pullup:[2,5],notifi:2,primit:5,els:[2,5],on_data_send_callback:[3,6],nghttp2_select_next_protocol:[3,6,5],match:5,gmt:4,real:5,applic:[2,6,4,5,3],unistd:[2,5],nghttp2_err_frame_size_error:[3,6],format:[2,6,4,5,3],read:[2,6,4,5,3],hint:2,headlen:[3,6],nghttp2_version_ag:[3,6],period:[3,6],outlen_ptr:[3,6],tabl:[3,6,4],know:[3,6],nva:[2,6,5,3],step:[3,6],strstr:2,bit:[3,6,1],arai:4,associ:[2,1,3,4,5,6],like:[2,6,4,5,3],initialize_nghttp2_sess:[2,5],evbas:[2,5],resid:[2,5],version_num:[3,6],specif:[2,6,5,3],substr:2,http2_session_data:[2,5],uint16_t:[3,6,5],client_addr:2,arbitrari:[3,6],ssl_shutdown:[2,5],html:[0,6,4,3,2],integ:[3,6],server:[0,2,3,4,5,6],nghttp2_flag_end_head:[3,6],"true":4,api:[0,6,3],necessari:2,either:[2,6,3],have:[2,6,4,5,3],sigpip:[2,5],output:[2,6,4,5,3],sig_ign:[2,5],signal:[2,6,5,3],depend:[2,5],underli:[2,5],www:[3,6],revers:4,settings_payload:[3,6],deal:[2,6,5,1,3],manual:4,nghttp2_session_client_new:[3,6,5],field_data:5,begin:5,self:4,evbuffer_remov:2,ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],sure:[2,4,5],sampl:4,on_frame_recv_parse_error_callback:[3,6],context:[2,6,4,5,3],error_html:2,intend:2,sizeof:[2,5],successfulli:[2,5],transport:5,distribut:[2,6,5,1],nonzero:[2,6,3],lev_opt_reus:2,ni_numerichost:2,implement:[0,2,3,4,5,6],lead:[3,6],bottom:[3,6],"function":[0,2,3,4,5,6],nghttp2_data_source_read_callback:[3,6],shall:[2,6,5,1],octet:[2,6,5,3],overlap:[3,6],isxdigit:2,track:[2,4,5],outgo:[3,6],larg:[3,6],unit:4,condit:[2,6,5,1,3],nghttp2_session_upgrad:[3,6],duplic:[3,6],develop:[0,4],localhost:4,refer:[0,6,4,3],machin:4,delete_http2_stream_data:[2,5],sensibl:[3,6],run:[2,6,4,5,3],itself:[3,6],post:[3,6,4],base64url:[3,6],"enum":[0,6,3],usag:[2,5],experiment:[0,4],settings_max_concurrent_stream:[2,6,4,5,3],host:[0,4,5,2],nghttp2_nv_compare_nam:[3,6],repositori:[2,5],found:[2,6,3],peer:[2,6,5,3],strlen:[2,5],nghttp2_session_get_outbound_queue_s:[3,6],decompressor:4,session:[2,6,5,3],src:4,about:[2,6,5,3],eintr:2,actual:[2,6,5,3],socket:[2,4,5],writecb:[2,5],ack:[3,6,4],maxdeflates:4,memori:[2,6,4,5,3],http:[0,1,2,3,4,5,6],getnameinfo:2,respons:[2,6,4,5,3],page:[2,5],nghttp2_gzip:[3,6],chrome:4,idl:[3,6],nghttp2_submit_data:[3,6],ssl_ctx_use_certificate_chain_fil:2,alert:4,act:[2,5],stream_clos:[3,6],disabl:[3,6,4],block:[2,6,4,5,3],rel_path:2,on_data_recv_callback:[3,6],nghttp2_err_paus:[3,6],evbuff:[2,5],nsm:6,no_auto_stream_window_upd:[3,6],least_vers:[3,6],within:4,encod:[2,6,4,3],automat:[3,6],ssl_ctx_set_next_proto_select_cb:[3,6,5],warranti:[2,6,5,1],automak:4,right:[2,6,5,1],error_repli:2,empti:[2,6,4,5,3],nghttp2_opt_set:[3,6],tcp_nodelai:[2,5],last_stream_id:[3,6,4],manag:2,occupi:4,inclus:[3,6],git:[0,6,4,3],fill:2,nghttp2_hcat_respons:[3,6,5],wai:[3,6,4],ai_famili:2,transfer:[0,6,4,3],nghttp2_err_invalid_fram:[3,6],support:[2,6,4,5,3],bodi:[2,6,5,3],json:4,submit:[3,6,5],print:5,avail:[2,6,4,5,3],start:[2,6,4,5,3],nghttp2:[0,1,2,3,4,5,6],nghttp2_err_stream_clos:[3,6],ssl_ctx:[2,6,5,3],includ:[0,1,2,3,4,5,6],maxsiz:4,replac:[3,6],forward:4,findproxyforurl:4,strictli:[3,6],next_proto_list:2,individu:[3,6],send_client_connection_head:5,lowest:[3,6],head:[2,6,3],session_ptr:[3,6],gzip:[3,6,4],unexpect:[3,6],offer:4,"818703881f3468e5891afcbf863c856659c62e3f":4,some:[2,6,5,3],back:[3,6],taken:[3,6],libssl:4,skip:[3,6],bufferevent_fre:[2,5],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],overflow:[3,6],highest:[3,6],buf:[2,6,3],longer:[2,4],count:[3,6],concaten:[3,6],succe:[3,6],prev:2,utf:4,input:[2,6,4,5,3],happen:[2,4,5],nghttp2_stream_clos:[3,6],whether:[2,6,5,1],nghttp2_settings_max:[3,6],caller:[2,6,3],googlecod:[3,6],maximum:[3,6,4],tell:[2,6,5,3],asynchron:[3,6],deafult:4,tini:5,limit:[2,6,5,1],minor:[3,1],hpack:4,on_data_chunk_recv_callback:[3,6,5],bev_opt_defer_callback:[2,5],err_get_error:[2,5],problem:[3,6],autoconf:4,clear:[3,6],libev:[0,4,5,2],http2_stream_data:[2,5],nghttpx:4,produc:[3,6],featur:4,nghttp2_on_frame_not_send_callback:[3,6],nghttp2_session_get_effective_recv_data_length:[3,6],creat:[2,6,4,5,3],strndup:5,"int":[2,6,5,3],retriev:[2,6,5,3],"abstract":[2,5],parser:5,tsujikawa:[2,6,5,1],repres:[3,6],"char":[2,6,5,3],mainli:[3,6],incomplet:4,ipv4:4,nghttp2_flag_end_stream:[3,6],sublen:2,file:[2,1,3,4,5,6],request:[2,6,4,5,3],regul:[2,5],nghttp2_info:[3,6],ends_with:2,nghttp2_err_invalid_header_block:[3,6],link:[2,4],delete_http2_session_data:[2,5],commenc:5,again:[3,6],unnecessari:5,macro:[0,6,1,3],functypedef:6,googl:4,hex:[2,4],"switch":[2,4,5],allow:[3,6,4],nghttp2_session_terminate_sess:[3,6,5],when:[2,6,4,5,3],detail:[3,6],invalid:[3,6],"default":[2,6,4,3],build:[0,4,5],other:[2,6,5,1,3],role:[2,6,5,3],librari:[0,1,2,3,4,5,6],normal:[3,6],nghttp2_submit_:[2,5],nghttp2_prioriti:[3,6],print_head:5,you:[2,6,4,5,3],transmiss:[2,6,5,3],nghttp2_send_callback:[2,6,5,3],unlimit:[3,6],nghttp2_submit_rst_stream:[2,6,3],stat:2,nghttp2_initial_window_s:[3,6],ssl_ctx_set_opt:[2,5],af_unspec:[2,5],privat:2,nghttpd:4,sequenc:[3,6,5],nghttp2_max_window_s:[3,6],technot:[3,6],"return":[2,6,4,5,3],much:2,nghttp2_opt_peer_max_concurrent_stream:[3,6],libtool:4,create_http2_stream_data:[2,5],err_error_str:[2,5],easili:5,nghttp2_err_invalid_argu:[3,6],proto_str:[3,6],alpn:[3,6,4],debian:4,session_data:[2,5],reduc:[3,6],ewouldblock:[2,5],receiv:[2,6,5,3],cunit:4,eof:[2,6,3],algorithm:[3,6],directori:[2,4,5],reliabl:[3,6],mask:[3,6],indirectli:3,nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],nghttp2_no_error:[3,6,5],nghttp2_settings_max_concurrent_stream:[2,6,5,3],ignor:[2,6,3],time:[2,6,4,3],push:[3,6,4],deflat:[3,6,4],"export":2,avoid:[2,6,5,3],nghttp2_session_server_new:[2,6,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 +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_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,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_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_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_RST_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_REFUSED_STREAM:[3,1,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_opt_set:[3,2,1,""],NGHTTP2_VERSION:[3,1,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_session:[3,2,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_CONNECT_ERROR:[3,1,1,""],NGHTTP2_FLAG_END_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_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:{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_frame_recv_callback:[3,0,1,""],on_data_send_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,""],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:{represent:[3,1],all:[2,6,5,1,3],code:[2,6,4,5,3],func:6,on_unknown_frame_recv_callback:[3,6],illustr:4,nghttp2_err_start_stream_not_allow:[3,6],my_obj:[3,6],lack:[3,6],af_unspec:[2,5],getaddrinfo:2,nghttp2_frame_hd:[3,6],nghttp2_cancel:[3,6],opt_set:[3,6],prefix:[2,6,3],overlap:[3,6],nghttp2_session_get_stream_effective_local_window_s:[3,6],follow:[2,1,3,4,5,6],ptr:[2,6,5,3],categori:[3,6,5],decid:[3,6],create_ssl_ctx:[2,5],"const":[2,6,5,3],uint8_t:[2,6,5,3],"0284f77778ff":4,unpack:[3,6],readabl:5,specif:[2,6,5,3],send:[2,6,4,5,3],http_parser_url:5,readcb:[2,5],program:[0,4,5,2],bufferevent_writ:[2,5],under:[3,6,4],sens:[3,6],fatal:[2,6,5,3],bufferevent_getfd:5,spec:[3,6],sent:[2,6,5,3],inform:[2,6,4,5,3],merchant:[2,6,5,1],next_proto_list_len:2,digit:5,sourc:[0,6,5,3,2],point:[2,6,5,3],string:[2,6,4,5,3],nul:[3,6],percentageoforiginals:4,"void":[2,6,5,3],nghttp2_ping:[3,6],settings_header_table_s:[3,6,4],nghttp2_settings_enable_push:[3,6],"default":[2,6,4,3],nghttp2_flag_end_push_promis:[3,6],bufferevent_ssl:[2,5],nghttp2_submit_p:[3,6],failur:[3,6],veri:[3,6,5],untouch:[3,6],no_auto_connection_window_upd:[3,6],relev:[2,5],look:[2,5],tri:[3,6],nghttp2_on_frame_recv_callback:[3,6,5],decod:[2,6,3],magic:[2,5],nghttp2ver_h:1,did:[3,6,5],list:[2,6,3],http_parser_parse_url:5,"try":4,nghttp2_headers_categori:[3,6],settings_id:[3,6],adjust:[3,6],initialize_nghttp2_setup:[2,5],conhead:2,stderr:[2,4,5],verif:5,small:[3,6],refer:[0,6,4,3],nghttp2_settings_id:[3,6],librari:[0,1,2,3,4,5,6],pleas:[2,4,5],prevent:[3,6],impli:[2,6,5,1],on_stream_close_callback:[2,6,5,3],snprintf:5,session_recv:2,"0x1":[3,6],memset:[2,5],direct:4,"0x4":[3,6],zero:[3,6],sensibl:[3,6],pass:[3,6,5],download:[0,4],further:[2,6,5,3],submit:[3,6,5],port:[2,4,5],proxi:[0,4],iteself:[],what:[3,6],appear:[3,6,4],compar:[3,6,5],settings_flow_control_opt:[3,6],ssl_op_no_session_resumption_on_renegoti:[2,5],neg:[3,6],sum:4,invok:[2,6,5,3],current:[2,6,3],delet:5,host:[0,4,5,2],version:[0,6,4,1,3],nghttp2_err_insuff_bufs:[3,6],base64url:[3,6],"new":[2,6,4,5,3],tatsuhiro:[0,1,2,4,5,6],"public":[0,6,4,3],app_cont:2,nghttp2_session_resume_data:[3,6],"enum":[0,6,3],uf_schema:5,abov:[2,1,3,4,5,6],initialize_app_context:2,gener:[3,6,4],http2:[0,6,4,3],onli:[2,6,4,5,3],here:[2,6,4,5,3],closur:[3,6,5],met:[2,6,5,3],nghttp2_rst_stream:[3,6],free:[2,6,5,1,3],ubuntu:4,right:[2,6,5,1],path:[2,4,5],becom:[2,6,1,3],modifi:[2,6,4,5,1],sinc:[2,6,4,5,3],valu:[2,6,4,5,3],nextprotoneg:[3,6],incom:[2,6,4,3],remark:[0,3],sslv23_server_method:2,nghttp2_err_push_dis:[3,6],overwritten:[3,6],larger:[3,6],connect_error:[3,6],step:[3,6],autoreconf:4,queue:[2,6,5,3],jansson:4,amount:[2,5],behav:[3,6],permit:[2,6,5,1],action:[2,6,5,1],nghttp2_submit_prior:[3,6],chang:[2,6,3],nghttp2_err_gzip:[3,6],ourselv:[2,5],nghttp2_frame:[2,6,5,3],nghttp2_err_goaway_already_s:[3,6],regardless:[3,6],extra:[4,5],appli:[3,6],transit:[3,6],prefer:[3,6],bufferevent_ssl_connect:5,releas:[0,1,3],bev_event_error:[2,5],bufferev:[2,5],famili:[2,5],nghttp2_session_mem_recv:[2,6,5,3],instal:4,should:[2,6,5,3],establish:[2,5],"byte":[2,6,4,5,3],unit:4,from:[0,1,2,3,4,5,6],describ:[2,6,5,3],would:[3,6],commun:[2,4,5],stdout:[4,5],regist:2,upgrad:[3,6,4],next:[2,6,4,5,3],bufferevent_get_output:[2,5],call:[2,6,4,5,3],asset:4,nghttp2_nv:[2,6,5,3],nghttp2_on_invalid_frame_recv_callback:[3,6],strdup:2,nghttp2_version:[3,6,1],type:[0,2,3,4,5,6],until:[3,6],minor:[3,1],more:[2,6,4,5,3],nghttp2_opt_no_auto_connection_window_upd:[3,6],goawai:[2,6,4,5,3],nghttp2_set:[3,6],nghttp2_settings_header_table_s:[3,6],src:4,detail:[3,6],nghttp2_pri_default:[3,6,5],relat:[2,5],rst_stream:[2,6,5,3],inflater_ptr:[3,6],notic:[2,6,5,1],user_data:[2,6,5,3],warn:2,flag:[2,6,4,5,3],accept:[2,6,4,3],nghttp2_submit_window_upd:[3,6],particular:[2,6,5,1,3],known:[3,6],hold:[3,6],nghttp2_err_wouldblock:[2,6,5,3],must:[2,6,4,5,3],delete_http2_session_data:[2,5],inputlen:4,account:[3,6,4,5],endpoint:[3,6,4],word:[3,6],err:[2,5],grant:[2,6,5,1],tunnel:4,exit_failur:[2,5],prepar:[3,6],work:[2,4],stream_user_data:[3,6,5],dev:[4,1],cat:[2,6,5,3],damag:[2,6,5,1],descriptor:[2,6,3],remain:[2,6,5,3],minimum:2,can:[2,6,4,5,3],lev_opt_close_on_fre:2,nghttp2_enhance_your_calm:[3,6],nghttp2_flag_ack:[3,6],purpos:[2,6,5,1],root:2,syn_repli:[3,6],uf_path:5,sslv23_client_method:5,control:[3,6],claim:[2,6,5,1],substanti:[2,6,5,1],stream:[2,6,4,5,3],give:[3,6],process:[2,6,4,5,3],nghttp2_submit_data:[3,6],indic:[2,6,5,3],abort:[3,6],fprintf:[2,5],ssl_op_al:[2,5],want:[2,6,5,3],nghttp2_header:[2,6,5,3],onlin:[3,4],serial:[2,6,5,3],nghttp2_err_invalid_stream_st:[3,6],unsign:[2,6,5,3],occur:[3,6],nghttp2_settings_flow_control_opt:[3,6],alwai:[2,6,3],flow_control_error:[3,6],multipl:[2,6,5,3],secur:4,anoth:[3,6],charset:4,ping:[3,6],nghttp2_flag_non:[2,6,5,3],write:[2,4,5],fals:4,nghttp2_err_fat:[3,6],ssl_ctx_use_privatekey_fil:2,serveraddr:4,reject:[3,6],sec9:[3,6],instead:[3,6],gzip:[3,6,4],nghttp2_frame_typ:[3,6],opt_set_mask:[3,6],updat:[3,6],nullifi:[3,6],nghttp2_msg_more:6,nghttp2_on_request_recv_callback:[3,6],npn:[2,6,4,5,3],resourc:[0,6,4,5,3],referenc:4,huge:[2,5],max:5,after:[2,6,4,5,3],variant:[3,6],spdylai:4,nghttp2_callback:[],befor:[2,6,5,3],nghttp2_submit_rst_stream:[2,6,3],nghttp2_hcat_respons:[3,6,5],mai:[2,6,4,5,3],end:[2,5],acceptcb:2,nghttp2_compression_error:[3,6],demonstr:5,request_path:2,subsequ:[3,6],alloc:[2,6,3],github:[0,4],attempt:[3,6],nghttp2_err_invalid_stream_id:[3,6],third:[2,6,5,3],read:[2,6,4,5,3],opaqu:[3,6],stdin:4,nvlen:[2,6,5,3],correspond:[2,4],exclud:[3,6],issu:[0,6,3],nghttp2_flag_prior:[3,6],nghttp2_err_flow_control:[3,6],nghttp2_connect_error:[3,6],ssize_t:[2,6,5,3],aaaabaaaagqaaaahaad__w:4,first:[2,6,4,5,3],order:[2,6,4,3],furnish:[2,6,5,1],includ:[0,1,2,3,4,5,6],oper:[3,6,4],frontend:4,nghttp2_err_stream_shut_wr:[3,6],nghttp2_err_paus:[3,6],hypertext:[0,4],move:[3,6],rang:[3,6,4],libcunit1:4,through:[2,4],nghttp2_no_error:[3,6,5],size_t:[2,6,5,3],eagain:[2,5],nghttp2_err_unsupported_vers:[3,6],still:[3,6,4],pointer:[2,6,3],paramet:[3,6,5],typedef:[0,6,5,3,2],outer:4,no_auto_stream_window_upd:[3,6],fit:[2,6,5,1],how:5,fwrite:5,eof:[2,6,3],precondit:[3,6],max_outlen:[3,6],nghttp2_hcat_push_respons:[3,6],tort:[2,6,5,1],window:[3,6],pend:[2,6,5,3],whether:[2,6,5,1],nghttp2_err_eof:[3,6],hidden:[3,6],therefor:[3,6,5],nghttp2_session_send:[2,6,5,3],inlen:[3,6,5],valuelen:[2,6,5,3],"0x010203":[3,1],them:[2,6,5,3],within:4,recal:5,greater:[3,6],thei:[2,6,4,5,3],handl:[2,5],nghttp2_push_promis:[3,6],nghttp2_goawai:[3,6],safe:[2,6,3],handi:5,initi:[2,6,5,3],"break":[2,6,5,3],nghttp2_initial_max_concurrent_stream:[3,6],nghttp2_submit_head:[3,6],promis:[3,6],automat:[3,6],half:[3,6],aka:[3,6,4],readlen:2,enabl:[3,6,4],choic:[3,6],on_frame_recv_parse_error_callback:[3,6],itself:[2,6,5,3],retriev:[2,6,5,3],name:[2,6,4,5,3],nghttp2_err_callback_failur:[2,6,5,3],anyth:5,simpl:[2,6,5,3],uf_port:5,drop:[2,6,5,3],tear:[2,5],achiev:[2,6,3],ai_addr:2,mode:4,timeout:[2,5],each:[2,6,4,3],debug:[3,6,5],found:[2,6,3],complet:[2,6,5,3],side:[2,6,3],trailer:[3,6],mean:[3,6,4,5],either:[2,6,3],slen:2,nghttp2_on_frame_send_callback:[3,6],bump:[3,6],protocol_error:[3,6],chunk:[3,6,5],monoton:5,overflow:[3,6],continu:[2,6,4,5,3],realli:5,nghttp2_err_temporal_callback_failur:[2,6,3],"static":[2,6,4,5,3],expect:4,event_base_loop:[2,5],our:5,nghttp2_session_server_new2:[3,6],ai_addrlen:2,field_set:5,event:[2,6,5,1],special:[],out:[2,1,3,4,5,6],nghttp2_session_want_read:[2,6,5,3],app_ctx:2,network:[2,5],space:[3,6,4],bufferevent_openssl_socket_new:[2,5],req:[3,6],nghttp2_err_invalid_header_block:[3,6],publish:[2,6,5,1],primari:[3,6],content:[0,4,2],etag:4,suitabl:[3,6],rel:2,nghttp2_client_connection_header_len:[2,6,5,3],got:[3,6],on_frame_not_send_callback:[3,6],excess:2,recv_callback:[3,6],end_stream:[3,6,4],earlier:[2,4,5],nghttp2_err_deferred_data_exist:[3,6],event_base_new:[2,5],insid:4,state:[2,6,4,3],mytyp:[3,6],situat:[2,5],given:[3,6],argv:[2,5],effect:[3,6],signal:[2,6,5,3],reason:[2,6,3],base:[2,4,5],usual:[3,6],put:[3,6],org:[0,6,4,3],nghttp2_flag:[3,6],argc:[2,5],recv:4,sublicens:[2,6,5,1],version_num:[3,6],spdy:[3,6,4],nghttp2ver:[0,6,1,3],wai:[3,6,4],thread:[2,4],badli:[3,6],could:[2,6,5,3],omit:[3,6,5],openssl:[2,4,5],keep:[2,6,4,5,3],thing:[2,5],length:[2,6,4,5,3],"0185fafd3c3c7f81":4,place:[3,6],outsid:[3,4],transfer:[0,6,4,3],retain:[3,6],assign:[2,6,5,3],nghttp2_version_num:[3,6,1],evdns_base_new:5,feed:[2,5],softwar:[2,6,5,1],major:[3,6,1],nghttp2_max_header_table_s:[3,6],addrinfo:2,directli:[2,6,5,3],warnx:[2,5],onc:[3,6],arrai:[3,6,4,5],dealloc:4,number:[2,6,1,3],yourself:4,restrict:[2,6,5,1],nghttp2_protocol_error:[3,6],nghttp2_flow_control_error:[3,6],done:[2,4,5],messag:[3,6,5],stdlib:6,outlen_ptr:[3,6],on_frame_recv_callback:[2,6,5,3],evdns_base_fre:5,open:[2,6,4,3],payload:[3,6],size:[2,6,4,3],prioriti:[3,6,5],avail:[2,6,4,5,3],nghttp2_internal_error:[2,6,3],nghttpx:4,smaller:4,seq:4,script:4,unknown:[2,6,3],data_prd:[2,6,3],binari:5,system:[2,5],least:[3,6,4],taken:[3,6],defer:[2,6,5,3],attach:[2,5],necessarili:[3,6],draft:[0,6,4,3],too:[2,6,3],memcmp:2,termin:[2,6,4,5,3],internal_error:[3,6],scheme:[4,5],"final":[3,6],store:[2,6,5,3],listen:[2,4],allow:[3,6,4],"0x0":[3,6],sigact:[2,5],option:[2,6,4,5,3],caller:[2,6,3],tool:[0,4],similarli:[3,6],lower:[3,6],specifi:[2,6,4,5,3],nghttp2_client_connection_head:[2,6,5,3],compressor:4,autotool:4,sa_handl:[2,5],enqueu:5,alreadi:[2,6,5,3],sign:4,holder:[2,6,5,1],than:[2,6,4,3],serv:2,wide:2,kind:[2,6,5,1,3],conveni:[3,6],target:[3,6],instanc:[3,6],nghttp2_err_header_comp:[3,6],remov:[2,6,3],see:[2,6,4,5,3],structur:[2,6,5,3],charact:[2,6,5,3],project:[0,4],bridg:4,headert:4,were:[2,5],posit:[3,6],consumpt:[2,5],read_callback:[2,6,3],bev:[2,5],ssl_new:[2,5],browser:4,"function":[0,2,3,4,5,6],sai:[3,6],bufferevent_get_input:[2,5],window_size_incr:[3,6,4],close:[2,6,4,5,3],well:[2,5],eventcb:[2,5],pri:[3,6],argument:[2,6,4,5,3],arrlen:[2,5],packag:4,replac:[3,6],endif:[2,6,1],increment:[3,6],tabl:[3,6,4],need:[3,6,4,5],bufferevent_socket_connect_hostnam:5,element:[2,6,4,3],nghttp2_on_frame_recv_parse_error_callback:[3,6],ai_socktyp:2,nghttp2_session_recv:[3,6],sell:[2,6,5,1],caus:[3,6],bitwis:[3,6],date:4,form:[3,6],equival:[3,6],callback:[2,6,5,3],"0x04":4,"0x05":4,nghttp2_io_flag:6,"0x00":4,"0x01":4,client:[0,2,3,4,5,6],note:[2,6,4,5,3],nghttp2_refused_stream:[3,6],exampl:[2,6,4,5,3],unlimit:[3,6],take:[2,6,4,5,3],which:[2,6,4,5,3],transmit:[3,6,5],zlib:4,noth:[3,6],singl:[2,6,4,3],opaque_data_len:[3,6],make_nv:[2,5],copi:[2,6,5,1,3],unless:[3,6],distribut:[2,6,5,1],reacb:5,shall:[2,6,5,1],buffer:[2,6,4,5,3],"__cplusplu":6,object:[2,6,4,5,3],compress:[0,4],settings_max_concurrent_stream:[2,6,4,5,3],nghttp2_hcat_request:[2,6,5,3],most:[3,6,4],vnu:4,nghttp2_settings_timeout:[3,6],stream_data:[2,5],pathlen:5,remove_stream:2,thi:[0,1,2,3,4,5,6],pair:[3,6,4],nghttp2_version_ag:[3,6],larg:[3,6],charg:[2,6,5,1],sub:2,nghttp2_error_cod:[2,6,5,3],nghttp2_err_stream_id_not_avail:[3,6],simplic:5,don:[2,6,3],o_rdonli:2,hex_to_uint:2,url:[2,4],doc:4,frame_size_error:[3,6,4],later:[2,6,5,3],flow:[3,6],uri:[4,5],doe:[2,6,4,5,3],pipe:2,talk:[2,4],nghttp2_err_invalid_st:[3,6],sun:4,pars:[3,6,5],opaque_data:[3,6,4],automak:4,event_base_fre:[2,5],gracefulli:5,on_invalid_frame_recv_callback:[3,6],hdtest:4,show:[4,5],text:4,send_respons:2,page:[2,5],bev_event_eof:[2,5],unprocess:[2,5],concurr:[2,6,3],pkg:4,permiss:[2,6,5,1],threshold:2,authroiti:5,data:[2,6,4,5,3],bufferevent_setcb:[2,5],redirect:5,access:4,nghttp2_submit_push_promis:[3,6],exactli:2,locat:5,copyright:[2,6,5,1],refused_stream:[3,6],explain:5,configur:[3,6,4],apach:4,figur:4,start:[2,6,4,5,3],"short":[2,5],nghttp2_opt_no_auto_stream_window_upd:[3,6],dnsbase:5,busi:[2,5],queu:[2,6,5,3],"4e5535a027780":4,local:[3,6],oct:4,nghttp2_session_get_stream_effective_recv_data_length:[3,6],meant:5,count:[3,6],over:[2,4,5],nghttp2_err_proto:[3,6],syn_stream:[3,6],variou:[3,6],get:[2,6,4,5,3],authoritylen:5,familiar:4,express:[2,6,5,1],stop:[2,5],memcpi:[2,5],nghttp2_session_client_new2:[3,6],outlen:[3,6,5],end_head:[3,6,4],ssl:[2,6,4,5,3],settings_initial_window_s:[3,6,4],cannot:[2,6,3],nghttp2_data:[3,6],evbuffer_drain:[2,5],increas:[3,6,5],liabl:[2,6,5,1],nghttp2_session_server_new:[2,6,3],ssl_ctx_set_opt:[2,5],requir:[0,6,4,3],doubli:2,before_frame_send_callback:[3,6,5],receiv:[2,6,5,3],nghttp2_submit_respons:[2,6,3],retreiv:5,ai_pass:2,crt:2,ietf:[0,4],nghttp2_on_data_chunk_recv_callback:[3,6,5],nghttp2_set_stream_user_data:2,nghttp2_stream_clos:[3,6],nghttp2_frame_size_error:[3,6],push_promis:[3,6],method:[2,6,4,5,3],remot:[2,6,4,5,3],stuff:[3,6],nghttp2_strerror:[2,6,5,3],contain:[2,6,4,5,3],nghttp2_window_upd:[3,6],netinet:[2,5],setup:[2,5],nghttp2_gzip_inflate_del:[3,6],user:[3,6,4,5],certif:[2,4,5],set:[2,6,4,5,3],"87038504252dd5918386":4,bufferevent_ssl_accept:2,sep:4,nghttp2_session_continu:[3,6],ousid:4,frame:[2,6,4,5,3],knowledg:4,maximum:[3,6,4],nghttp2_submit_goawai:[3,6],temporarili:[3,6],result:[2,6,5,3],arg:[2,6,5,3],corrupt:5,ipproto_tcp:[2,5],key_fil:2,becaus:[2,6,5,3],analog:[3,6],subject:[2,6,5,1],strchr:2,statu:[0,6,4,3,2],wire:[2,5],correctli:[3,6],vari:4,someth:[3,6],numer:[3,6,1],written:[2,6,4,5,3],won:[2,6,3],https_uri:5,entiti:2,bev_opt_close_on_fre:[2,5],nghttp2_initial_connection_window_s:[3,6],fcntl:2,accord:[3,6],libjansson:4,hpack:4,kei:[2,6,4,3],supporet:4,evdns_bas:5,prior:4,pipefd:2,style:4,extens:[4,5],intrus:2,entir:[2,6,3],len:[2,6,5,3],percent_decod:2,nghttp2_pack_settings_payload:[3,6],disconnect:[2,5],advertis:[2,5],addit:[2,6,3],setsockopt:[2,5],file_read_callback:2,last:[3,6,4],nghttp2_session_get_stream_user_data:[2,6,5,3],submit_request:5,nghttp2_proto_version_id:[2,6,5,3],region:[3,6],"0x000300":1,nghttp2_session_want_writ:[2,6,5,3],against:[3,6],tempor:[3,6],etc:[2,4,5],tutori:[0,5,2],deflatehd:4,agent:4,logic:2,sockaddr:2,compression_error:[3,6],on_request_recv_callback:[2,6,3],enhance_your_calm:[3,6],whole:[3,6],nghttp2_data_provid:[2,6,3],nghttp2_settings_max:[3,6],simpli:[2,5],nghttp2_settings_entri:[2,6,5,3],send_server_connection_head:2,int32_t:[2,6,5,3],last_stream_id:[3,6,4],nghttp2_err_too_many_inflight_set:[3,6],rfc2616:[3,6],ssl_load_error_str:[2,5],header:[0,2,3,4,5,6],nghttp2_session_del:[2,6,5,3],featur:4,differ:[3,6],shutdown:[2,6,5,3],suppli:[3,6],cancel:[3,6],respect:5,nghttp2_session:[2,6,5,3],assum:[3,6],window_upd:[3,6,4],backend:4,reciev:5,liabil:[2,6,5,1],evbuffer_get_length:[2,5],settings_timeout:[3,6],creat:[2,6,4,5,3],nghttp2_recv_callback:[3,6],union:[0,6,3,2],patch:[3,1],due:[3,6],been:[2,6,5,3],insuffici:[3,6],compon:5,whom:[2,6,5,1],nghttp2_on_data_send_callback:[3,6],trigger:[3,6],unexpect:[3,6],treat:[2,6,3],interest:[2,4,5],httpbi:[0,4],stdint:6,buf:[2,6,3],immedi:[3,6],nghttp2_hcat_head:[3,6],"abstract":[2,5],add_stream:2,nghttp2_on_unknown_frame_recv_callback:[3,6],life:2,flight:[3,6],outputlength:4,settings_enable_push:[3,6,4],nghttp2_session_terminate_sess:[3,6,5],nghttp2_opt:[3,6],lib_error_cod:[3,6],buflen:[3,6],sock_stream:2,search:2,ani:[2,1,3,4,5,6],ewouldblock:[2,5],ai_addrconfig:2,evconnlisten:2,ssl_op_no_compress:[2,5],stream_clos:[3,6],those:[2,6,5,3],delimit:4,uf_queri:5,multi:4,main:[2,5],hdr:[2,5],maxsiz:4,servic:2,properti:[2,5],progoram:5,defin:[2,6,5,1,3],"while":[2,6,5,3],behavior:[3,6],error:[2,6,4,5,3],decreas:[3,6],invoc:[2,6,3],loop:[2,5],bev_event_timeout:[2,5],create_ssl:[2,5],malloc:[2,5],printabl:5,nghttp2_session_callback:[2,6,5,3],helper:[3,6],recept:[2,6,5,3],readi:2,libxml2:4,squid:4,select_next_proto_cb:[3,6,5],equal:2,promised_stream_id:[3,6],archiv:[2,5],contract:[2,6,5,1],conf:4,identifi:[2,6,5,3],crash:3,ssl_ctx_use_certificate_chain_fil:2,ascii:[3,6],nghttp2_settings_initial_window_s:[3,6],sever:[2,6,4,5,3],addr:2,"null":[2,6,5,3],let:[2,5],author:[2,6,4,5,1],perform:[2,6,4,3],make:[2,6,4,3],belong:[3,6],same:[2,6,4,5,3],ssl_library_init:[2,5],member:[2,6,3],check_path:2,when:[2,6,4,5,3],pac:4,headlen:[3,6],version_str:[3,6],ifndef:[6,1],document:[0,1,2,4,5,6],dyanmic:4,greac:[2,5],create_http2_stream_data:[2,5],start_listen:2,finish:[2,5],http:[0,1,2,3,4,5,6],hostnam:4,stream_id:[2,6,4,5,3],again:[3,6],bufferevent_openssl_get_ssl:[2,5],uf_host:5,inflat:[3,6],decompress:4,moment:4,handshake_leftlen:2,ssl_ctx_new:[2,5],zlib1g:4,ownership:[3,6],mani:[3,6],extern:6,outbound:[3,6],postpon:[3,6],niv:[3,6,4],implement:[0,2,3,4,5,6],peer_max_concurrent_stream:[3,6],deflates:4,nghttp2_h:6,noninfring:[2,6,5,1],rememb:[2,5],off:5,datalen:[2,5],com:[0,6,3],thu:[2,6,3],nghttp:4,nghttp2_session_get_effective_local_window_s:[3,6],app_context:2,non:[2,6,4,5,3],inflatehd:4,person:[2,6,5,1],without:[2,1,3,4,5,6],command:4,uint32_t:[3,6],destroi:[2,5],error_cod:[2,6,4,5,3],fail:[3,6],event2:[2,5],nghttp2_data_sourc:[2,6,3],left:[3,6],end_push_promis:[3,6],interpret:[3,6],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],protocol:[0,2,3,4,5,6],paus:[3,6],just:[2,6,4,5,3],less:[3,6],nghttp2_on_data_recv_callback:[3,6],send_callback:[2,6,5,3],reorder:[3,6,5],obtain:[2,6,5,1],tcp:[2,5],payloadlen:[3,6],nghttp2_gzip_infl:[3,6],select:[3,6,4,5],via:4,multiplex:[2,4],initiate_connect:5,ifdef:[2,6],config:4,on_frame_send_callback:[3,6],previous:[3,6],web:[2,4],"0x8":[3,6],struct:[0,6,5,3,2],easi:4,also:[2,6,5,3],cert_fil:2,output_wouldblock_threshold:2,priorit:[3,6],except:[3,6],aris:[2,6,5,1],identif:[3,6],addrlen:2,add:[2,6,3],evbuffer_pullup:[2,5],notifi:2,primit:5,els:[2,5],on_data_send_callback:[3,6],nghttp2_select_next_protocol:[3,6,5],cunit:4,match:[2,5],gmt:4,real:5,applic:[2,6,4,5,3],unistd:[2,5],nghttp2_err_frame_size_error:[3,6],format:[2,6,4,5,3],create_http2_session_data:[2,5],hint:2,ssl_shutdown:[2,5],http_parser:5,period:[3,6],test:[0,4],entri:[3,6,4],know:[3,6],nva:[2,6,5,3],resid:[2,5],bit:[3,6,1],arai:4,associ:[2,1,3,4,5,6],warranti:[2,6,5,1],like:[2,6,4,5,3],initialize_nghttp2_sess:[2,5],herebi:[2,6,5,1],strstr:2,next_proto_cb:2,success:4,substr:2,http2_session_data:[2,5],uint16_t:[3,6,5],client_addr:2,arbitrari:[3,6],manual:4,html:[0,6,4,3,2],nghttp2_pri_lowest:[3,6],server:[0,2,3,4,5,6],nghttp2_flag_end_head:[3,6],api:[0,6,3],index:4,tlen:[3,6],have:[2,6,4,5,3],sigpip:[2,5],tcp_nodelai:[2,5],findproxyforurl:4,sig_ign:[2,5],travers:2,no_error:4,depend:[2,5],underli:[2,5],provid:[2,6,5,1,3],revers:4,deal:[2,6,5,1,3],reserv:[3,6],nghttp2_session_client_new:[3,6,5],field_data:5,begin:5,self:4,evbuffer_remov:2,ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],sure:[2,4,5],sampl:4,integ:[3,6],context:[2,6,4,5,3],error_html:2,sizeof:[2,5],successfulli:[2,5],transport:5,transmiss:[2,6,5,3],nonzero:[2,6,3],lev_opt_reus:2,ni_numerichost:2,both:[2,6,4,5,3],lead:[3,6],bottom:[3,6],nghttp2_data_source_read_callback:[3,6],though:4,octet:[2,6,5,3],per:[3,6],isxdigit:2,track:[2,4,5],outgo:[2,6,3],exit:[2,5],make_nv2:5,strlen:[2,5],condit:[2,6,5,1,3],nghttp2_session_upgrad:[3,6],duplic:[3,6],localhost:4,freed:4,machin:4,delete_http2_stream_data:[2,5],ai_next:2,run:[2,6,4,5,3],post:[3,6,4],reach:[3,6],inspect:[3,6],usag:[2,5],experiment:[0,4],chart:[3,6],settings_payloadlen:[3,6],nghttp2_nv_compare_nam:[3,6],repositori:[2,5],output:[2,6,4,5,3],peer:[2,6,5,3],getnameinfo:2,nghttp2_session_get_outbound_queue_s:[3,6],decompressor:4,session:[2,6,5,3],handshake_readcb:2,about:[2,6,5,3],eintr:2,actual:[2,6,5,3],socket:[2,4,5],writecb:[2,5],ack:[3,6,4],maxdeflates:4,memori:[2,6,4,5,3],inlen_ptr:[3,6],respons:[2,6,4,5,3],manag:2,nghttp2_gzip:[3,6],chrome:4,idl:[3,6],settings_payload:[3,6],on_data_chunk_recv_callback:[3,6,5],alert:4,act:[2,5],libtool:4,ssl_tlsext_err_ok:[2,6,5,3],disabl:[3,6,4],block:[2,6,4,5,3],rel_path:2,on_data_recv_callback:[3,6],routin:[2,5],evbuff:[2,5],nsm:6,evbas:[2,5],least_vers:[3,6],deploi:4,encod:[2,6,4,3],www:[3,6],ssl_op_no_sslv2:[2,5],ssl_ctx_set_next_proto_select_cb:[3,6,5],down:[2,5],nghttp2_before_frame_send_callback:[3,6,5],errx:[2,5],error_repli:2,empti:[2,6,4,5,3],nghttp2_opt_set:[3,6],nghttp2_on_stream_close_callback:[3,6,5],necessari:2,merg:[2,6,5,1],occupi:4,inclus:[3,6],git:[0,6,4,3],fill:2,session_send:[2,5],val:[2,5],ai_famili:2,errno:2,nghttp2_err_invalid_fram:[3,6],support:[2,6,4,5,3],bodi:[2,6,5,3],json:4,"long":[3,6],print:5,verbos:4,ssl_filetype_pem:2,nghttp2:[0,1,2,3,4,5,6],nghttp2_err_stream_clos:[3,6],ssl_ctx:[2,6,5,3],low:[3,6],lot:[3,6],ipv6:4,forward:4,overhead:4,strictli:[3,6],next_proto_list:2,ipv4:4,lowest:[3,6],head:[2,6,3],session_ptr:[3,6],nghttp2_proto_version_id_len:[2,6,3],event_bas:[2,5],offer:4,"818703881f3468e5891afcbf863c856659c62e3f":4,some:[2,6,5,3],back:[3,6],bev_event_connect:[2,5],libssl:4,skip:[3,6],bufferevent_fre:[2,5],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],line:4,highest:[3,6],"true":4,http2_select:[3,6],reset:5,concaten:[3,6],succe:[3,6],prev:2,utf:4,input:[2,6,4,5,3],happen:[2,4,5],possibl:[2,6,5,3],nghttp2_info:[3,6],ssl_ctx_free:[2,5],nghttpd:4,googlecod:[3,6],displai:4,tell:[2,6,5,3],asynchron:[3,6],other:[2,6,5,1,3],deafult:4,limit:[2,6,5,1],tini:5,"case":[2,6,4,5,3],bev_opt_defer_callback:[2,5],otherwis:[2,6,5,1,3],problem:[3,6],autoconf:4,clear:[3,6],libev:[0,4,5,2],http2_stream_data:[2,5],err_get_error:[2,5],produc:[3,6],nghttp2_error:[3,6],synopsi:[2,5],nghttp2_on_frame_not_send_callback:[3,6],nghttp2_session_get_effective_recv_data_length:[3,6],individu:[3,6],strndup:5,"int":[2,6,5,3],request:[2,6,4,5,3],netdb:2,parser:5,tsujikawa:[2,6,5,1],repres:[3,6],"char":[2,6,5,3],mainli:[3,6],incomplet:4,nghttp2_flag_end_stream:[3,6],sublen:2,file:[2,1,3,4,5,6],ai_flag:2,regul:[2,5],exist:[3,6,4],ends_with:2,check:[2,6,5,3],link:[2,4],nghttp2_err_nomem:[3,6],commenc:5,denot:[3,6,5],macro:[0,6,1,3],functypedef:6,googl:4,hex:[2,4],"switch":[2,4,5],titl:2,percent:2,unnecessari:5,invalid:[3,6],field:[2,6,4,5,3],build:[0,4,5],valid:[3,6,4],role:[2,6,5,3],futur:[3,6],normal:[3,6],nghttp2_submit_:[2,5],nghttp2_prioriti:[3,6],ignor:[2,6,3],you:[2,6,4,5,3],send_client_connection_head:5,nghttp2_send_callback:[3,6,5],intention:[3,6],level:[2,6,3],fork:4,stat:2,nghttp2_initial_window_s:[3,6],intend:2,connect:[2,1,3,4,5,6],privat:2,fulli:[3,6],sequenc:[2,6,5,3],nghttp2_max_window_s:[3,6],technot:[3,6],"return":[2,6,4,5,3],much:2,nghttp2_opt_peer_max_concurrent_stream:[3,6],push:[3,6,4],queri:5,ctype:2,err_error_str:[2,5],easili:5,address:4,nghttp2_err_invalid_argu:[3,6],proto_str:[3,6],alpn:[3,6,4],debian:4,session_data:[2,5],reduc:[3,6],evconnlistener_new_bind:2,nghttp2_gzip_inflate_new:[3,6],sphinx:4,longer:[2,4],algorithm:[3,6],directori:[2,4,5],reliabl:[3,6],mask:[3,6],indirectli:3,nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],portion:[2,6,5,1,3],nghttp2_settings_max_concurrent_stream:[2,6,5,3],print_head:5,time:[2,6,4,3],far:[2,5],deflat:[3,6,4],"export":2,avoid:[2,6,5,3],develop:[0,4]},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 8181f236..c36e2e5d 100644 --- a/tutorial-client.html +++ b/tutorial-client.html @@ -144,7 +144,7 @@ resource denoted by the URI. Its synopsis is like this:

$ libevent-client HTTPS_URI

We use libevent in this tutorial to handle networking I/O. Please -note that nghttp2 iteself does not depends on libevent.

+note that nghttp2 itself does not depend on libevent.

First we do some setup routine for libevent and OpenSSL library in function main() and run(), which is not so relevant to nghttp2 library use. The one thing you should look at is setup NPN callback. @@ -248,8 +248,8 @@ the remote server:

We set 3 callbacks for the bufferevent: reacb, writecb and eventcb.

The eventcb() is invoked by libevent event loop when an event -(e.g., connection established, timeout, etc) happens on the underlying -network socket:

+(e.g., connection has been established, timeout, etc) happens on the +underlying network socket:

static void eventcb(struct bufferevent *bev, short events, void *ptr)
 {
   http2_session_data *session_data = (http2_session_data*)ptr;
@@ -406,8 +406,8 @@ frames. The session_send()
 

The nghttp2_session_send() function serializes the frame into wire -format and call nghttp2_callbacks.nghttp2_send_callback with -it. We set send_callback() function as +format and call nghttp2_session_callbacks.send_callback with +it. We set send_callback() function to nghttp2_session_callbacks.send_callback in initialize_nghttp2_session() function described earlier. It is defined as follows:

@@ -456,7 +456,7 @@ conditions as well. Using these information, nghttp2 session object will tell whether the connection should be dropped or not. More specifically, both nghttp2_session_want_read() and nghttp2_session_want_write() return 0, we have no business in the -connection. But since we have using bufferevent and its deferred +connection. But since we are using bufferevent and its deferred callback option, the bufferevent output buffer may contain the pending data when the writecb() is called. To handle this situation, we also check whether the output buffer is empty or not. If these diff --git a/tutorial-server.html b/tutorial-server.html index a8e09baf..32bbc388 100644 --- a/tutorial-server.html +++ b/tutorial-server.html @@ -136,10 +136,10 @@

Tutorial: HTTP/2.0 server

In this tutorial, we are going to write single-threaded, event-based -HTTP/2.0 web server, which supports HTTPS. It can handle concurrent -multiple requests, but only GET method is supported. The complete -source code, libevent-server.c, is attached at the end of this -page. It also resides in examples directory in the archive or +HTTP/2.0 web server, which supports HTTPS only. It can handle +concurrent multiple requests, but only GET method is supported. The +complete source code, libevent-server.c, is attached at the end of +this page. It also resides in examples directory in the archive or repository.

This simple server takes 3 arguments, a port number to listen to, a path to SSL/TLS private key file and certificate file. Its synopsis @@ -147,16 +147,16 @@ is like this:

$ libevent-server PORT /path/to/server.key /path/to/server.crt

We use libevent in this tutorial to handle networking I/O. Please -note that nghttp2 iteself does not depends on libevent.

+note that nghttp2 itself does not depend on libevent.

First we do some setup routine for libevent and OpenSSL library in function main() and run(), which is not so relevant to nghttp2 library use. The one thing you should look at is setup NPN callback. The NPN callback is used for the server to advertise the application protocols the server supports to a client. In this example program, -when creating SSL_CTX object, we stores the application protocol name -in the wire format of NPN in statically allocated buffer. This is safe -because we only create 1 SSL_CTX object in the entire program life -time:

+when creating SSL_CTX object, we stores the application protocol +name in the wire format of NPN in statically allocated buffer. This is +safe because we only create 1 SSL_CTX object in the entire program +life time:

static unsigned char next_proto_list[256];
 static size_t next_proto_list_len;
 
@@ -186,14 +186,14 @@ time:

}
-

The wire format of NPN is array of length prefixed string. The exactly -one byte is used to specify the length of the protocol identifier. In -this tutorial, we advertise the HTTP/2.0 protocol the nghttp2 library -supports. We export its identifier in -NGHTTP2_PROTO_VERSION_ID. The next_proto_cb() function is -the server-side NPN callback. In OpenSSL implementation, We just +

The wire format of NPN is a sequence of length prefixed string. The +exactly one byte is used to specify the length of each protocol +identifier. In this tutorial, we advertise the HTTP/2.0 protocol the +nghttp2 library supports. The nghttp2 library exports its identifier +in NGHTTP2_PROTO_VERSION_ID. The next_proto_cb() function +is the server-side NPN callback. In OpenSSL implementation, we just assign the pointer to the NPN buffers we filled earlier. The NPN -callback function is set to SSL_CTX object using +callback function is set to SSL_CTX object using SSL_CTX_set_next_protos_advertised_cb().

We use app_content structure to store the application-wide data:

struct app_context {
@@ -230,7 +230,8 @@ object in O(1). The first element of this list is pointed by the
 root->next in http2_session_data.  Initially, root->next
 is NULL. The handshake_leftlen member of
 http2_session_data is used to track the number of bytes remaining
-when receiving first 24 bytes magic values from the client.  We use
+when receiving first 24 bytes magic value
+(NGHTTP2_CLIENT_CONNECTION_HEADER) from the client.  We use
 libevent’s bufferevent structure to perform network I/O. Notice that
 bufferevent object is in http2_session_data and not in
 http2_stream_data. This is because http2_stream_data is just a
@@ -289,8 +290,8 @@ is accepted:

connection is also initialized at this time. We specify 2 callbacks for the bufferevent: handshake_readcb and eventcb.

The eventcb() is invoked by libevent event loop when an event -(e.g., connection established, timeout, etc) happens on the underlying -network socket:

+(e.g., connection has been established, timeout, etc) happens on the +underlying network socket:

static void eventcb(struct bufferevent *bev, short events, void *ptr)
 {
   http2_session_data *session_data = (http2_session_data*)ptr;
@@ -350,13 +351,13 @@ it:

}
-

Nothing special here, we just compare the magic byte string received -and expected one NGHTTP2_CLIENT_CONNECTION_HEADER. When -whole magic byte string is received, the connection state is ready for -starting HTTP/2.0 communication. First we change the callback -functions for the bufferevent object. We use same eventcb as -before. But we specify new readcb and writecb function to -handle HTTP/2.0 communication. We describe these 2 functions later.

+

We check that the received byte string matches +NGHTTP2_CLIENT_CONNECTION_HEADER. When they match, the +connection state is ready for starting HTTP/2.0 communication. First +we change the callback functions for the bufferevent object. We use +same eventcb as before. But we specify new readcb and +writecb function to handle HTTP/2.0 communication. We describe +these 2 functions later.

We initialize nghttp2 session object which is done in initialize_nghttp2_session():

static void initialize_nghttp2_session(http2_session_data *session_data)
@@ -427,9 +428,9 @@ functions for these pending data. To process received data, we call
 

In this function, we feed all unprocessed, received data to nghttp2 session object using nghttp2_session_mem_recv() function. The nghttp2_session_mem_recv() processes the received data and may -invoke nghttp2 callbacks and also queue frames. Since there may be -pending frames, we call session_send() function to send those -frames. The session_send() function is defined as follows:

+invoke nghttp2 callbacks and also queue outgoing frames. Since there +may be pending frames, we call session_send() function to send +those frames. The session_send() function is defined as follows:

static int session_send(http2_session_data *session_data)
 {
   int rv;
@@ -443,8 +444,8 @@ frames. The session_send()
 

The nghttp2_session_send() function serializes the frame into wire -format and call nghttp2_callbacks.nghttp2_send_callback with -it. We set send_callback() function as +format and call nghttp2_session_callbacks.send_callback with +it. We set send_callback() function to nghttp2_session_callbacks.send_callback in initialize_nghttp2_session() function described earlier. It is defined as follows:

@@ -519,7 +520,7 @@ frame and other error conditions as well. Using these information, nghttp2 session object will tell whether the connection should be dropped or not. More specifically, both nghttp2_session_want_read() and nghttp2_session_want_write() return 0, we have no business in -the connection. But since we have using bufferevent and its deferred +the connection. But since we are using bufferevent and its deferred callback option, the bufferevent output buffer may contain the pending data when the writecb() is called. To handle this situation, we also check whether the output buffer is empty or not. If these @@ -527,7 +528,7 @@ conditions are met, we drop connection.

Otherwise, we call session_send() to process pending output data. Remember that in send_callback(), we may not write all data to bufferevent to avoid excessive buffering. We continue process -pending data if output buffer becomes empty.

+pending data when output buffer becomes empty.

We have already described about nghttp2 callback send_callback(). Let’s describe remaining nghttp2 callbacks we setup in initialize_nghttp2_setup() function.

@@ -566,16 +567,16 @@ received from the remote peer:

}
-

We only interested HEADERS frame in this function. Since HEADERS frame -has several roles in HTTP/2.0 protocol, we check that it is a request -HEADERS, which opens new stream. If frame is request HEADERS, then we -create http2_stream_data object to store stream related data. We -associate created http2_stream_data object to the stream 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 server static file relative to the -current working directory the program was invoked. We search :path -header field in request headers and keep the requested path in +

We only interested in HEADERS frame in this function. Since HEADERS +frame has several roles in HTTP/2.0 protocol, we check that it is a +request HEADERS, which opens new stream. If frame is request HEADERS, +then we create http2_stream_data object to store stream related +data. We associate created http2_stream_data object to the stream +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 @@ -701,7 +702,7 @@ is about to close:

We destroy http2_stream_data object in this function since the -stream is about to close and we no longer to use that object.

+stream is about to close and we no longer use that object.

libevent-server.c

/*