nghttp2 - HTTP/2.0 C Library¶
+nghttp2 - HTTP/2 C Library¶
This is an experimental implementation of Hypertext Transfer Protocol -version 2.0.
+version 2.The project is hosted at github.com/tatsuhiro-t/nghttp2.
Contents:
-
-
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -165,11 +165,11 @@ version 2.0.
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -213,7 +213,7 @@ version 2.0. diff --git a/nghttp2.h.html b/nghttp2.h.html index 01aca3f5..92d5c503 100644 --- a/nghttp2.h.html +++ b/nghttp2.h.html @@ -81,7 +81,7 @@
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -93,11 +93,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -149,7 +149,7 @@
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -92,11 +92,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -148,7 +148,7 @@
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -93,11 +93,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -137,7 +137,7 @@
- nghttp2 - HTTP/2 C Library
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -99,11 +99,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server diff --git a/searchindex.js b/searchindex.js index a5f6bc81..fb7ac543 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({envversion:42,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],op_al:4,"const":[2,6,5,3],nghttp2_submit_:[2,5],"0x20":[3,6],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],behavior:[3,6],initialize_app_context:2,here:[2,6,4,5,3],met:[2,6,5,3],"4xx":4,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,total:[3,6,4],unit:4,describ:[2,6,5,3],would:[3,6],call:[2,6,4,5,3],asset:4,recommend:4,nghttp2_on_invalid_frame_recv_callback:[3,6],nghttp2_version:[3,6,1],until:[3,6],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,4],indic:[2,6,5,3],want:[2,6,5,3],select_padding_callback:[3,6],unsign:[2,6,5,3],end:[2,6,5,3],datalen:[2,5],how:[3,6,5],nghttp2_err_fat:[3,6],sever:[2,6,4,5,3],env:4,negoti:4,nghttp2_frame_typ:[3,6],updat:[3,6],nghttp2_msg_more:6,after:[2,6,4,5,3],badli:[3,6],demonstr:5,request_path:2,third:[2,6,5,3],opaqu:[3,6],bootstrap:4,exclud:[3,6],receiv:[2,6,4,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],fragment:4,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,4,3],mean:[3,6,4,5],slen:2,protocol_error:[3,6],nghttp2_select_padding_callback:[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],top:4,nghttp2_max_header_table_s:[3,6],too:[2,6,3],similarli:[3,6],draft:[0,6,4,3],listen:[2,4],tool:[0,6,3],lighttpd:4,travers:2,awaaagqeaad__w:4,target:[3,6,4],provid:[2,1,3,4,5,6],project:[0,4],matter:[3,6],nghttp2_continu:[3,6],close:[2,6,4,5,3],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],bytesio:4,simplic:5,don:[2,6,4,3],hex_to_uint:2,doc:4,flow:[3,6],doe:[2,6,4,5,3],nghttp2_gzip_inflate_new:[3,6],section:[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],involv:[3,6],explain:5,configur:[3,6,4],apach:4,nghttp2_err_invalid_stream_id:[3,6],busi:[2,5],nghttp2_flag_pad_high:[3,6],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,6,4,3],baz:4,push_promis:[2,6,3],"public":[0,6,3],nghttp2_strerror:[2,6,5,3],nghttp2_gzip_inflate_del:[3,6],bufferevent_ssl_accept:2,serve_forev:4,nul:[3,6],result:[2,5],respons:[2,6,4,5,3],fail:[3,6,4],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,4],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],delete_http2_stream_data:[2,5],liabil:[2,6,5,1],evbuffer_get_length:[2,5],chrome:4,max_deflate_s:4,been:[2,6,5,3],github:[0,4],much:[2,6,3],interest:[2,4,5],basic:4,futur:[3,6],tini:5,life:2,regul:[2,5],argument:[2,6,4,5,3],ewouldblock:[2,5],load_cert_chain:4,ssl_op_no_compress:[2,5],servic:2,zlib:4,publicli:4,nghttp2_on_begin_headers_callback:[3,6,5],bev_event_timeout:[2,5],bufferevent_socket_connect_hostnam:5,nghttp2_inadequate_secur:[3,6],nghttp2_set:[3,6],promised_stream_id:[3,6],conf:4,pointer:[2,6,3],on_data:4,perform:[2,6,4,3],make:[2,6,4,3],transpar:[3,6],headlen:[3,6],split:[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,4,3],nghttp2_session_get_effective_local_window_s:[3,6],client:[0,6,3],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:[3,6,5],underli:[2,5],www:[3,6],right:[2,6,5,1],deal:[2,6,5,1,3],intern:[3,6],successfulli:[2,6,5,3],transmiss:[2,6,5,3],requesthandlerclass:4,ni_numerichost:2,bottom:[3,6],nghttp2_data_source_read_callback:[3,6],subclass:4,buffer:[2,6,4,5,3],condit:[2,6,5,1,3],foo:4,localhost:4,core:4,particular:[2,6,5,1,3],sensibl:[3,6],repositori:[2,5],peer:[2,6,5,3],post:[3,6,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],git:[0,6,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],form:[3,6,4],offer:4,bev_event_connect:[2,5],heap:4,"true":4,hddeflat:4,ssl_ctx_free:[2,5],maximum:[3,6,4],tell:[2,6,5,3],deafult:4,autoconf:4,emit:[2,6,5,3],nghttp2_initial_window_s:[3,6],featur:4,httpbi:[0,6,4,3],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],nghttp2_check_header_valu:[3,6],send_client_connection_head:5,unlimit:[3,6],intend:2,af_unspec:[2,5],nghttp2_max_window_s:[3,6],technot:[3,6],consid:4,evconnlistener_new_bind:2,longer:[2,4],nghttp2_check_header_nam:[3,6],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,upper:[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],onli:[2,6,4,5,3],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],handler:4,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,critic:[3,6],abort:[3,6],nghttp2_header:[2,6,5,3],occur:[3,6],alwai:[2,6,3],multipl:[2,6,4,5,3],charset:4,ping:[3,6],write:[2,4,5],opt_set_mask:[3,6],sslcontext:4,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],talk:[2,4],nghttp2_err_stream_shut_wr:[3,6],size_t:[2,6,5,3],nghttp2_err_unsupported_vers:[3,6],still:[2,6,4,3],nghttp2_settings_entri:[2,6,5,3],dynam:4,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,"5xx":4,nghttp2_submit_head:[3,6],nghttp2_on_header_callback:[2,6,5,3],"0x000400":1,name:[2,6,4,5,3],version_num:[3,6],config:4,no_error:4,drop:[2,6,5,3],millisec:4,replac:[3,6],individu:[3,6],continu:[2,6,5,3],event_base_loop:[2,5],turoti:5,happen:[2,4,5],ai_addrlen:2,libjemalloc:4,space:[3,6,4],output_length:4,earlier:[2,5],event_base_new:[2,5],argv:[2,5],org:[0,6,4,3],"byte":[2,6,4,5,3],argc:[2,5],care:[3,6],nghttp2_opt_no_auto_connection_window_upd:[3,6],nghttp2ver:[0,6,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_is_fat:[3,6],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,4],necessarili:[3,6],sigpip:[2,5],internal_error:[3,6],conveni:[3,6],knowledg:4,copi:[2,6,5,1,3],specifi:[2,6,4,5,3],on_head: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],browser:4,fork:4,sai:[3,6],pri:[3,6],ani:[2,1,3,4,5,6],deliv:[3,6],sat:4,bitwis:[3,6],event_bas:[2,5],nghttp2_flag_prior:[3,6],destroi:[2,5],payloadlen:[3,6],note:[2,6,4,5,3],take:[2,6,4,5,3],properti:[2,5],noth:[3,6,4],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:[2,6,4,5,3],http2_select:[3,6],later:[2,6,5,3],gracefulli:5,show:[4,5],unprocess:[2,5],concurr:[2,6,4,3],permiss:[2,6,5,1],threshold:2,pad_high:[3,6],end_seg:[3,6,4],written:[2,6,4,5,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],requir:[0,6,3],nghttp2_set_stream_user_data:2,nghttp2_frame_size_error:[3,6],op_no_sslv2:4,detect:[3,6,4],weighttp:4,"import":4,fcntl:2,pipefd:2,evdns_bas:5,submit_request:5,region:[3,6],contract:[2,6,5,1],tutori:0,mani:[3,6],nghttp2_data_provid:[2,6,3],inspir:4,nghttp2_err_too_many_inflight_set:[3,6],cancel:[3,6],typic:4,damag:[2,6,5,1],http2server:4,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],"case":[2,6,4,5,3],hdr:[2,4,5],invok:[2,6,4,5,3],invoc:[2,6,3],on_data_chunk_recv_callback:[3,6,5],stdout:[4,5],ascii:[3,6],develop:0,author:[2,6,4,5,1],bev_opt_defer_callback:[2,5],alphabet:[3,6],same:[2,6,4,5,3],ssl_library_init:[2,5],binari:5,pac:4,pad:[3,6,4],document:[0,6,1],finish:[2,4,5],decompress:[3,6,4],handshake_leftlen:2,extern:6,postpon:[3,6],ai_next:2,without:[2,1,3,4,5,6],nghttp2_push_promis:[3,6],on_request_don:4,event2:[2,5],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],execut:4,multiplex:2,hint:2,except:[3,6],identif:[3,6],nghttp2_select_next_protocol:[3,6,5],real:5,unistd:[2,5],read:[2,6,4,5,3],nghttp2_version_ag:[3,6],rfc2616:[3,6],test:0,traffic:4,next_proto_cb:2,integ:[3,6],server:[0,6,3],either:[2,6,3],output:[2,6,4,5,3],manag:[2,6,3],stream_clos:[3,6],protocol_sslv23:4,ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],nonzero:[2,6,3],easili:5,"2xx":4,exit:[2,5],data_ptr:[3,6],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],max_siz:4,no_auto_stream_window_upd:[3,6],least_vers:[3,6],error_repli:2,your: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],ipv4:4,lot:[3,6],ipv6:4,strictli:[3,6],next_proto_list:2,nghttp2_proto_version_id_len:[2,6,3],tupl:4,nghttp2_err_invalid_st:[3,6],satur:4,nghttp2_flag_end_seg:[3,6],possibl:[2,6,5,3],"default":[2,6,4,3],applayerprotoneg:[3,6],hpack:0,expect:4,creat:[2,6,4,5,3],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,kbyte:4,field:[2,6,4,5,3],valid:[3,6,4],nghttp2_prioriti:[3,6],print_head:5,you:[2,6,4,5,3],intention:[3,6],sequenc:[2,6,4,5,3],promised_stream_user_data:[3,6],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],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,bufferevent_writ:[2,5],uf_queri:5,fals:4,pad_low:[3,6],settings_header_table_s:[3,6],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,4],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:3,method:[2,6,4,5,3],libjansson:4,padlen:[3,6,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],on_clos:4,prior:4,amount:[2,5],action:[2,6,5,1,3],via:[2,6,4,5,3],primit:5,ask:[3,6],famili:[2,5],establish:[2,5],select:[3,6,5],regist:2,libev:[0,4],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],none:4,endpoint:[3,6,4],dev:[4,1],remain:[2,6,5,3],def:4,share:[3,6,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],css:4,resourc:3,referenc:4,variant:[3,6],spdylai:4,associ:[2,1,3,4,5,6],"short":[2,5],caus:[3,6],callback:[2,6,4,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],fulli:2,trailer:[3,6],nghttp2_on_frame_send_callback:[3,6],monoton:5,realli:5,connect:[2,1,3,4,5,6],field_set:5,event:[2,6,4,5,1],app_ctx:2,ftw:4,publish:[2,6,5,1],payload:[3,6],etag:4,print:[4,5],on_frame_not_send_callback:[3,6],proxi:0,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,prevent:[3,6],number:[2,6,1,3],"0x8":[3,6],done:[2,4,5],construct:[3,6,4],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],memcmp:2,nghttp2_client_connection_head:[2,6,5,3],pars:5,kind:[2,6,5,1,3],doubli:2,remot:[2,6,5,3],remov:[2,6,3],bridg:4,consumpt:[2,5],nghttp2_error:[3,6],window_size_incr:[3,6],lib_error_cod:[3,6],arrlen:[2,5],packag:4,"null":[2,6,5,3],syn_stream:[3,6],sell:[2,6,5,1],outbound:[3,6],built:4,equival:[3,6],afram:[3,6],also:[2,6,5,3],build:0,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],charg:[2,6,5,1],addr:2,"01881f3468e5891afcbf83868a3d856659c62e3f":4,compar:[3,6,5],frame_size_error:[3,6],microsec:4,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],nativ:4,"3xx":4,liabl:[2,6,5,1],before_frame_send_callback:[3,6,5],retreiv:5,crt:[2,4],h2load:4,certif:[2,4,5],set:[2,6,4,5,3],seq:4,sep:4,ousid:4,remove_stream:2,nghttp2_submit_goawai:[3,6],sec:4,arg:[2,6,5,3],reserv:[3,6],jemalloc:4,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],disallow:4,succeed:4,percent_decod:2,closur:[3,6,5],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,4],simpli:[2,5],send_server_connection_head:2,header:[0,6,3],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,4],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],abov:[2,1,3,4,5,6],error:[2,6,4,5,3],loop:[2,4,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],chang:[2,6,3],nghttp2_h:6,noninfring:[2,6,5,1],entri:[3,6,4],person:[2,6,5,1],uint32_t:[3,6],self:4,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,on_begin_headers_callback:[2,6,5,3],format:[2,6,4,5,3],http_parser:5,bit:[3,6,1],strstr:2,foobarbuzz:4,signal:[2,6,5,3],lib_error:[3,6],some:[2,6,5,3],back:[3,6],sampl:4,sizeof:[2,5],libssl:4,lev_opt_reus:2,per:[3,6,4],larg:[3,6],make_nv2:5,machin:4,run:[2,6,4,5,3],step:[3,6],from:[0,6,1,3],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,"long":[3,6,4],nghttp2:3,forward:4,session_ptr:[3,6],repeatedli:[3,6],link:[2,4],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],line:4,mitig:4,concaten:[3,6],utf:4,caller:[2,6,3],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],nghttp2_flag_pad_low:[3,6],algorithm:[3,6],nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],far:[2,5],asyncio:4,getaddrinfo:2,code:[2,6,4,5,3],queri:5,nghttp2_frame_hd:[3,6],cython:4,privat:[2,4],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,session:[2,6,4,5,3],pleas:[2,6,4,5,3],impli:[2,6,5,1],smaller:4,snprintf:5,"0x2":[3,6],"0x1":[3,6],"0x0":[3,6],"0x4":[3,6],download:[0,4],client_address:4,index:4,o_rdonli:2,access:[3,6,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],bodi:[2,6,4,5,3],nghttp2_rst_stream:[3,6],ubuntu:4,becom:[2,6,1,3],sinc:[2,6,4,5,3],larger:[3,6],ctx:4,settings_payloadlen:[3,6],autoreconf:4,jansson:4,greac:[2,5],implement:[0,2,3,4,5,6],output_wouldblock_threshold:2,appli:[3,6],bufferev:[2,5],feb:4,commun:[2,4,5],binascii:4,upgrad:[3,6,4],next:[2,6,5,3],findproxyforurl:4,usr:4,nghttp2_nv:[2,6,5,3],jxck:4,goawai:[2,6,4,5,3],benchmark:0,deflat:[3,6,4],account:[3,6,4,5],retriev:[2,6,5,3],tunnel:4,nghttp2_settings_id:[3,6],about:[2,6,5,3],aliv:[2,6,3],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],max_payloadlen:[3,6],eventcb:[2,5],nghttp2_compression_error:[3,6],alloc:[2,6,3],bind:0,nvlen:[2,6,5,3],correspond:[2,4],element:[2,6,3],issu:[0,6,4,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],python:0,nghttp2_goawai:[3,6],handi:5,ssl_op_no_sslv2:[2,5],nghttp2_session_mem_send:[3,6],anyth:5,uf_port:5,mode:4,ssl_filetype_pem:2,chunk:[3,6,4,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,4],n1000:4,categori:[3,6,5],suitabl:[3,6],rel:2,field_data:5,recv_callback:[3,6],insid:4,releas: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],strict:4,unknown:[2,6,3],system:[2,5],messag:[3,6,5],attach:[2,5],attack:4,termin:[2,6,4,5,3],low:[3,6],request_head: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],bufferevent_get_input:[2,5],corrupt:5,have:[2,6,4,5,3],tabl:[3,6,4],need:[3,6,4,5],ai_socktyp:2,"0x04":4,"0x05":4,"0x00":[3,6,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,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],"0x0d":[3,6],"0x0a":[3,6],ssl_load_error_str:[2,5],text:4,bufferevent_get_output:[2,5],redirect:5,locat:5,should:[2,6,4,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:[2,6,3],increas:[3,6,5],portion:[2,6,5,1,3],nghttp2_submit_respons:[2,6,3],enabl: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],ssl_ctx:[2,6,5,3],temporarili:[3,6],statu:[0,6,3],wire:[2,4,5],correctli:[3,6],mainli:[3,6],state:[2,6,4,3],https_uri:5,progress:4,nghttp2_initial_connection_window_s:[3,6],kei:[2,6,4,3],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,4],uint16_t:[3,6,5],arriv:4,m10:4,commenc:5,respect:[3,6,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],immedi:[3,6],nghttp2_hcat_head:[3,6],both:[2,6,4,5,3],sock_stream:2,evconnlisten:2,on_header_callback:[2,6,5,3],multi:4,plain:4,defin:[2,6,5,1,3],eintr:2,inadequate_secur:[3,6],helper:[3,6],on_request_recv:2,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],handl:[2,6,4,5,3],ifndef:[6,1],http:3,hostnam:4,uf_host:5,initi:[2,6,5,3],dealloc:4,peer_max_concurrent_stream:[3,6],off:5,well:[2,5],app_context:2,"0x10":[3,6],exampl:[2,6,4,5,3],command:4,choos:[3,6],error_cod:[2,6,4,5,3],nghttp2_data_sourc:[2,6,3],usual:[3,6],paus:[3,6],less:[3,6],send_callback:[2,6,5,3],half:[3,6],obtain:[2,6,5,1],tcp:[2,5],heavili:4,web:[2,4],cert_fil:2,point:[2,6,5,3],priorit:[3,6],addrlen:2,add:[2,6,3],c10:4,match:[2,5],gmt:4,nvu: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,6,3],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:3,lead:[3,6],avoid:[2,6,4,5,3],octet:[2,5],overlap:[3,6],isxdigit:2,outgo:[2,6,3],nghttp2_session_upgrad:[3,6],reciev:5,usag:[2,6,4,5,3],host:[0,4,5,2],nghttp2_nv_compare_nam:[3,6],err_get_error:[2,5],actual:[2,6,5,3],socket:[2,5],nghttp2_gzip:[3,6],ssl_tlsext_err_ok:[2,6,5,3],disabl:[3,6,4],own:[3,6],nghttp2_err_invalid_fram:[3,6],automat:[3,6],warranti:[2,6,5,1],automak:4,merg:[2,6,5,1],val:[2,5],ai_famili:2,transfer:[0,6,4,3],bump:[3,6],trigger:[3,6],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,6,5,1,3],problem:[3,6],sockaddr:2,nghttp2_on_frame_not_send_callback:[3,6],strndup:5,"int":[2,6,5,3],baserequesthandl:4,nghttp2_flag_end_stream:[2,6,3],allow:[3,6,4],percent:2,detail:[3,6],other:[2,6,5,1,3],nghttp2_err_invalid_argu:[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,rule:[3,6],nghttp2_no_error:[3,6,5]},objtypes:{"0":"c:member","1":"c:macro","2":"c:type","3":"c:function"},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"],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"],objects:{"":{NGHTTP2_ERR_INVALID_STATE:[3,1,1,"c.NGHTTP2_ERR_INVALID_STATE"],NGHTTP2_ERR_HEADER_COMP:[3,1,1,"c.NGHTTP2_ERR_HEADER_COMP"],NGHTTP2_SETTINGS_HEADER_TABLE_SIZE:[3,1,1,"c.NGHTTP2_SETTINGS_HEADER_TABLE_SIZE"],nghttp2_settings_entry:[3,2,1,"c.nghttp2_settings_entry"],NGHTTP2_INTERNAL_ERROR:[3,1,1,"c.NGHTTP2_INTERNAL_ERROR"],NGHTTP2_PRI_LOWEST:[3,1,1,"c.NGHTTP2_PRI_LOWEST"],nghttp2_on_frame_recv_callback:[3,2,1,"c.nghttp2_on_frame_recv_callback"],NGHTTP2_CLIENT_CONNECTION_HEADER_LEN:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_HEADER_LEN"],nghttp2_goaway:[3,2,1,"c.nghttp2_goaway"],nghttp2_ping:[3,2,1,"c.nghttp2_ping"],NGHTTP2_ERR_INVALID_FRAME:[3,1,1,"c.NGHTTP2_ERR_INVALID_FRAME"],nghttp2_frame_type:[3,2,1,"c.nghttp2_frame_type"],NGHTTP2_ERR_INVALID_STREAM_ID:[3,1,1,"c.NGHTTP2_ERR_INVALID_STREAM_ID"],nghttp2_select_next_protocol:[3,3,1,"c.nghttp2_select_next_protocol"],NGHTTP2_ERR_INVALID_HEADER_BLOCK:[3,1,1,"c.NGHTTP2_ERR_INVALID_HEADER_BLOCK"],nghttp2_session_callbacks:[3,2,1,"c.nghttp2_session_callbacks"],NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS:[3,1,1,"c.NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS"],NGHTTP2_ERR_PROTO:[3,1,1,"c.NGHTTP2_ERR_PROTO"],NGHTTP2_MAX_HEADER_TABLE_SIZE:[3,1,1,"c.NGHTTP2_MAX_HEADER_TABLE_SIZE"],nghttp2_submit_window_update:[3,3,1,"c.nghttp2_submit_window_update"],NGHTTP2_ERR_UNSUPPORTED_VERSION:[3,1,1,"c.NGHTTP2_ERR_UNSUPPORTED_VERSION"],NGHTTP2_SETTINGS_ENABLE_PUSH:[3,1,1,"c.NGHTTP2_SETTINGS_ENABLE_PUSH"],nghttp2_window_update:[3,2,1,"c.nghttp2_window_update"],nghttp2_session_client_new2:[3,3,1,"c.nghttp2_session_client_new2"],NGHTTP2_DATA:[3,1,1,"c.NGHTTP2_DATA"],nghttp2_frame_hd:[3,2,1,"c.nghttp2_frame_hd"],NGHTTP2_ERR_INVALID_STREAM_STATE:[3,1,1,"c.NGHTTP2_ERR_INVALID_STREAM_STATE"],nghttp2_on_header_callback:[3,2,1,"c.nghttp2_on_header_callback"],NGHTTP2_FLAG_ACK:[3,1,1,"c.NGHTTP2_FLAG_ACK"],NGHTTP2_STREAM_CLOSED:[3,1,1,"c.NGHTTP2_STREAM_CLOSED"],NGHTTP2_SETTINGS_MAX:[3,1,1,"c.NGHTTP2_SETTINGS_MAX"],NGHTTP2_MAX_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_MAX_WINDOW_SIZE"],nghttp2_headers_category:[3,2,1,"c.nghttp2_headers_category"],nghttp2_session_mem_send:[3,3,1,"c.nghttp2_session_mem_send"],nghttp2_error_code:[3,2,1,"c.nghttp2_error_code"],NGHTTP2_REFUSED_STREAM:[3,1,1,"c.NGHTTP2_REFUSED_STREAM"],nghttp2_on_data_chunk_recv_callback:[3,2,1,"c.nghttp2_on_data_chunk_recv_callback"],NGHTTP2_ERR_START_STREAM_NOT_ALLOWED:[3,1,1,"c.NGHTTP2_ERR_START_STREAM_NOT_ALLOWED"],NGHTTP2_ERR_FLOW_CONTROL:[3,1,1,"c.NGHTTP2_ERR_FLOW_CONTROL"],nghttp2_strerror:[3,3,1,"c.nghttp2_strerror"],nghttp2_gzip_inflate_del:[3,3,1,"c.nghttp2_gzip_inflate_del"],NGHTTP2_ERR_FATAL:[3,1,1,"c.NGHTTP2_ERR_FATAL"],nghttp2_submit_goaway:[3,3,1,"c.nghttp2_submit_goaway"],nghttp2_error:[3,2,1,"c.nghttp2_error"],NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE"],NGHTTP2_ERR_NOMEM:[3,1,1,"c.NGHTTP2_ERR_NOMEM"],NGHTTP2_ERR_PAUSE:[3,1,1,"c.NGHTTP2_ERR_PAUSE"],NGHTTP2_ENHANCE_YOUR_CALM:[3,1,1,"c.NGHTTP2_ENHANCE_YOUR_CALM"],NGHTTP2_NO_ERROR:[3,1,1,"c.NGHTTP2_NO_ERROR"],nghttp2_select_padding_callback:[3,2,1,"c.nghttp2_select_padding_callback"],NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS:[3,1,1,"c.NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS"],nghttp2_session_server_new2:[3,3,1,"c.nghttp2_session_server_new2"],NGHTTP2_ERR_DEFERRED:[3,1,1,"c.NGHTTP2_ERR_DEFERRED"],nghttp2_push_promise:[3,2,1,"c.nghttp2_push_promise"],NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE:[3,1,1,"c.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE"],nghttp2_session_get_outbound_queue_size:[3,3,1,"c.nghttp2_session_get_outbound_queue_size"],NGHTTP2_PROTO_VERSION_ID_LEN:[3,1,1,"c.NGHTTP2_PROTO_VERSION_ID_LEN"],NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS:[3,1,1,"c.NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS"],nghttp2_data_source_read_callback:[3,2,1,"c.nghttp2_data_source_read_callback"],NGHTTP2_SETTINGS_TIMEOUT:[3,1,1,"c.NGHTTP2_SETTINGS_TIMEOUT"],NGHTTP2_ERR_WOULDBLOCK:[3,1,1,"c.NGHTTP2_ERR_WOULDBLOCK"],nghttp2_submit_push_promise:[3,3,1,"c.nghttp2_submit_push_promise"],nghttp2_session_resume_data:[3,3,1,"c.nghttp2_session_resume_data"],NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE"],NGHTTP2_PRI_DEFAULT:[3,1,1,"c.NGHTTP2_PRI_DEFAULT"],nghttp2_session_server_new:[3,3,1,"c.nghttp2_session_server_new"],NGHTTP2_CONTINUATION:[3,1,1,"c.NGHTTP2_CONTINUATION"],nghttp2_rst_stream:[3,2,1,"c.nghttp2_rst_stream"],NGHTTP2_ERR_INVALID_ARGUMENT:[3,1,1,"c.NGHTTP2_ERR_INVALID_ARGUMENT"],NGHTTP2_ERR_FRAME_SIZE_ERROR:[3,1,1,"c.NGHTTP2_ERR_FRAME_SIZE_ERROR"],nghttp2_session_del:[3,3,1,"c.nghttp2_session_del"],nghttp2_session_mem_recv:[3,3,1,"c.nghttp2_session_mem_recv"],nghttp2_flag:[3,2,1,"c.nghttp2_flag"],NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE:[3,1,1,"c.NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE"],NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS:[3,1,1,"c.NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS"],NGHTTP2_HCAT_REQUEST:[3,1,1,"c.NGHTTP2_HCAT_REQUEST"],NGHTTP2_FLAG_END_HEADERS:[3,1,1,"c.NGHTTP2_FLAG_END_HEADERS"],nghttp2_gzip:[3,2,1,"c.nghttp2_gzip"],NGHTTP2_FLAG_END_STREAM:[3,1,1,"c.NGHTTP2_FLAG_END_STREAM"],NGHTTP2_ERR_EOF:[3,1,1,"c.NGHTTP2_ERR_EOF"],NGHTTP2_HCAT_HEADERS:[3,1,1,"c.NGHTTP2_HCAT_HEADERS"],NGHTTP2_VERSION_NUM:[3,1,1,"c.NGHTTP2_VERSION_NUM"],NGHTTP2_SETTINGS:[3,1,1,"c.NGHTTP2_SETTINGS"],nghttp2_frame:[3,2,1,"c.nghttp2_frame"],NGHTTP2_FLAG_END_SEGMENT:[3,1,1,"c.NGHTTP2_FLAG_END_SEGMENT"],NGHTTP2_ERR_DEFERRED_DATA_EXIST:[3,1,1,"c.NGHTTP2_ERR_DEFERRED_DATA_EXIST"],NGHTTP2_CANCEL:[3,1,1,"c.NGHTTP2_CANCEL"],nghttp2_send_callback:[3,2,1,"c.nghttp2_send_callback"],nghttp2_on_frame_send_callback:[3,2,1,"c.nghttp2_on_frame_send_callback"],NGHTTP2_HEADERS:[3,1,1,"c.NGHTTP2_HEADERS"],NGHTTP2_VERSION:[3,1,1,"c.NGHTTP2_VERSION"],nghttp2_opt_set:[3,2,1,"c.nghttp2_opt_set"],NGHTTP2_FLAG_PAD_HIGH:[3,1,1,"c.NGHTTP2_FLAG_PAD_HIGH"],nghttp2_session:[3,2,1,"c.nghttp2_session"],NGHTTP2_COMPRESSION_ERROR:[3,1,1,"c.NGHTTP2_COMPRESSION_ERROR"],NGHTTP2_HCAT_PUSH_RESPONSE:[3,1,1,"c.NGHTTP2_HCAT_PUSH_RESPONSE"],nghttp2_submit_rst_stream:[3,3,1,"c.nghttp2_submit_rst_stream"],nghttp2_submit_headers:[3,3,1,"c.nghttp2_submit_headers"],nghttp2_recv_callback:[3,2,1,"c.nghttp2_recv_callback"],nghttp2_session_get_stream_user_data:[3,3,1,"c.nghttp2_session_get_stream_user_data"],NGHTTP2_FLAG_PRIORITY:[3,1,1,"c.NGHTTP2_FLAG_PRIORITY"],nghttp2_nv:[3,2,1,"c.nghttp2_nv"],nghttp2_on_invalid_frame_recv_callback:[3,2,1,"c.nghttp2_on_invalid_frame_recv_callback"],nghttp2_version:[3,3,1,"c.nghttp2_version"],nghttp2_on_unknown_frame_recv_callback:[3,2,1,"c.nghttp2_on_unknown_frame_recv_callback"],NGHTTP2_ERR_STREAM_CLOSED:[3,1,1,"c.NGHTTP2_ERR_STREAM_CLOSED"],nghttp2_opt:[3,2,1,"c.nghttp2_opt"],NGHTTP2_ERR_CALLBACK_FAILURE:[3,1,1,"c.NGHTTP2_ERR_CALLBACK_FAILURE"],NGHTTP2_ERR_GOAWAY_ALREADY_SENT:[3,1,1,"c.NGHTTP2_ERR_GOAWAY_ALREADY_SENT"],NGHTTP2_FLOW_CONTROL_ERROR:[3,1,1,"c.NGHTTP2_FLOW_CONTROL_ERROR"],nghttp2_session_set_stream_user_data:[3,3,1,"c.nghttp2_session_set_stream_user_data"],nghttp2_check_header_value:[3,3,1,"c.nghttp2_check_header_value"],NGHTTP2_ERR_STREAM_CLOSING:[3,1,1,"c.NGHTTP2_ERR_STREAM_CLOSING"],NGHTTP2_INADEQUATE_SECURITY:[3,1,1,"c.NGHTTP2_INADEQUATE_SECURITY"],nghttp2_session_client_new:[3,3,1,"c.nghttp2_session_client_new"],nghttp2_check_header_name:[3,3,1,"c.nghttp2_check_header_name"],nghttp2_info:[3,2,1,"c.nghttp2_info"],NGHTTP2_PROTO_VERSION_ID:[3,1,1,"c.NGHTTP2_PROTO_VERSION_ID"],nghttp2_settings_id:[3,2,1,"c.nghttp2_settings_id"],nghttp2_session_send:[3,3,1,"c.nghttp2_session_send"],NGHTTP2_PROTOCOL_ERROR:[3,1,1,"c.NGHTTP2_PROTOCOL_ERROR"],nghttp2_gzip_inflate:[3,3,1,"c.nghttp2_gzip_inflate"],nghttp2_session_upgrade:[3,3,1,"c.nghttp2_session_upgrade"],nghttp2_on_begin_headers_callback:[3,2,1,"c.nghttp2_on_begin_headers_callback"],NGHTTP2_ERR_INSUFF_BUFSIZE:[3,1,1,"c.NGHTTP2_ERR_INSUFF_BUFSIZE"],nghttp2_settings:[3,2,1,"c.nghttp2_settings"],nghttp2_on_frame_not_send_callback:[3,2,1,"c.nghttp2_on_frame_not_send_callback"],nghttp2_session_get_effective_recv_data_length:[3,3,1,"c.nghttp2_session_get_effective_recv_data_length"],nghttp2_submit_data:[3,3,1,"c.nghttp2_submit_data"],nghttp2_submit_response:[3,3,1,"c.nghttp2_submit_response"],NGHTTP2_CLIENT_CONNECTION_HEADER:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_HEADER"],NGHTTP2_FLAG_NONE:[3,1,1,"c.NGHTTP2_FLAG_NONE"],nghttp2_session_terminate_session:[3,3,1,"c.nghttp2_session_terminate_session"],nghttp2_submit_settings:[3,3,1,"c.nghttp2_submit_settings"],NGHTTP2_HCAT_RESPONSE:[3,1,1,"c.NGHTTP2_HCAT_RESPONSE"],NGHTTP2_PING:[3,1,1,"c.NGHTTP2_PING"],NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE:[3,1,1,"c.NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE"],nghttp2_priority:[3,2,1,"c.nghttp2_priority"],nghttp2_session_want_read:[3,3,1,"c.nghttp2_session_want_read"],NGHTTP2_VERSION_AGE:[3,1,1,"c.NGHTTP2_VERSION_AGE"],NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,1,"c.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE"],NGHTTP2_CONNECT_ERROR:[3,1,1,"c.NGHTTP2_CONNECT_ERROR"],NGHTTP2_RST_STREAM:[3,1,1,"c.NGHTTP2_RST_STREAM"],nghttp2_on_stream_close_callback:[3,2,1,"c.nghttp2_on_stream_close_callback"],NGHTTP2_PUSH_PROMISE:[3,1,1,"c.NGHTTP2_PUSH_PROMISE"],nghttp2_data_provider:[3,2,1,"c.nghttp2_data_provider"],NGHTTP2_ERR_PUSH_DISABLED:[3,1,1,"c.NGHTTP2_ERR_PUSH_DISABLED"],nghttp2_session_recv:[3,3,1,"c.nghttp2_session_recv"],nghttp2_session_get_effective_local_window_size:[3,3,1,"c.nghttp2_session_get_effective_local_window_size"],NGHTTP2_INITIAL_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_INITIAL_WINDOW_SIZE"],NGHTTP2_WINDOW_UPDATE:[3,1,1,"c.NGHTTP2_WINDOW_UPDATE"],nghttp2_session_want_write:[3,3,1,"c.nghttp2_session_want_write"],nghttp2_submit_priority:[3,3,1,"c.nghttp2_submit_priority"],nghttp2_session_get_stream_effective_local_window_size:[3,3,1,"c.nghttp2_session_get_stream_effective_local_window_size"],nghttp2_headers:[3,2,1,"c.nghttp2_headers"],nghttp2_before_frame_send_callback:[3,2,1,"c.nghttp2_before_frame_send_callback"],NGHTTP2_GOAWAY:[3,1,1,"c.NGHTTP2_GOAWAY"],NGHTTP2_ERR_GZIP:[3,1,1,"c.NGHTTP2_ERR_GZIP"],nghttp2_is_fatal:[3,3,1,"c.nghttp2_is_fatal"],NGHTTP2_FLAG_PAD_LOW:[3,1,1,"c.NGHTTP2_FLAG_PAD_LOW"],nghttp2_submit_ping:[3,3,1,"c.nghttp2_submit_ping"],NGHTTP2_FRAME_SIZE_ERROR:[3,1,1,"c.NGHTTP2_FRAME_SIZE_ERROR"],nghttp2_data_source:[3,2,1,"c.nghttp2_data_source"],NGHTTP2_ERR_STREAM_SHUT_WR:[3,1,1,"c.NGHTTP2_ERR_STREAM_SHUT_WR"],NGHTTP2_PRIORITY:[3,1,1,"c.NGHTTP2_PRIORITY"],nghttp2_submit_request:[3,3,1,"c.nghttp2_submit_request"],nghttp2_session_get_stream_effective_recv_data_length:[3,3,1,"c.nghttp2_session_get_stream_effective_recv_data_length"],nghttp2_pack_settings_payload:[3,3,1,"c.nghttp2_pack_settings_payload"],nghttp2_data:[3,2,1,"c.nghttp2_data"],nghttp2_gzip_inflate_new:[3,3,1,"c.nghttp2_gzip_inflate_new"],nghttp2_nv_compare_name:[3,3,1,"c.nghttp2_nv_compare_name"]},nghttp2_session_callbacks:{on_invalid_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_invalid_frame_recv_callback"],before_frame_send_callback:[3,0,1,"c.nghttp2_session_callbacks.before_frame_send_callback"],on_stream_close_callback:[3,0,1,"c.nghttp2_session_callbacks.on_stream_close_callback"],on_data_chunk_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_data_chunk_recv_callback"],on_begin_headers_callback:[3,0,1,"c.nghttp2_session_callbacks.on_begin_headers_callback"],send_callback:[3,0,1,"c.nghttp2_session_callbacks.send_callback"],on_unknown_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_unknown_frame_recv_callback"],on_header_callback:[3,0,1,"c.nghttp2_session_callbacks.on_header_callback"],on_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_recv_callback"],select_padding_callback:[3,0,1,"c.nghttp2_session_callbacks.select_padding_callback"],on_frame_not_send_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_not_send_callback"],on_frame_send_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_send_callback"],recv_callback:[3,0,1,"c.nghttp2_session_callbacks.recv_callback"]},nghttp2_frame:{push_promise:[3,0,1,"c.nghttp2_frame.push_promise"],settings:[3,0,1,"c.nghttp2_frame.settings"],ping:[3,0,1,"c.nghttp2_frame.ping"],rst_stream:[3,0,1,"c.nghttp2_frame.rst_stream"],priority:[3,0,1,"c.nghttp2_frame.priority"],headers:[3,0,1,"c.nghttp2_frame.headers"],goaway:[3,0,1,"c.nghttp2_frame.goaway"],window_update:[3,0,1,"c.nghttp2_frame.window_update"],data:[3,0,1,"c.nghttp2_frame.data"],hd:[3,0,1,"c.nghttp2_frame.hd"]},nghttp2_ping:{hd:[3,0,1,"c.nghttp2_ping.hd"]},nghttp2_data_provider:{source:[3,0,1,"c.nghttp2_data_provider.source"],read_callback:[3,0,1,"c.nghttp2_data_provider.read_callback"]},nghttp2_priority:{pri:[3,0,1,"c.nghttp2_priority.pri"],hd:[3,0,1,"c.nghttp2_priority.hd"]},nghttp2_settings_entry:{settings_id:[3,0,1,"c.nghttp2_settings_entry.settings_id"],value:[3,0,1,"c.nghttp2_settings_entry.value"]},nghttp2_window_update:{hd:[3,0,1,"c.nghttp2_window_update.hd"],window_size_increment:[3,0,1,"c.nghttp2_window_update.window_size_increment"]},nghttp2_frame_hd:{stream_id:[3,0,1,"c.nghttp2_frame_hd.stream_id"],length:[3,0,1,"c.nghttp2_frame_hd.length"],flags:[3,0,1,"c.nghttp2_frame_hd.flags"],type:[3,0,1,"c.nghttp2_frame_hd.type"]},nghttp2_data:{padlen:[3,0,1,"c.nghttp2_data.padlen"]},nghttp2_info:{age:[3,0,1,"c.nghttp2_info.age"],version_str:[3,0,1,"c.nghttp2_info.version_str"],version_num:[3,0,1,"c.nghttp2_info.version_num"],proto_str:[3,0,1,"c.nghttp2_info.proto_str"]},nghttp2_rst_stream:{error_code:[3,0,1,"c.nghttp2_rst_stream.error_code"],hd:[3,0,1,"c.nghttp2_rst_stream.hd"]},nghttp2_nv:{valuelen:[3,0,1,"c.nghttp2_nv.valuelen"],namelen:[3,0,1,"c.nghttp2_nv.namelen"],name:[3,0,1,"c.nghttp2_nv.name"],value:[3,0,1,"c.nghttp2_nv.value"]},nghttp2_headers:{pri:[3,0,1,"c.nghttp2_headers.pri"],nvlen:[3,0,1,"c.nghttp2_headers.nvlen"],cat:[3,0,1,"c.nghttp2_headers.cat"],padlen:[3,0,1,"c.nghttp2_headers.padlen"],nva:[3,0,1,"c.nghttp2_headers.nva"],hd:[3,0,1,"c.nghttp2_headers.hd"]},nghttp2_opt_set:{no_auto_stream_window_update:[3,0,1,"c.nghttp2_opt_set.no_auto_stream_window_update"],peer_max_concurrent_streams:[3,0,1,"c.nghttp2_opt_set.peer_max_concurrent_streams"],no_auto_connection_window_update:[3,0,1,"c.nghttp2_opt_set.no_auto_connection_window_update"]},nghttp2_goaway:{opaque_data:[3,0,1,"c.nghttp2_goaway.opaque_data"],error_code:[3,0,1,"c.nghttp2_goaway.error_code"],opaque_data_len:[3,0,1,"c.nghttp2_goaway.opaque_data_len"],hd:[3,0,1,"c.nghttp2_goaway.hd"],last_stream_id:[3,0,1,"c.nghttp2_goaway.last_stream_id"]},nghttp2_data_source:{fd:[3,0,1,"c.nghttp2_data_source.fd"],ptr:[3,0,1,"c.nghttp2_data_source.ptr"]},nghttp2_push_promise:{padlen:[3,0,1,"c.nghttp2_push_promise.padlen"],nvlen:[3,0,1,"c.nghttp2_push_promise.nvlen"],promised_stream_id:[3,0,1,"c.nghttp2_push_promise.promised_stream_id"],hd:[3,0,1,"c.nghttp2_push_promise.hd"],nva:[3,0,1,"c.nghttp2_push_promise.nva"]},nghttp2_settings:{niv:[3,0,1,"c.nghttp2_settings.niv"],hd:[3,0,1,"c.nghttp2_settings.hd"],iv:[3,0,1,"c.nghttp2_settings.iv"]}},titleterms:{version:0,header:4,api:3,http:[0,4,5,2],librari:[0,4],statu:4,git:4,develop:4,struct:3,union:3,libev:[2,5],client:[4,5],nghttp2:[0,6,4],program:4,build:4,test:4,document:4,type:3,"public":4,refer:3,"function":3,resourc:0,proxi:4,python:4,remark:3,tool:4,"enum":3,benchmark:4,typedef:3,compressor:4,releas:0,from:4,decompressor:4,nghttp2ver:1,nghttpd:4,macro:3,nghttp:4,requir:4,server:[2,4],inflatehd:4,tutori:[2,5],deflatehd:4,includ:3,hpack:4,bind:4,nghttpx:4}}) \ No newline at end of file +Search.setIndex({envversion:42,terms:{my_obj:[3,6],nghttp2_io_flag:6,nghttp2_cancel:[3,6],prefix:[2,6,3],nghttp2_session_get_stream_effective_local_window_s:[3,6],op_al:4,"const":[2,6,5,3],nghttp2_submit_:[2,5],"0x20":[3,6],under:[3,6,4],nghttp2_priority_typ:[3,6],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],"4xx":4,path:[2,4,5],settings_timeout:[3,6],interpret:[3,6],nextprotoneg:[3,6],incom:[2,6,4,3],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,total:[3,6,4],unit:4,describ:[2,6,5,3],would:[3,6],call:[2,6,4,5,3],asset:4,recommend:4,nghttp2_on_invalid_frame_recv_callback:[3,6],nghttp2_version:[3,6,1],until:[3,6],relat:[2,5],nghttp2_cleartext_proto_version_id_len:[3,6],warn:2,nghttp2_option_set_peer_max_concurrent_stream:[3,6],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,4],indic:[2,6,5,3],want:[2,6,5,3],select_padding_callback:[3,6],unsign:[2,6,5,3],end:[2,6,5,3],datalen:[2,5],how:[3,6,5],nghttp2_err_fat:[3,6],sever:[2,6,4,5,3],hop:[3,6],negoti:4,nghttp2_frame_typ:[3,6],updat:[3,6],nghttp2_msg_more:6,after:[2,6,4,5,3],settings_header_table_s:[3,6],badli:[3,6],demonstr:5,request_path:2,third:[2,6,5,3],opaqu:[3,6],bootstrap:4,exclud:[3,6],perform:[2,6,4,3],exclus:[3,6],first:[2,6,4,5,3],order:[2,6,4,3],oper:[3,6,4],frontend:4,over:[2,6,4,5,3],becaus:[2,6,5,3],eagain:[2,5],vari:4,fit:[2,6,5,1],nghttp2_session_get_stream_remote_window_s:[3,6],fwrite:5,deflate_s:4,hidden:[3,6],them:[2,6,5,3],thei:[2,6,4,5,3],fragment:4,safe:2,"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,4,3],mean:[3,6,4,5],slen:2,protocol_error:[3,6],nghttp2_select_padding_callback:[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],small:[3,6],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],top:4,nghttp2_max_header_table_s:[3,6],too:[2,6,3],similarli:[3,6],draft:[0,6,4,3],listen:[2,4],tool:[0,6,3],lighttpd:4,travers:2,awaaagqeaad__w:4,target:[3,6,4],provid:[2,1,3,4,5,6],project:[0,4],matter:[3,6],nghttp2_continu:[3,6],increment:[3,6],nghttp2_option_set_no_auto_stream_window_upd:[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],bytesio:4,simplic:5,don:[2,6,4,3],hex_to_uint:2,doc:4,flow:[3,6],doe:[2,6,4,5,3],left:[3,6],section:[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],involv:[3,6],explain:5,configur:[3,6,4],apach:4,nghttp2_err_invalid_stream_id:[3,6],busi:[2,5],nghttp2_flag_pad_high:[3,6],nghttp2_cleartext_proto_version_id:[3,6],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,6,4,3],baz:4,push_promis:[2,6,3],"public":[0,6,3],nghttp2_strerror:[2,6,5,3],nghttp2_gzip_inflate_del:[3,6],bufferevent_ssl_accept:2,serve_forev:4,"0x40":[3,6],nul:[3,6],result:[2,5],respons:[2,6,4,5,3],fail:[3,6,4],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],nghttp2_default_weight:[3,6],against:[3,6,4],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],option_ptr:[3,6],duplic:[3,6],reciev:5,liabil:[2,6,5,1],evbuffer_get_length:[2,5],chrome:4,max_deflate_s:4,been:[2,6,5,3],github:[0,4],much:[2,6,3],interest:[2,4,5],basic:4,futur:[3,6],tini:5,life:2,regul:[2,5],argument:[2,6,4,5,3],ewouldblock:[2,5],load_cert_chain:4,ssl_op_no_compress:[2,5],servic:2,zlib:4,publicli:4,nghttp2_on_begin_headers_callback:[3,6,5],bev_event_timeout:[2,5],printabl:5,nghttp2_inadequate_secur:[3,6],nghttp2_set:[3,6],promised_stream_id:[3,6],conf:4,pointer:[2,6,3],on_data:4,receiv:[2,6,4,5,3],make:[2,6,4,3],transpar:[3,6],headlen:[3,6],split:[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,4,3],nghttp2_session_get_effective_local_window_s:[3,6],origin_len:[3,6],client:[0,6,3],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":[3,6,4],initiate_connect:5,ifdef:[2,6],yet:[3,6],previous:[3,6],easi:4,els:[2,5],applic:[2,6,4,5,3],nghttp2_nv_flag:[3,6],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:[3,6,5],underli:[2,5],www:[3,6],right:[2,6,5,1],deal:[2,6,5,1,3],intern:[3,6],successfulli:[2,6,5,3],transmiss:[2,6,5,3],requesthandlerclass:4,ni_numerichost:2,bottom:[3,6],nghttp2_data_source_read_callback:[3,6],subclass:4,buffer:[2,6,4,5,3],condit:[2,6,5,1,3],foo:4,localhost:4,core:4,particular:[2,6,5,1,3],sensibl:[3,6],repositori:[2,5],peer:[2,6,5,3],post:[3,6,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],git:[0,6,3],session_send:[2,5],wai:[3,6,4],support:[2,6,4,5,3],verbos:4,overhead:4,fork:4,head:[2,6,3],event_bas:[2,5],offer:4,taken:[3,6],heap:4,"true":4,hddeflat:4,ssl_ctx_free:[2,5],maximum:[3,6,4],tell:[2,6,5,3],deafult:4,autoconf:4,emit:[2,6,5,3],nghttp2_initial_window_s:[3,6],featur:4,httpbi:[0,6,4,3],netdb:2,unreleas:4,exist:[3,6,4],protocol_id_len:[3,6],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],nghttp2_check_header_valu:[3,6],send_client_connection_head:5,unlimit:[3,6],intend:2,af_unspec:[2,5],nghttp2_option_new:[3,6],nghttp2_max_window_s:[3,6],technot:[3,6],notic:[2,6,5,1],consid:4,evconnlistener_new_bind:2,longer:[2,4],nghttp2_check_header_nam:[3,6],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,6,4,5,3],readabl:5,sourc:[0,6,5,3,2],string:[2,6,4,5,3],nghttp2_settings_enable_push:[3,6],host_len:[3,6],level:[2,6,3],did:[3,6,5],item:4,settings_id:[3,6],conhead:2,upper:[3,6],sign:4,port:[2,6,4,5,3],data_flag:[2,6,3],appear:[3,6,4],event_base_fre:[2,5],current:[2,6,4,3],nghttp2_err_data_exist:[3,6],gener:[3,6,4],onli:[2,6,4,5,3],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],handler:4,nghttp2_altsvc:[3,6],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,critic:[3,6],abort:[3,6],nghttp2_header:[2,6,5,3],occur:[3,6],alwai:[2,6,3],multipl:[2,6,4,5,3],charset:4,ping:[3,6],write:[2,4,5],sslcontext:4,max:[3,6,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],combin:[3,6],talk:[2,4],nghttp2_err_stream_shut_wr:[3,6],size_t:[2,6,5,3],nghttp2_err_unsupported_vers:[3,6],still:[2,6,4,3],nghttp2_settings_entri:[2,6,5,3],dynam:4,entiti:2,group:[3,6],precondit:[3,6],nghttp2_priority_spec:[3,6],tort:[2,6,5,1],window:[3,6],main:[2,5],non:[2,6,4,5,3],recal:5,env:4,"5xx":4,nghttp2_submit_head:[3,6],nghttp2_on_header_callback:[2,6,5,3],"0x000400":1,name:[2,6,4,5,3],version_num:[3,6],config:4,no_error:4,drop:[2,6,5,3],millisec:4,replac:[3,6],individu:[3,6],continu:[2,6,5,3],event_base_loop:[2,5],turoti:5,happen:[2,4,5],ai_addrlen:2,libjemalloc:4,space:[3,6,4],output_length:4,earlier:[2,5],event_base_new:[2,5],argv:[2,5],org:[0,6,4,3],"byte":[2,6,4,5,3],argc:[2,5],care:[3,6],nghttp2_opt_no_auto_connection_window_upd:[3,6],nghttp2ver:[0,6,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,origin:[3,6],directli:[2,6,5,3],onc:[3,6],arrai:[3,6,4,5],yourself:4,nghttp2_is_fat:[3,6],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,4],necessarili:[3,6],sigpip:[2,5],internal_error:[3,6],conveni:[3,6],knowledg:4,copi:[2,6,5,1,3],specifi:[2,6,4,5,3],on_head: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],nghttp2_min_weight:[3,6],browser:4,sai:[3,6],pri:6,ani:[2,1,3,4,5,6],deliv:[3,6],sat:4,bitwis:[3,6],form:[3,6,4],destroi:[2,5],payloadlen:[3,6],note:[2,6,4,5,3],take:[2,6,4,5,3],properti:[2,5],noth:[3,6,4],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:[2,6,4,5,3],http2_select:[3,6],later:[2,6,5,3],gracefulli:5,show:[4,5],unprocess:[2,5],concurr:[2,6,4,3],permiss:[2,6,5,1],threshold:2,pad_high:[3,6],end_seg:[3,6],written:[2,6,4,5,3],"4e5535a027780":4,priority_group:[3,6],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],requir:[0,6,3],nghttp2_set_stream_user_data:2,multi:4,reserv:[3,6],op_no_sslv2:4,nghttp2_priority_group:[3,6],detect:[3,6,4],weighttp:4,"import":4,fcntl:2,pipefd:2,evdns_bas:5,submit_request:5,region:[3,6],contract:[2,6,5,1],tutori:0,mani:[3,6],nghttp2_data_provid:[2,6,3],inspir:4,nghttp2_err_too_many_inflight_set:[3,6],cancel:[3,6],damag:[2,6,5,1],http2server:4,header_table_s:4,nghttp2_settings_max:[3,6],"abstract":[2,5],nghttp2_on_unknown_frame_recv_callback:[3,6],those:[2,6,5,3],uf_queri:5,hdr:[2,4,5],invok:[2,6,4,5,3],invoc:[2,6,3],nghttp2_nv_flag_no_index:[3,6],on_data_chunk_recv_callback:[3,6,5],stdout:[4,5],ascii:[3,6],develop:0,author:[2,6,4,5,1],bev_opt_defer_callback:[2,5],alphabet:[3,6],same:[2,6,4,5,3],ssl_library_init:[2,5],binari:5,pac:4,pad:[3,6],document:[0,6,1],finish:[2,6,4,5,3],decompress:[3,6,4],handshake_leftlen:2,extern:6,postpon:[3,6],ai_next:2,without:[2,1,3,4,5,6],nghttp2_push_promis:[3,6],on_request_don:4,event2:[2,5],nghttp2_err_def:[3,6],nghttp2_submit_set:[2,6,5,3],execut:4,multiplex:2,hint:2,except:[3,6],nghttp2_flag_priority_depend:[3,6],identif:[3,6],nghttp2_select_next_protocol:[3,6,5],real:5,unistd:[2,5],read:[2,6,4,5,3],nghttp2_version_ag:[3,6],rfc2616:[3,6],test:0,traffic:4,next_proto_cb:2,integ:[3,6],server:[0,6,3],either:[2,6,3],output:[2,6,4,5,3],manag:[2,6,3],stream_clos:[3,6],protocol_sslv23:4,ssl_ctx_set_next_protos_advertised_cb:2,handshak:[2,5],nonzero:[2,6,3],easili:5,"2xx":4,exit:[2,5],data_ptr:[3,6],freed:4,base64url:[3,6],inspect:[3,6],fulli:[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],max_siz:4,least_vers:[3,6],error_repli:2,your: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],ipv4:4,lot:[3,6],ipv6:4,strictli:[3,6],next_proto_list:2,nghttp2_proto_version_id_len:[2,6,3],tupl:4,nghttp2_err_invalid_st:[3,6],satur:4,nghttp2_flag_end_seg:[3,6],possibl:[2,6,5,3],"default":[2,6,4,3],applayerprotoneg:[3,6],hpack:0,expect:4,creat:[2,6,4,5,3],decreas:[3,6],file:[2,1,3,4,5,6],nghttp2_err_invalid_header_block:[3,6],fill:[2,6,3],denot:[3,6,5],functypedef:6,googl:4,kbyte: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],promised_stream_user_data:[3,6],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],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,bufferevent_writ:[2,5],"case":[2,6,4,5,3],fals:4,pad_low:[3,6],nghttp2_option:[3,6],nghttp2_client_connection_header_len:[3,6],failur:[3,6],veri:[3,6,5],"__cplusplu":6,list:[2,6,3],nghttp2_headers_categori:[3,6],adjust:[3,6,4],stderr:[2,4,5],nghttp2_priority_type_group:[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:3,method:[2,6,4,5,3],libjansson:4,padlen:[3,6,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],on_clos:4,prior:4,amount:[2,6,5,3],action:[2,6,5,1,3],via:[2,6,4,5,3],primit:5,ask:[3,6],famili:[2,5],establish:[2,5],select:[3,6,5],regist:2,libev:[0,4],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],flag:[2,6,4,5,3],sens:[3,6],known:[3,6],nghttp2_err_wouldblock:[2,6,5,3],none:4,endpoint:[3,6,4],dep:[3,6],dev:[4,1],remain:[2,6,5,3],def:4,share:[3,6,4],accept:[2,6,4,3],minimum:[2,6,3],ssl_op_al:[2,5],nghttp2_submit_altsvc:[3,6],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],css:4,resourc:3,referenc:4,variant:[3,6],spdylai:4,nghttp2_client_connection_preface_len:[2,6,5,3],associ:[2,1,3,4,5,6],"short":[2,5],caus:[3,6],callback:[2,6,4,5,3],nghttp2_nv_flag_non:[2,6,5,3],alpn:[3,6,4],authroiti:5,max_ag:[3,6],hypertext:[0,4],libcunit1:4,through:[2,4],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,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],weight:[3,6],monoton:5,realli:5,connect:[2,1,3,4,5,6],field_set:5,event:[2,6,4,5,1],app_ctx:2,ftw:4,publish:[2,6,5,1],payload:[3,6],etag:4,print:[4,5],on_frame_not_send_callback:[3,6],proxi:0,advanc:[3,6],differ:[3,6],uf_host:5,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,prefac:[2,6,5,3],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,prevent:[3,6],number:[2,6,1,3],done:[2,4,5],construct:[3,6,4],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],memcmp:2,nghttp2_client_connection_head:[3,6],pars:5,window_upd:[3,6],doubli:2,remot:[2,6,5,3],remov:[2,6,3],bridg:4,consumpt:[2,5],nghttp2_error:[3,6],window_size_incr:[3,6],lib_error_cod:[3,6],arrlen:[2,5],packag:4,"null":[2,6,5,3],syn_stream:[3,6],sell:[2,6,5,1],outbound:[3,6],built:4,equival:[3,6],afram:[3,6],also:[2,6,5,3],build:0,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],nghttp2_priority_dep:[3,6],charg:[2,6,5,1],addr:2,"01881f3468e5891afcbf83868a3d856659c62e3f":4,compar:[3,6,5],frame_size_error:[3,6],h2c:[6,4],pri_spec:[3,6],microsec:4,nghttp2_submit_push_promis:[3,6],copyright:[2,6,5,1],refused_stream:[3,6],pri_typ:[3,6],nghttp2_opt_no_auto_stream_window_upd:[3,6],queu:[2,6,5,3],express:[2,6,5,1],kind:[2,6,5,1,3],nativ:4,"3xx":4,liabl:[2,6,5,1],before_frame_send_callback:[3,6,5],retreiv:5,crt:[2,4],h2load:4,certif:[2,4,5],set:[2,6,4,5,3],seq:4,sep:4,ousid:4,remove_stream:2,nghttp2_submit_goawai:[3,6],sec:4,arg:[2,6,5,3],close:[2,6,4,5,3],jemalloc:4,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:4,percent_decod:2,closur:[3,6,5],last:[3,6,4],delimit:4,nghttp2_data_flag_non:[3,6],nghttp2_session_want_writ:[2,6,5,3],tempor:[3,6],context:[2,6,4,5,3],compression_error:[3,6],whole:[3,6,4],simpli:[2,5],point:[2,6,5,3],header:[0,6,3],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,4],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,4,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],person:[2,6,5,1],uint32_t:[2,6,3],self:4,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,on_begin_headers_callback:[2,6,5,3],obsolet:[3,6],format:[2,6,4,5,3],http_parser:5,bit:[3,6,1],strstr:2,foobarbuzz:4,signal:[2,6,5,3],lib_error:[3,6],some:[2,6,5,3],back:[3,6],sampl:4,sizeof:[2,5],libssl:4,lev_opt_reus:2,per:[3,6,4],larg:[3,6],make_nv2:5,machin:4,run:[2,6,4,5,3],step:[3,6],from:[0,6,1,3],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],chang:[2,6,3],occupi:4,inclus:[3,6],errno:2,"long":[3,6,4],nghttp2:3,forward:[3,6,4],session_ptr:[3,6],repeatedli:[3,6],nghttp2_priority_type_dep:[3,6],link:[2,4],ni_maxhost:2,nghttp2_session_set_stream_user_data:[2,6,3],line:4,mitig:4,concaten:[3,6],utf:4,caller:[2,6,3],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],nghttp2_flag_pad_low:[3,6],nghttp2_gzip_inflate_new:[3,6],algorithm:[3,6],nghttp2_submit_request:[3,6,5],namelen:[2,6,5,3],far:[2,5],priority_depend:[3,6],asyncio:4,getaddrinfo:2,code:[2,6,4,5,3],queri:5,nghttp2_frame_hd:[3,6],cython:4,privat:[2,4],send:[2,6,4,5,3],http_parser_url:5,lower:[3,6],aris:[2,6,5,1],fatal:[2,6,5,3],nghttp2_data_flag:[3,6],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":[3,6,4],session:[2,6,4,5,3],pleas:[2,6,4,5,3],impli:[2,6,5,1],smaller:4,snprintf:5,"0x1":[3,6],memset:[2,5],download:[0,4],client_address:4,index:[3,6,4],o_rdonli:2,access:[3,6,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],bodi:[2,6,4,5,3],nghttp2_rst_stream:[3,6],ubuntu:4,becom:[2,6,1,3],sinc:[2,6,4,5,3],pri_group_id:[3,6],larger:[3,6],ctx:4,settings_payloadlen:[3,6],autoreconf:4,jansson:4,greac:[2,5],typic:4,output_wouldblock_threshold:2,appli:[3,6],bufferev:[2,5],feb:4,commun:[2,4,5],binascii:4,upgrad:[3,6,4],next:[2,6,5,3],findproxyforurl:4,usr:4,nghttp2_nv:[2,6,5,3],nghttp2_option_del:[3,6],jxck:4,goawai:[2,6,4,5,3],benchmark:0,deflat:[3,6,4],account:[3,6,4,5],retriev:[2,6,5,3],tunnel:4,nghttp2_settings_id:[3,6],data_falg:[3,6],about:[2,6,5,3],aliv:[2,6,3],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],nghttp2_flag_priority_group:[3,6],max_payloadlen:[3,6],eventcb:[2,5],nghttp2_compression_error:[3,6],alloc:[2,6,3],bind:0,nvlen:[2,6,5,3],correspond:[2,4],element:[2,6,3],issu:[0,6,4,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,4,5,3],nghttp2_goawai:[3,6],handi:5,ssl_op_no_sslv2:[2,5],nghttp2_session_mem_send:[3,6],anyth:5,uf_port:5,mode:4,ssl_filetype_pem:2,chunk:[3,6,4,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,4],n1000:4,categori:[3,6,5],suitabl:[3,6],rel:2,field_data:5,recv_callback:[3,6],insid:4,cleartext:[3,6],releas:3,nghttp2_option_set_no_auto_connection_window_upd:[3,6],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,4,5],intention:[3,6],unknown:[2,6,3],system:[2,5],messag:[3,6,5],attach:[2,5],attack:4,termin:[2,6,4,5,3],low:[3,6],request_head: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],bufferevent_get_input:[2,5],corrupt:5,have:[2,6,4,5,3],tabl:[3,6,4],need:[3,6,4,5],ai_socktyp:2,"0x08":[3,6],"0x09":[3,6],"0x04":[3,6,4],"0x05":[3,6,4],"0x06":[3,6],"0x07":[3,6],"0x00":[3,6,4],nghttp2_err_flow_control:[3,6],"0x02":[3,6],"0x03":[3,6],nghttp2_refused_stream:[3,6],evbuffer_pullup:[2,5],which:[2,6,4,5,3],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],"0x0d":[3,6],"0x0a":[3,6],ssl_load_error_str:[2,5],text:4,bufferevent_get_output:[2,5],redirect:5,locat:5,should:[2,6,4,5,3],local:[3,6],meant:5,nghttp2_priority_type_non:[3,6],nghttp2_priority_spec_group_init:[3,6],familiar:4,memcpi:[2,5],nghttp2_session_client_new2:[3,6],settings_initial_window_s:[3,6,4],nghttp2_data:[2,6,3],increas:[3,6,5],portion:[2,6,5,1,3],nghttp2_submit_respons:[2,6,3],enabl: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],ssl_ctx:[2,6,5,3],temporarili:[3,6],statu:[0,6,3],wire:[2,4,5],correctli:[3,6],mainli:[3,6],state:[2,6,4,3],https_uri:5,progress:4,nghttp2_initial_connection_window_s:[3,6],kei:[2,6,4,3],entir:[2,6,3],last_stream_id:[3,6,4],disconnect:[2,5],addit:[2,6,3],revers:4,nghttp2_proto_version_id:[2,6,5,3],equal:2,etc:[2,4,5],instanc:[3,6,4],uint16_t:[3,6,5],nghttp2_data_flag_eof:[2,6,3],arriv:4,m10:4,commenc:5,respect:[3,6,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],immedi:[3,6],nghttp2_hcat_head:[3,6],altsvc:[3,6,4],both:[2,6,4,5,3],sock_stream:2,evconnlisten:2,on_header_callback:[2,6,5,3],nghttp2_frame_size_error:[3,6],plain:4,defin:[2,6,5,1,3],eintr:2,inadequate_secur:[3,6],helper:[3,6],on_request_recv:2,libxml2:4,squid:4,select_next_proto_cb:[3,6,5],archiv:[2,5],substanti:[2,6,5,1],synopsi:[2,5],let:[2,5],member:[2,6,3],python:0,ifndef:[6,1],http:3,hostnam:4,effect:[3,6],initi:[2,6,5,3],dealloc:4,off:5,well:[2,5],app_context:2,"0x10":[3,6],exampl:[2,6,4,5,3],command:4,choos:[3,6],error_cod:[2,6,4,5,3],nghttp2_data_sourc:[2,6,3],usual:[3,6],paus:[3,6],less:[3,6],send_callback:[2,6,5,3],half:[3,6],obtain:[2,6,5,1],tcp:[2,6,5,3],heavili:4,web:[2,4],cert_fil:2,send_server_connection_head:2,priorit:[3,6],addrlen:2,add:[2,6,3],c10:4,match:[2,5],gmt:4,nvu:4,know:[3,6],nva:[2,6,5,3],python3:4,resid:[2,5],like:[2,6,4,5,3],success:4,protocol_id:[3,6],nghttp2_flag_end_head:[3,6],necessari:[2,6,3],tlen:[3,6],page:[2,5],file_read_callback:2,nghttp2_priority_spec_dep_init:[3,6],suppli:[3,6],"export":2,nghttp2_session_get_effective_recv_data_length:[3,6],error_html:2,librari:3,lead:[3,6],avoid:[2,6,4,5,3],octet:[2,5],overlap:[3,6],isxdigit:2,outgo:[2,6,3],nghttp2_session_upgrad:[3,6],delete_http2_stream_data:[2,5],usag:[2,6,4,5,3],host:[0,2,3,4,5,6],nghttp2_nv_compare_nam:[3,6],err_get_error:[2,5],actual:[2,6,5,3],socket:[2,5],nghttp2_gzip:[3,6],ssl_tlsext_err_ok:[2,6,5,3],disabl:[3,6,4],nghttp2_client_connection_prefac:[2,6,5,3],own:[3,6],nghttp2_err_invalid_fram:[3,6],automat:[3,6],warranti:[2,6,5,1],automak:4,merg:[2,6,5,1],val:[2,6,5,3],ai_famili:2,transfer:[0,6,4,3],bump:[3,6],trigger:[3,6],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,6,5,1,3],problem:[3,6],sockaddr:2,nghttp2_on_frame_not_send_callback:[3,6],strndup:5,"int":[2,6,5,3],baserequesthandl:4,nghttp2_flag_end_stream:[2,6,3],allow:[3,6,4],percent:2,detail:[3,6],other:[2,6,5,1,3],nghttp2_err_invalid_argu:[3,6],rememb:[2,5],outlen_ptr:[3,6],stat:2,nghttp2_max_weight:[3,6],err_error_str:[2,5],rel_path:2,proto_str:[3,6],debian:4,session_data:[2,5],sphinx:4,eof:[2,6,3],reliabl:[3,6],indirectli:3,rule:[3,6],nghttp2_no_error:[3,6,5]},objtypes:{"0":"c:member","1":"c:macro","2":"c:function","3":"c:type"},objnames:{"0":["c","member","C member"],"1":["c","macro","C macro"],"2":["c","function","C function"],"3":["c","type","C type"]},filenames:["index","nghttp2ver.h","tutorial-server","apiref","package_README","tutorial-client","nghttp2.h"],titles:["nghttp2 - HTTP/2 C Library","nghttp2ver.h","Tutorial: HTTP/2 server","API Reference","nghttp2 - HTTP/2 C Library","Tutorial: HTTP/2 client","nghttp2.h"],objects:{"":{NGHTTP2_ERR_INVALID_STATE:[3,1,1,"c.NGHTTP2_ERR_INVALID_STATE"],NGHTTP2_ERR_INVALID_STREAM_STATE:[3,1,1,"c.NGHTTP2_ERR_INVALID_STREAM_STATE"],NGHTTP2_ERR_HEADER_COMP:[3,1,1,"c.NGHTTP2_ERR_HEADER_COMP"],NGHTTP2_SETTINGS_HEADER_TABLE_SIZE:[3,1,1,"c.NGHTTP2_SETTINGS_HEADER_TABLE_SIZE"],NGHTTP2_FLAG_PRIORITY_DEPENDENCY:[3,1,1,"c.NGHTTP2_FLAG_PRIORITY_DEPENDENCY"],nghttp2_settings_entry:[3,3,1,"c.nghttp2_settings_entry"],NGHTTP2_INTERNAL_ERROR:[3,1,1,"c.NGHTTP2_INTERNAL_ERROR"],nghttp2_frame_hd:[3,3,1,"c.nghttp2_frame_hd"],nghttp2_on_frame_recv_callback:[3,3,1,"c.nghttp2_on_frame_recv_callback"],NGHTTP2_CLIENT_CONNECTION_HEADER_LEN:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_HEADER_LEN"],nghttp2_goaway:[3,3,1,"c.nghttp2_goaway"],nghttp2_ping:[3,3,1,"c.nghttp2_ping"],NGHTTP2_ERR_INVALID_FRAME:[3,1,1,"c.NGHTTP2_ERR_INVALID_FRAME"],nghttp2_priority_spec:[3,3,1,"c.nghttp2_priority_spec"],nghttp2_frame_type:[3,3,1,"c.nghttp2_frame_type"],NGHTTP2_ERR_INVALID_STREAM_ID:[3,1,1,"c.NGHTTP2_ERR_INVALID_STREAM_ID"],NGHTTP2_ALTSVC:[3,1,1,"c.NGHTTP2_ALTSVC"],nghttp2_select_next_protocol:[3,2,1,"c.nghttp2_select_next_protocol"],nghttp2_data_flag:[3,3,1,"c.nghttp2_data_flag"],NGHTTP2_ERR_INVALID_HEADER_BLOCK:[3,1,1,"c.NGHTTP2_ERR_INVALID_HEADER_BLOCK"],nghttp2_option_set_no_auto_stream_window_update:[3,2,1,"c.nghttp2_option_set_no_auto_stream_window_update"],nghttp2_session_callbacks:[3,3,1,"c.nghttp2_session_callbacks"],NGHTTP2_MAX_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_MAX_WINDOW_SIZE"],NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS:[3,1,1,"c.NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS"],NGHTTP2_ERR_PROTO:[3,1,1,"c.NGHTTP2_ERR_PROTO"],NGHTTP2_MAX_HEADER_TABLE_SIZE:[3,1,1,"c.NGHTTP2_MAX_HEADER_TABLE_SIZE"],nghttp2_submit_window_update:[3,2,1,"c.nghttp2_submit_window_update"],NGHTTP2_ERR_UNSUPPORTED_VERSION:[3,1,1,"c.NGHTTP2_ERR_UNSUPPORTED_VERSION"],nghttp2_option:[3,3,1,"c.nghttp2_option"],NGHTTP2_SETTINGS_ENABLE_PUSH:[3,1,1,"c.NGHTTP2_SETTINGS_ENABLE_PUSH"],nghttp2_window_update:[3,3,1,"c.nghttp2_window_update"],nghttp2_session_client_new2:[3,2,1,"c.nghttp2_session_client_new2"],NGHTTP2_DATA:[3,1,1,"c.NGHTTP2_DATA"],nghttp2_nv_flag:[3,3,1,"c.nghttp2_nv_flag"],nghttp2_on_header_callback:[3,3,1,"c.nghttp2_on_header_callback"],NGHTTP2_FLAG_ACK:[3,1,1,"c.NGHTTP2_FLAG_ACK"],NGHTTP2_STREAM_CLOSED:[3,1,1,"c.NGHTTP2_STREAM_CLOSED"],NGHTTP2_SETTINGS_MAX:[3,1,1,"c.NGHTTP2_SETTINGS_MAX"],NGHTTP2_NV_FLAG_NO_INDEX:[3,1,1,"c.NGHTTP2_NV_FLAG_NO_INDEX"],nghttp2_headers_category:[3,3,1,"c.nghttp2_headers_category"],nghttp2_session_mem_send:[3,2,1,"c.nghttp2_session_mem_send"],nghttp2_error_code:[3,3,1,"c.nghttp2_error_code"],nghttp2_send_callback:[3,3,1,"c.nghttp2_send_callback"],nghttp2_on_data_chunk_recv_callback:[3,3,1,"c.nghttp2_on_data_chunk_recv_callback"],NGHTTP2_FLAG_PRIORITY_GROUP:[3,1,1,"c.NGHTTP2_FLAG_PRIORITY_GROUP"],NGHTTP2_ERR_START_STREAM_NOT_ALLOWED:[3,1,1,"c.NGHTTP2_ERR_START_STREAM_NOT_ALLOWED"],NGHTTP2_ERR_FLOW_CONTROL:[3,1,1,"c.NGHTTP2_ERR_FLOW_CONTROL"],nghttp2_strerror:[3,2,1,"c.nghttp2_strerror"],nghttp2_priority_type:[3,3,1,"c.nghttp2_priority_type"],nghttp2_gzip_inflate_del:[3,2,1,"c.nghttp2_gzip_inflate_del"],NGHTTP2_ERR_FATAL:[3,1,1,"c.NGHTTP2_ERR_FATAL"],nghttp2_submit_goaway:[3,2,1,"c.nghttp2_submit_goaway"],nghttp2_error:[3,3,1,"c.nghttp2_error"],NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_INITIAL_CONNECTION_WINDOW_SIZE"],NGHTTP2_ERR_NOMEM:[3,1,1,"c.NGHTTP2_ERR_NOMEM"],NGHTTP2_ERR_PAUSE:[3,1,1,"c.NGHTTP2_ERR_PAUSE"],NGHTTP2_ENHANCE_YOUR_CALM:[3,1,1,"c.NGHTTP2_ENHANCE_YOUR_CALM"],NGHTTP2_ERR_PUSH_DISABLED:[3,1,1,"c.NGHTTP2_ERR_PUSH_DISABLED"],NGHTTP2_NO_ERROR:[3,1,1,"c.NGHTTP2_NO_ERROR"],nghttp2_select_padding_callback:[3,3,1,"c.nghttp2_select_padding_callback"],nghttp2_session_get_effective_recv_data_length:[3,2,1,"c.nghttp2_session_get_effective_recv_data_length"],NGHTTP2_PRIORITY_TYPE_GROUP:[3,1,1,"c.NGHTTP2_PRIORITY_TYPE_GROUP"],nghttp2_session_server_new2:[3,2,1,"c.nghttp2_session_server_new2"],NGHTTP2_ERR_DEFERRED:[3,1,1,"c.NGHTTP2_ERR_DEFERRED"],nghttp2_push_promise:[3,3,1,"c.nghttp2_push_promise"],nghttp2_priority_group:[3,3,1,"c.nghttp2_priority_group"],nghttp2_session_get_outbound_queue_size:[3,2,1,"c.nghttp2_session_get_outbound_queue_size"],NGHTTP2_PROTO_VERSION_ID_LEN:[3,1,1,"c.NGHTTP2_PROTO_VERSION_ID_LEN"],NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS:[3,1,1,"c.NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS"],nghttp2_data_source_read_callback:[3,3,1,"c.nghttp2_data_source_read_callback"],nghttp2_session_terminate_session:[3,2,1,"c.nghttp2_session_terminate_session"],NGHTTP2_SETTINGS_TIMEOUT:[3,1,1,"c.NGHTTP2_SETTINGS_TIMEOUT"],NGHTTP2_ERR_WOULDBLOCK:[3,1,1,"c.NGHTTP2_ERR_WOULDBLOCK"],nghttp2_submit_push_promise:[3,2,1,"c.nghttp2_submit_push_promise"],nghttp2_session_resume_data:[3,2,1,"c.nghttp2_session_resume_data"],NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE"],nghttp2_session_server_new:[3,2,1,"c.nghttp2_session_server_new"],NGHTTP2_WINDOW_UPDATE:[3,1,1,"c.NGHTTP2_WINDOW_UPDATE"],NGHTTP2_CONTINUATION:[3,1,1,"c.NGHTTP2_CONTINUATION"],nghttp2_rst_stream:[3,3,1,"c.nghttp2_rst_stream"],NGHTTP2_ERR_INVALID_ARGUMENT:[3,1,1,"c.NGHTTP2_ERR_INVALID_ARGUMENT"],NGHTTP2_ERR_FRAME_SIZE_ERROR:[3,1,1,"c.NGHTTP2_ERR_FRAME_SIZE_ERROR"],nghttp2_on_begin_headers_callback:[3,3,1,"c.nghttp2_on_begin_headers_callback"],NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN"],NGHTTP2_HEADERS:[3,1,1,"c.NGHTTP2_HEADERS"],nghttp2_flag:[3,3,1,"c.nghttp2_flag"],NGHTTP2_DEFAULT_WEIGHT:[3,1,1,"c.NGHTTP2_DEFAULT_WEIGHT"],NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS:[3,1,1,"c.NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS"],NGHTTP2_HCAT_REQUEST:[3,1,1,"c.NGHTTP2_HCAT_REQUEST"],NGHTTP2_FLAG_END_HEADERS:[3,1,1,"c.NGHTTP2_FLAG_END_HEADERS"],nghttp2_gzip:[3,3,1,"c.nghttp2_gzip"],NGHTTP2_RST_STREAM:[3,1,1,"c.NGHTTP2_RST_STREAM"],nghttp2_option_set_peer_max_concurrent_streams:[3,2,1,"c.nghttp2_option_set_peer_max_concurrent_streams"],NGHTTP2_ERR_EOF:[3,1,1,"c.NGHTTP2_ERR_EOF"],NGHTTP2_HCAT_HEADERS:[3,1,1,"c.NGHTTP2_HCAT_HEADERS"],NGHTTP2_VERSION_NUM:[3,1,1,"c.NGHTTP2_VERSION_NUM"],NGHTTP2_SETTINGS:[3,1,1,"c.NGHTTP2_SETTINGS"],nghttp2_frame:[3,3,1,"c.nghttp2_frame"],NGHTTP2_FLAG_END_SEGMENT:[3,1,1,"c.NGHTTP2_FLAG_END_SEGMENT"],NGHTTP2_ERR_DEFERRED_DATA_EXIST:[3,1,1,"c.NGHTTP2_ERR_DEFERRED_DATA_EXIST"],NGHTTP2_CANCEL:[3,1,1,"c.NGHTTP2_CANCEL"],NGHTTP2_REFUSED_STREAM:[3,1,1,"c.NGHTTP2_REFUSED_STREAM"],nghttp2_on_frame_send_callback:[3,3,1,"c.nghttp2_on_frame_send_callback"],nghttp2_session_mem_recv:[3,2,1,"c.nghttp2_session_mem_recv"],NGHTTP2_VERSION:[3,1,1,"c.NGHTTP2_VERSION"],NGHTTP2_FLAG_PAD_HIGH:[3,1,1,"c.NGHTTP2_FLAG_PAD_HIGH"],nghttp2_session:[3,3,1,"c.nghttp2_session"],NGHTTP2_COMPRESSION_ERROR:[3,1,1,"c.NGHTTP2_COMPRESSION_ERROR"],NGHTTP2_HCAT_PUSH_RESPONSE:[3,1,1,"c.NGHTTP2_HCAT_PUSH_RESPONSE"],NGHTTP2_CLEARTEXT_PROTO_VERSION_ID:[3,1,1,"c.NGHTTP2_CLEARTEXT_PROTO_VERSION_ID"],nghttp2_submit_rst_stream:[3,2,1,"c.nghttp2_submit_rst_stream"],nghttp2_submit_headers:[3,2,1,"c.nghttp2_submit_headers"],nghttp2_recv_callback:[3,3,1,"c.nghttp2_recv_callback"],nghttp2_priority_spec_dep_init:[3,2,1,"c.nghttp2_priority_spec_dep_init"],nghttp2_session_get_stream_user_data:[3,2,1,"c.nghttp2_session_get_stream_user_data"],NGHTTP2_PRIORITY_TYPE_DEP:[3,1,1,"c.NGHTTP2_PRIORITY_TYPE_DEP"],nghttp2_nv:[3,3,1,"c.nghttp2_nv"],nghttp2_altsvc:[3,3,1,"c.nghttp2_altsvc"],nghttp2_on_invalid_frame_recv_callback:[3,3,1,"c.nghttp2_on_invalid_frame_recv_callback"],nghttp2_version:[3,2,1,"c.nghttp2_version"],nghttp2_session_want_write:[3,2,1,"c.nghttp2_session_want_write"],nghttp2_on_unknown_frame_recv_callback:[3,3,1,"c.nghttp2_on_unknown_frame_recv_callback"],NGHTTP2_CLIENT_CONNECTION_PREFACE:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_PREFACE"],NGHTTP2_ERR_STREAM_CLOSED:[3,1,1,"c.NGHTTP2_ERR_STREAM_CLOSED"],NGHTTP2_ERR_CALLBACK_FAILURE:[3,1,1,"c.NGHTTP2_ERR_CALLBACK_FAILURE"],NGHTTP2_ERR_GOAWAY_ALREADY_SENT:[3,1,1,"c.NGHTTP2_ERR_GOAWAY_ALREADY_SENT"],NGHTTP2_FLOW_CONTROL_ERROR:[3,1,1,"c.NGHTTP2_FLOW_CONTROL_ERROR"],NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN:[3,1,1,"c.NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN"],nghttp2_session_set_stream_user_data:[3,2,1,"c.nghttp2_session_set_stream_user_data"],nghttp2_check_header_value:[3,2,1,"c.nghttp2_check_header_value"],NGHTTP2_ERR_STREAM_CLOSING:[3,1,1,"c.NGHTTP2_ERR_STREAM_CLOSING"],NGHTTP2_INADEQUATE_SECURITY:[3,1,1,"c.NGHTTP2_INADEQUATE_SECURITY"],nghttp2_session_client_new:[3,2,1,"c.nghttp2_session_client_new"],nghttp2_check_header_name:[3,2,1,"c.nghttp2_check_header_name"],nghttp2_info:[3,3,1,"c.nghttp2_info"],NGHTTP2_PROTO_VERSION_ID:[3,1,1,"c.NGHTTP2_PROTO_VERSION_ID"],nghttp2_settings_id:[3,3,1,"c.nghttp2_settings_id"],NGHTTP2_DATA_FLAG_EOF:[3,1,1,"c.NGHTTP2_DATA_FLAG_EOF"],NGHTTP2_PRIORITY_TYPE_NONE:[3,1,1,"c.NGHTTP2_PRIORITY_TYPE_NONE"],nghttp2_session_send:[3,2,1,"c.nghttp2_session_send"],NGHTTP2_PROTOCOL_ERROR:[3,1,1,"c.NGHTTP2_PROTOCOL_ERROR"],nghttp2_gzip_inflate:[3,2,1,"c.nghttp2_gzip_inflate"],nghttp2_session_upgrade:[3,2,1,"c.nghttp2_session_upgrade"],nghttp2_session_del:[3,2,1,"c.nghttp2_session_del"],NGHTTP2_ERR_INSUFF_BUFSIZE:[3,1,1,"c.NGHTTP2_ERR_INSUFF_BUFSIZE"],nghttp2_settings:[3,3,1,"c.nghttp2_settings"],nghttp2_on_frame_not_send_callback:[3,3,1,"c.nghttp2_on_frame_not_send_callback"],nghttp2_option_set_no_auto_connection_window_update:[3,2,1,"c.nghttp2_option_set_no_auto_connection_window_update"],nghttp2_submit_data:[3,2,1,"c.nghttp2_submit_data"],nghttp2_session_get_stream_remote_window_size:[3,2,1,"c.nghttp2_session_get_stream_remote_window_size"],NGHTTP2_CLIENT_CONNECTION_HEADER:[3,1,1,"c.NGHTTP2_CLIENT_CONNECTION_HEADER"],NGHTTP2_FLAG_NONE:[3,1,1,"c.NGHTTP2_FLAG_NONE"],nghttp2_priority_spec_group_init:[3,2,1,"c.nghttp2_priority_spec_group_init"],nghttp2_option_del:[3,2,1,"c.nghttp2_option_del"],nghttp2_submit_altsvc:[3,2,1,"c.nghttp2_submit_altsvc"],NGHTTP2_DATA_FLAG_NONE:[3,1,1,"c.NGHTTP2_DATA_FLAG_NONE"],NGHTTP2_NV_FLAG_NONE:[3,1,1,"c.NGHTTP2_NV_FLAG_NONE"],nghttp2_submit_settings:[3,2,1,"c.nghttp2_submit_settings"],nghttp2_is_fatal:[3,2,1,"c.nghttp2_is_fatal"],NGHTTP2_PING:[3,1,1,"c.NGHTTP2_PING"],NGHTTP2_MAX_WEIGHT:[3,1,1,"c.NGHTTP2_MAX_WEIGHT"],nghttp2_priority:[3,3,1,"c.nghttp2_priority"],nghttp2_session_want_read:[3,2,1,"c.nghttp2_session_want_read"],NGHTTP2_VERSION_AGE:[3,1,1,"c.NGHTTP2_VERSION_AGE"],NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE:[3,1,1,"c.NGHTTP2_ERR_STREAM_ID_NOT_AVAILABLE"],NGHTTP2_CONNECT_ERROR:[3,1,1,"c.NGHTTP2_CONNECT_ERROR"],NGHTTP2_FLAG_END_STREAM:[3,1,1,"c.NGHTTP2_FLAG_END_STREAM"],nghttp2_on_stream_close_callback:[3,3,1,"c.nghttp2_on_stream_close_callback"],NGHTTP2_PUSH_PROMISE:[3,1,1,"c.NGHTTP2_PUSH_PROMISE"],nghttp2_data_provider:[3,3,1,"c.nghttp2_data_provider"],NGHTTP2_ERR_DATA_EXIST:[3,1,1,"c.NGHTTP2_ERR_DATA_EXIST"],nghttp2_session_recv:[3,2,1,"c.nghttp2_session_recv"],nghttp2_option_new:[3,2,1,"c.nghttp2_option_new"],nghttp2_session_get_effective_local_window_size:[3,2,1,"c.nghttp2_session_get_effective_local_window_size"],NGHTTP2_INITIAL_WINDOW_SIZE:[3,1,1,"c.NGHTTP2_INITIAL_WINDOW_SIZE"],NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE:[3,1,1,"c.NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE"],NGHTTP2_HCAT_RESPONSE:[3,1,1,"c.NGHTTP2_HCAT_RESPONSE"],nghttp2_submit_priority:[3,2,1,"c.nghttp2_submit_priority"],nghttp2_session_get_stream_effective_local_window_size:[3,2,1,"c.nghttp2_session_get_stream_effective_local_window_size"],nghttp2_priority_dep:[3,3,1,"c.nghttp2_priority_dep"],nghttp2_headers:[3,3,1,"c.nghttp2_headers"],nghttp2_before_frame_send_callback:[3,3,1,"c.nghttp2_before_frame_send_callback"],NGHTTP2_GOAWAY:[3,1,1,"c.NGHTTP2_GOAWAY"],NGHTTP2_ERR_GZIP:[3,1,1,"c.NGHTTP2_ERR_GZIP"],NGHTTP2_MIN_WEIGHT:[3,1,1,"c.NGHTTP2_MIN_WEIGHT"],NGHTTP2_FLAG_PAD_LOW:[3,1,1,"c.NGHTTP2_FLAG_PAD_LOW"],nghttp2_submit_ping:[3,2,1,"c.nghttp2_submit_ping"],NGHTTP2_FRAME_SIZE_ERROR:[3,1,1,"c.NGHTTP2_FRAME_SIZE_ERROR"],nghttp2_data_source:[3,3,1,"c.nghttp2_data_source"],NGHTTP2_ERR_STREAM_SHUT_WR:[3,1,1,"c.NGHTTP2_ERR_STREAM_SHUT_WR"],nghttp2_submit_response:[3,2,1,"c.nghttp2_submit_response"],NGHTTP2_PRIORITY:[3,1,1,"c.NGHTTP2_PRIORITY"],nghttp2_submit_request:[3,2,1,"c.nghttp2_submit_request"],nghttp2_session_get_stream_effective_recv_data_length:[3,2,1,"c.nghttp2_session_get_stream_effective_recv_data_length"],nghttp2_pack_settings_payload:[3,2,1,"c.nghttp2_pack_settings_payload"],nghttp2_data:[3,3,1,"c.nghttp2_data"],nghttp2_gzip_inflate_new:[3,2,1,"c.nghttp2_gzip_inflate_new"],nghttp2_nv_compare_name:[3,2,1,"c.nghttp2_nv_compare_name"]},nghttp2_frame:{push_promise:[3,0,1,"c.nghttp2_frame.push_promise"],settings:[3,0,1,"c.nghttp2_frame.settings"],ping:[3,0,1,"c.nghttp2_frame.ping"],rst_stream:[3,0,1,"c.nghttp2_frame.rst_stream"],priority:[3,0,1,"c.nghttp2_frame.priority"],headers:[3,0,1,"c.nghttp2_frame.headers"],goaway:[3,0,1,"c.nghttp2_frame.goaway"],window_update:[3,0,1,"c.nghttp2_frame.window_update"],data:[3,0,1,"c.nghttp2_frame.data"],hd:[3,0,1,"c.nghttp2_frame.hd"],altsvc:[3,0,1,"c.nghttp2_frame.altsvc"]},nghttp2_settings_entry:{settings_id:[3,0,1,"c.nghttp2_settings_entry.settings_id"],value:[3,0,1,"c.nghttp2_settings_entry.value"]},nghttp2_window_update:{hd:[3,0,1,"c.nghttp2_window_update.hd"],window_size_increment:[3,0,1,"c.nghttp2_window_update.window_size_increment"]},nghttp2_frame_hd:{stream_id:[3,0,1,"c.nghttp2_frame_hd.stream_id"],length:[3,0,1,"c.nghttp2_frame_hd.length"],flags:[3,0,1,"c.nghttp2_frame_hd.flags"],type:[3,0,1,"c.nghttp2_frame_hd.type"]},nghttp2_push_promise:{padlen:[3,0,1,"c.nghttp2_push_promise.padlen"],nvlen:[3,0,1,"c.nghttp2_push_promise.nvlen"],promised_stream_id:[3,0,1,"c.nghttp2_push_promise.promised_stream_id"],hd:[3,0,1,"c.nghttp2_push_promise.hd"],nva:[3,0,1,"c.nghttp2_push_promise.nva"]},nghttp2_priority_group:{pri_group_id:[3,0,1,"c.nghttp2_priority_group.pri_group_id"],weight:[3,0,1,"c.nghttp2_priority_group.weight"]},nghttp2_ping:{hd:[3,0,1,"c.nghttp2_ping.hd"]},nghttp2_priority:{pri_spec:[3,0,1,"c.nghttp2_priority.pri_spec"],hd:[3,0,1,"c.nghttp2_priority.hd"]},nghttp2_priority_spec:{dep:[3,0,1,"c.nghttp2_priority_spec.dep"],pri_type:[3,0,1,"c.nghttp2_priority_spec.pri_type"],group:[3,0,1,"c.nghttp2_priority_spec.group"]},nghttp2_nv:{valuelen:[3,0,1,"c.nghttp2_nv.valuelen"],namelen:[3,0,1,"c.nghttp2_nv.namelen"],flags:[3,0,1,"c.nghttp2_nv.flags"],name:[3,0,1,"c.nghttp2_nv.name"],value:[3,0,1,"c.nghttp2_nv.value"]},nghttp2_altsvc:{origin:[3,0,1,"c.nghttp2_altsvc.origin"],max_age:[3,0,1,"c.nghttp2_altsvc.max_age"],protocol_id:[3,0,1,"c.nghttp2_altsvc.protocol_id"],origin_len:[3,0,1,"c.nghttp2_altsvc.origin_len"],host:[3,0,1,"c.nghttp2_altsvc.host"],protocol_id_len:[3,0,1,"c.nghttp2_altsvc.protocol_id_len"],host_len:[3,0,1,"c.nghttp2_altsvc.host_len"],port:[3,0,1,"c.nghttp2_altsvc.port"],hd:[3,0,1,"c.nghttp2_altsvc.hd"]},nghttp2_session_callbacks:{on_invalid_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_invalid_frame_recv_callback"],before_frame_send_callback:[3,0,1,"c.nghttp2_session_callbacks.before_frame_send_callback"],on_stream_close_callback:[3,0,1,"c.nghttp2_session_callbacks.on_stream_close_callback"],on_data_chunk_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_data_chunk_recv_callback"],on_begin_headers_callback:[3,0,1,"c.nghttp2_session_callbacks.on_begin_headers_callback"],send_callback:[3,0,1,"c.nghttp2_session_callbacks.send_callback"],on_unknown_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_unknown_frame_recv_callback"],on_header_callback:[3,0,1,"c.nghttp2_session_callbacks.on_header_callback"],on_frame_recv_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_recv_callback"],select_padding_callback:[3,0,1,"c.nghttp2_session_callbacks.select_padding_callback"],on_frame_not_send_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_not_send_callback"],on_frame_send_callback:[3,0,1,"c.nghttp2_session_callbacks.on_frame_send_callback"],recv_callback:[3,0,1,"c.nghttp2_session_callbacks.recv_callback"]},nghttp2_data_provider:{source:[3,0,1,"c.nghttp2_data_provider.source"],read_callback:[3,0,1,"c.nghttp2_data_provider.read_callback"]},nghttp2_rst_stream:{error_code:[3,0,1,"c.nghttp2_rst_stream.error_code"],hd:[3,0,1,"c.nghttp2_rst_stream.hd"]},nghttp2_priority_dep:{exclusive:[3,0,1,"c.nghttp2_priority_dep.exclusive"],stream_id:[3,0,1,"c.nghttp2_priority_dep.stream_id"]},nghttp2_headers:{pri_spec:[3,0,1,"c.nghttp2_headers.pri_spec"],nvlen:[3,0,1,"c.nghttp2_headers.nvlen"],cat:[3,0,1,"c.nghttp2_headers.cat"],padlen:[3,0,1,"c.nghttp2_headers.padlen"],nva:[3,0,1,"c.nghttp2_headers.nva"],hd:[3,0,1,"c.nghttp2_headers.hd"]},nghttp2_goaway:{opaque_data:[3,0,1,"c.nghttp2_goaway.opaque_data"],error_code:[3,0,1,"c.nghttp2_goaway.error_code"],opaque_data_len:[3,0,1,"c.nghttp2_goaway.opaque_data_len"],hd:[3,0,1,"c.nghttp2_goaway.hd"],last_stream_id:[3,0,1,"c.nghttp2_goaway.last_stream_id"]},nghttp2_info:{age:[3,0,1,"c.nghttp2_info.age"],version_str:[3,0,1,"c.nghttp2_info.version_str"],version_num:[3,0,1,"c.nghttp2_info.version_num"],proto_str:[3,0,1,"c.nghttp2_info.proto_str"]},nghttp2_data:{padlen:[3,0,1,"c.nghttp2_data.padlen"]},nghttp2_data_source:{fd:[3,0,1,"c.nghttp2_data_source.fd"],ptr:[3,0,1,"c.nghttp2_data_source.ptr"]},nghttp2_settings:{niv:[3,0,1,"c.nghttp2_settings.niv"],hd:[3,0,1,"c.nghttp2_settings.hd"],iv:[3,0,1,"c.nghttp2_settings.iv"]}},titleterms:{version:0,header:4,api:3,http:[0,4,5,2],librari:[0,4],statu:4,git:4,develop:4,struct:3,union:3,libev:[2,5],client:[4,5],nghttp2:[0,6,4],program:4,build:4,test:4,document:4,type:3,"public":4,refer:3,"function":3,resourc:0,proxi:4,python:4,remark:3,tool:4,"enum":3,benchmark:4,typedef:3,compressor:4,releas:0,from:4,decompressor:4,nghttp2ver:1,nghttpd:4,macro:3,nghttp:4,requir:4,server:[2,4],inflatehd:4,tutori:[2,5],deflatehd:4,includ:3,hpack:4,bind:4,nghttpx:4}}) \ No newline at end of file diff --git a/tutorial-client.html b/tutorial-client.html index 1df7d1aa..803a4664 100644 --- a/tutorial-client.html +++ b/tutorial-client.html @@ -7,7 +7,7 @@ -
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -93,11 +93,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -137,7 +137,7 @@
- nghttp2 - HTTP/2 C Library
Tutorial: HTTP/2.0 client — nghttp2 0.4.0-DEV documentation +Tutorial: HTTP/2 client — nghttp2 0.4.0-DEV documentation @@ -53,8 +53,8 @@ - - + + @@ -81,7 +81,7 @@-
-
- nghttp2 - HTTP/2 C Library
- nghttp2 - HTTP/2.0 C Library
-
+
- nghttp2 - HTTP/2 C Library
- Development Status
- Public Test Server
- Requirements @@ -93,11 +93,11 @@
- Python bindings
- - Tutorial: HTTP/2.0 client
-
+
- Tutorial: HTTP/2 client -
- Tutorial: HTTP/2.0 server
-
+
- Tutorial: HTTP/2 server @@ -137,7 +137,7 @@
- nghttp2 - HTTP/2 C Library
nghttp2ver.h¶
/* - * nghttp2 - HTTP/2.0 C Library + * nghttp2 - HTTP/2 C Library * * Copyright (c) 2012, 2013 Tatsuhiro Tsujikawa * diff --git a/objects.inv b/objects.inv index 498a43525bd118beee835d33a9143732bf5922a7..5f91afb697128e4e1305dbc853fddab3835ad3dc 100644 GIT binary patch delta 2374 zcmV-M3Ay%*5vvoBet)G~OOu;85WeSExN7$rS8a}aBS!X6i^1VBli7=k0okU4f$*?1 z`|Gy_2%GVPZgQIP7$K?E{q@(M+J`KP(@6Z9l~we261<6I_W7?_{{H#UeKFrxhvbjh zI*aN=%nbRjPdky`7^ME&jc6Y&MNowM;e+k}y2sr1flaUzpMTQbzN+#sJV>hY7|!?6 zEd2W*4sW8E{WS~nxDeZRR5<^0_W6^wdh)!@7tS1q8`iUC8aj79&0}&{5Ej|ZQEHOB zF84eyvO`>od3sDl`gpc}ToGqQT)p!$7a`vjS)KDZjVl
K5UENAb6Tp@O2vX-{Fn-#5A2bd||IQ4_BeaxXkkmYvrnep7zyb z+%^7XsNqXfTk(x!*pA`7a-D6Mr88^sin7371d%Apc^*WgN2Vq;ERQ*sX3EXl4r-d# zri}+y@40yRY<~oW2#=TMA062_I(T7~g;~Pm2 R`7uapfedz73gI9R z!7mO#Mg)=uL%<1Qg(eelZ|P`jB<@|}7iMp*Z#R!Uc=`dn8Txc=i&HqQIJy&HQ$wY! z3K1N5n15uYAmXKFdhYWAxuM3RQ}L_fD#XXKgc{of^EL@~RGW8k_|>!*|IqUw237A` z7PHi~_MN{NmTte`^M%}=XWKB=dWC&1O#{B@lMwn98^`u+)YEd2wA6OCNmT)4lw71$ zfx;t|&%n>|QSV!>zuDN1$8`S892Wo>wY)5E9DfgSPJN1JR%3yU?>?cXH~|ODPQ1>+ zg9XL_%8g*_4S&J%C|&b3)QZyMXdvB=h4ycx&;kp~4ZYDuqOZ4e3y}-ccA1W6Ci6bw zAr{o1CHOVYO;Y|Qc5$kl6UAxNY}RvY0n3J1)!BCntAmLuvCD9gGmN!){}D@~L{Ve~ z4}Y@=mDe2C>kf;SWt)_a^1aKv+^~Tz ^EpJnPgw?Qs!gMz8kKGG7O{#d^LW* zHXMx*Nu-Iiw!@M%KH_%Y1F!eGVHEUjJzh 1&uG4{Dva0>3?hq ze~=92aux~$ywn2FiRa@>PC;6M3kMMe*F3fcHZ5@hQq@=BZh&-#={qD*4#Ogv8bncc zD2&m1NmCDkO^-1k{ao&k7@`XKWNicJxA5UOEtRER{2I!vE<(XSt^gyF-K)BZ)F=`; z&Lz$`isl8Kjsvqv`imAAdxq^9Yky|@9@U)lZA4GrWKz*sPw`Qj{RUhai5V}pZ|Zm* z0_VLRL1`aFi%*B0~7@`;3z~{L-v!WLK11Z6U@gl@0G8ph{O_*`*1l~ z?)_M-Q&dX`!@2ksCUqGfkz>QX2!C|79#3HbB>K(w(VSR{%NoM4e9glOB!2_yMbh0g zXXUQ}QSn8NRBW45ClH~A>UELA)A}$~t=~9osV&%O`cZFa)i7L|z^azODKy{o_zRPI z9_rQVz9cIuy7WO!d;Q)Qn#UdX&1Xnz+f?Js(n(g6$d0jE|8jyD(aL_3X!2Y@=*eq} zFiXR_C;%oqhc79FiP=lM?SC+4Py-Y-vivpaDiU8_(TvPiqd|QIQa~Ga)t;7pr1~jg zoSf9#%cGNs;fvoW{qE|0!~%g@1}-#f!A#Vn09jB+lN?_)5@aROHaiHFtgha&8VZr0 zwWvkIEwHE4*U}#gnemijJxPo3SKD`FH9}Jx(KTHw7-|4ffW4H!#D5*Cy@mwiHi0~z z+Xh%6?-}5v-HmOzI6Y=zGR^VWckimWq7>nS#7~d}JGzLzqMj!~KNJ4Czg^>5=0h!z z+>MYP=N&0S6UYngg4{X-1QOLab1ODG1J)&EGYVtB@eZ-w3K)14JjuXX{Gyb=X2hWY zq_fTM_VP^7Khh( VMMu8@?(y^AQ?*0t^7p`_&VPeK_sY2dyps} zBR?{dSGM+|y>iWjfYx6jGzt2RVY&Wt$-nwbv~qV*ho>12>h{7;;@(Fgj#dLoDUL`f z)$R9$%bA;*2!E5{A9X5EXqCl#> OV delta 2084 zcmV+<2;29o6N?d$et)f6$#UCB487+oR5f!AtH#INXt5=;hKs@_j&tdv$d<%1MRK^v zalU@g+_YK*n4DCSxHQnf!+SvQvnWm@@pD#I(U&Axi)8lspIQF?dEfn^?5ch8*UZeK zIuSEn{`6@p(i=DRzjk-DmzE+Z!rl3W?Qh*>ZhOHh*osf-c7In@`2)}LikG5N(u@an zmGLl3QxR5imhv}vMfS$)JPIl?3%~5eel3dGKeHf@3$bY*8Y+L!K7X>7PoB4W;LLHj zZhcb?UE{8&dQ9FHghh7qu6_-9UG8{ZWc#=jN_t2{djD TeKZ(%^&dD_ z!IF0(h(vL^)apGKckgO%DV02kMxEO)RJT0lSgIkdv>lXfD@W&s{mfhsYfJ0?LWBpB zJvX-!qBP*)u1;UC9*BsJW+lol!Z~Md=*;q9*DZ_9J%8P{`t3BBg|hwHf>I=qcO13| zz+g*U{Wc5Uf_IGTiV{M-DnzhXL{VfAM_GhSpd8kPdBr89w6CMU$)%Sf0JHGRrcN7R zLL<<^QB7Q0wf-C3{ (<2EQdOf|W#O^g!w5~l!qar8m%Oa;Pjlfon`1^IbR z 2(8xZ6A676V^~|Qt&vwG S|N{KCz@gs#cKMB^PN`yi>{v1R~xWzUBI>mF;*; im9CoQ) z;@q%Zrs18T4227^pdk_<*0BU*Ew*t_nMxGLI8CT$-O}u5d@3E^Q;BVcOQt*6J9_U~ z1s}D@alLMzkhpM8h(}k`?r2`bSrJ$7B-+*bZEE>ii%nLDF1;r5ct|d%cMrF0kE@2H zvVR&Hsuys%B!r%08zkICvkn<1a>K`PX&^Pf;vCq*CV^ Nu5q4#&B>I8GRfP1TgFb{f`c*~ z+q~W_mW>dE7tHX6rWpkjspd#})n0jg#eabQNZ^Jjnfs0-HCmg}F0Np-%7sD}N>Lm@ zji=)60h^a+)fuZeWjJbV0UyZvdis`Wnwo&5mk)Uh(h9;ch$xujF%$Tq%yGcpM_?X+ zLb~BQjG~n=g|K1OJqZOZhF0xOivfIkh#_edX& F0IJg8*vvlJ z8zmnD^eYGV!9lHSvh4=Yp!$Y4v8yn-UpAqq6YfO#+BY#fL5*^5ubvd5j**;9w|vzb zQ=HdHLKSMNv-C|!Xgq0@9ja!h34c|!VGU4pnoUgWJ -EME<|vk zJHfX!Ar(;v&&*YiJM61J*0?@X#>~=4K9y`7W6|(%gj72XC1x-1)?yak-_X}d%Qs04 z8$55OxrHr9Q|t;dfJJVr9S#3w8%V|@7N0I^9%3?ei`zBbB+kC;$XJ}K)_ 2 N0HETDkTYq zH;tC@i!~lwMJQb%RUt@L)qe-V-!*qSdgZS)Y&*5Jvd?cCipb3AEUiH+lIY}(XNb*4 zPUjDTCmG}sKjFDpm$b3&=(eMKFVn|R j)H89-XC<0KA~es1dOWF*ED z4%i?+ZOoHe3q$Lvt?#sys`G6TM1op;&d}^WLLzfzX{*ob3s((D8SMpvpCFiZ%k>uv z{^&2zL%DutG9G3v!+$u*5*oR^b&3oT+ual>jSqyOK`;ODV}sT>3XXR3y!O-&k@6gQ zN)sea^bR5n7k?cm6=j~KC7RuQbTSJs>@C}3G<7N4B}7_SiDDn8axi!7Ta(ffqf9Rv z90(CHK;c*sy9(d2=)FbAuV;A#QhqXL#vI*gcmTQ-^z}?#l7G&RWqAPNnB(=({bP%x z#kX@HWg^#R)n(rnJ);@UueCGsZ$KaAsT_igx|mDhMI-jO;t<19Izvr2b)<6c&n@Nx zc;i0!DbGTObx}x`)pAi}lAqOTEG2K2tLd(Er-ttX2U|g9*8RY8iVXb&`ja~57!n?m z;>aBH;62Ik^M6G;zMP$&Ab6`Mo>axtj7;AE(FCzVo&X_@*bVyOfoK~Ba_^qW8BK_m zBBEL0@`t{{rA)~;kemsvSE6e2SUUw@JJN)E$CMdRA7x=skwvQe ;W1+=tKlXf^xUd O1ISs-Q1*ZGNV)$6B>AKO diff --git a/package_README.html b/package_README.html index d60cfd4b..e1a81389 100644 --- a/package_README.html +++ b/package_README.html @@ -7,7 +7,7 @@ - nghttp2 - HTTP/2.0 C Library — nghttp2 0.4.0-DEV documentation +nghttp2 - HTTP/2 C Library — nghttp2 0.4.0-DEV documentation @@ -53,8 +53,8 @@ - - + + @@ -81,7 +81,7 @@-
-
--nghttp2 - HTTP/2.0 C Library¶
++nghttp2 - HTTP/2 C Library¶
This is an experimental implementation of Hypertext Transfer Protocol -version 2.0.
+version 2.Development Status¶
-We started to implement h2-10 -(http://tools.ietf.org/html/draft-ietf-httpbis-http2-10) and the +
We started to implement h2-11 +(http://tools.ietf.org/html/draft-ietf-httpbis-http2-11) and the header compression -(http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-06).
+(http://tools.ietf.org/html/draft-ietf-httpbis-header-compression-07).The nghttp2 code base was forked from spdylay project.
@@ -164,25 +164,19 @@ header compression -Features -h2-10 +h2-11 HPACK-draft-06 + -HPACK-draft-07 Done Strict SETTINGS validation + -Dependency based priority Done Disallow client to push + -ALTSVC frame Done -Padding -Done -END_SEGMENT -Client, Server and Proxy programs¶
-The src directory contains HTTP/2.0 client, server and proxy programs.
+The src directory contains HTTP/2 client, server and proxy programs.
nghttp - client¶
-nghttp is a HTTP/2.0 client. It can connect to the HTTP/2.0 server +
nghttp is a HTTP/2 client. It can connect to the HTTP/2 server with prior knowledge, HTTP Upgrade and NPN/ALPN TLS extension.
It has verbose output mode for framing information. Here is sample output from nghttp client:
$ src/nghttp -nv https://localhost:8443 [ 0.004][NPN] server offers: - * h2-10 + * h2-11 * spdy/3.1 * spdy/3 * spdy/2 * http/1.1 -The negotiated protocol: h2-10 +The negotiated protocol: h2-11 [ 0.006] send SETTINGS frame <length=10, flags=0x00, stream_id=0> (niv=2) [SETTINGS_MAX_CONCURRENT_STREAMS(3):100] @@ -371,7 +365,7 @@ The negotiated protocol: h2-10 GET / HTTP/1.1 Host: localhost:8080 Connection: Upgrade, HTTP2-Settings -Upgrade: h2-10 +Upgrade: h2c-11 HTTP2-Settings: AwAAAGQEAAD__w Accept: */* User-Agent: nghttp2/0.4.0-DEV @@ -380,7 +374,7 @@ User-Agent: nghttp2/0.4.0-DEV [ 0.001] HTTP Upgrade response HTTP/1.1 101 Switching Protocols Connection: Upgrade -Upgrade: h2-10 +Upgrade: h2c-11 [ 0.001] HTTP Upgrade success @@ -426,8 +420,8 @@ Upgrade: h2-10
nghttpd is a multi-threaded static web server.
By default, it uses SSL/TLS connection. Use --no-tls option to disable it.
-nghttpd only accepts the HTTP/2.0 connection via NPN/ALPN or direct -HTTP/2.0 connection. No HTTP Upgrade is supported.
+nghttpd only accepts the HTTP/2 connection via NPN/ALPN or direct +HTTP/2 connection. No HTTP Upgrade is supported.
-p option allows users to configure server push.
Just like nghttp, it has verbose output mode for framing information. Here is sample output from nghttpd server:
@@ -481,13 +475,13 @@ IPv6: listen on port 8080nghttpx - proxy¶
nghttpx is a multi-threaded reverse proxy for -h2-10, SPDY and HTTP/1.1. It has several operation modes:
+h2-11, SPDY and HTTP/1.1. It has several operation modes:- - + + - + Mode option @@ -498,40 +492,40 @@ h2-10, SPDY and HTTP/1.1. It has several operation modes:default mode -HTTP/2.0, SPDY, HTTP/1.1 (TLS) +HTTP/2, SPDY, HTTP/1.1 (TLS) HTTP/1.1 Reverse proxy --http2-proxy -HTTP/2.0, SPDY, HTTP/1.1 (TLS) +HTTP/2, SPDY, HTTP/1.1 (TLS) HTTP/1.1 SPDY proxy --http2-bridge -HTTP/2.0, SPDY, HTTP/1.1 (TLS) -HTTP/2.0 (TLS) +HTTP/2, SPDY, HTTP/1.1 (TLS) +HTTP/2 (TLS) --client -HTTP/2.0, HTTP/1.1 -HTTP/2.0 (TLS) +HTTP/2, HTTP/1.1 +HTTP/2 (TLS) --client-proxy -HTTP/2.0, HTTP/1.1 -HTTP/2.0 (TLS) +HTTP/2, HTTP/1.1 +HTTP/2 (TLS) Forward proxy The interesting mode at the moment is the default mode. It works like -a reverse proxy and listens for h2-10, SPDY and HTTP/1.1 and -can be deployed SSL/TLS terminator for existing web server.
+a reverse proxy and listens for h2-11, SPDY and HTTP/1.1 and can +be deployed SSL/TLS terminator for existing web server.The default mode, --http2-proxy and --http2-bridge modes use SSL/TLS in the frontend connection by default. To disable SSL/TLS, use --frontend-no-tls option. If that option is used, SPDY is disabled in the frontend and incoming HTTP/1.1 connection can be upgraded to -HTTP/2.0 through HTTP Upgrade.
+HTTP/2 through HTTP Upgrade.The --http2-bridge, --client and --client-proxy modes use SSL/TLS in the backend connection by deafult. To disable SSL/TLS, use --backend-no-tls option.
@@ -541,13 +535,13 @@ sample configuration file nghttpxIn the default mode, (without any of --http2-proxy, --http2-bridge, --client-proxy and --client options), nghttpx works as reverse proxy to the backend server:
-Client <-- (HTTP/2.0, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Web Server +
Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Web Server [reverse proxy]
With --http2-proxy option, it works as so called secure proxy (aka SPDY proxy):
-Client <-- (HTTP/2.0, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy +
@@ -568,39 +562,39 @@ certificate for secure proxy.Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/1.1) --> Proxy [secure proxy] (e.g., Squid)
-$ google-chrome --proxy-pac-url=file:///path/to/proxy.pac --use-npn
With --http2-bridge, it accepts HTTP/2.0, SPDY and HTTP/1.1 -connections and communicates with backend in HTTP/2.0:
-Client <-- (HTTP/2.0, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/2.0) --> Web or HTTP/2.0 Proxy etc +
With --http2-bridge, it accepts HTTP/2, SPDY and HTTP/1.1 +connections and communicates with backend in HTTP/2:
+Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/2) --> Web or HTTP/2 Proxy etc (e.g., nghttpx -s)
With --client-proxy option, it works as forward proxy and expects -that the backend is HTTP/2.0 proxy:
-Client <-- (HTTP/2.0, HTTP/1.1) --> nghttpx <-- (HTTP/2.0) --> HTTP/2.0 Proxy +that the backend is HTTP/2 proxy: +
Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --> HTTP/2 Proxy [forward proxy] (e.g., nghttpx -s)
The Client needs to be configured to use nghttpx as forward -proxy. The frontend HTTP/1.1 connection can be upgraded to HTTP/2.0 +proxy. The frontend HTTP/1.1 connection can be upgraded to HTTP/2 through HTTP Upgrade. With the above configuration, one can use -HTTP/1.1 client to access and test their HTTP/2.0 servers.
+HTTP/1.1 client to access and test their HTTP/2 servers.With --client option, it works as reverse proxy and expects that -the backend is HTTP/2.0 Web server:
-Client <-- (HTTP/2.0, HTTP/1.1) --> nghttpx <-- (HTTP/2.0) --> Web Server +the backend is HTTP/2 Web server: +
-Client <-- (HTTP/2, HTTP/1.1) --> nghttpx <-- (HTTP/2) --> Web Server [reverse proxy]
The frontend HTTP/1.1 connection can be upgraded to HTTP/2.0 +
The frontend HTTP/1.1 connection can be upgraded to HTTP/2 through HTTP Upgrade.
-For the operation modes which talk to the backend in HTTP/2.0 over +
For the operation modes which talk to the backend in HTTP/2 over SSL/TLS, the backend connections can be tunneled through HTTP proxy. The proxy is specified using --backend-http-proxy-uri option. The following figure illustrates the example of --http2-bridge and --backend-http-proxy-uri options to talk to -the outside HTTP/2.0 proxy through HTTP proxy:
-Client <-- (HTTP/2.0, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/2.0) -- +the outside HTTP/2 proxy through HTTP proxy: +
@@ -1150,10 +1144,10 @@ BaseRequestHandler usage: diff --git a/search.html b/search.html index 3f92738c..1e7b33f5 100644 --- a/search.html +++ b/search.html @@ -87,7 +87,7 @@Client <-- (HTTP/2, SPDY, HTTP/1.1) --> nghttpx <-- (HTTP/2) -- - --===================---> HTTP/2.0 Proxy + --===================---> HTTP/2 Proxy (HTTP proxy tunnel) (e.g., nghttpx -s)
-
-
--Tutorial: HTTP/2.0 client¶
-In this tutorial, we are going to write very primitive HTTP/2.0 +
+Tutorial: HTTP/2 client¶
+In this tutorial, we are going to write very primitive HTTP/2 client. The complete source code, libevent-client.c, is attached at the end of this page. It also resides in examples directory in the archive or repository.
@@ -164,7 +164,7 @@ function main() and < library use. The one thing you should look at is setup NPN callback. The NPN callback is used for the client to select the next application protocol over the SSL/TLS transport. In this tutorial, we use -nghttp2_select_next_protocol() function to select the HTTP/2.0 +nghttp2_select_next_protocol() function to select the HTTP/2 protocol the library supports:static int select_next_proto_cb(SSL* ssl, unsigned char **out, unsigned char *outlen, @@ -197,7 +197,7 @@ protocol the library supports:
We use http2_session_data structure to store the data related to -the HTTP/2.0 session:
+the HTTP/2 session:typedef struct { nghttp2_session *session; struct evdns_base *dnsbase; @@ -317,10 +317,10 @@ 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 calls nghttp2_session_del() to delete nghttp2 session object.
-We begin HTTP/2.0 communication by sending client connection header, +
We begin HTTP/2 communication by sending client connection preface, which is 24 bytes magic byte sequence -(NGHTTP2_CLIENT_CONNECTION_HEADER) followed by SETTINGS -frame. The transmission of client connection header is done in +(NGHTTP2_CLIENT_CONNECTION_PREFACE) and SETTINGS frame. The +transmission of client connection header is done in send_client_connection_header():
static void send_client_connection_header(http2_session_data *session_data) { @@ -330,8 +330,8 @@ frame. The transmission of client connection header is done in int rv; bufferevent_write(session_data->bev, - NGHTTP2_CLIENT_CONNECTION_HEADER, - NGHTTP2_CLIENT_CONNECTION_HEADER_LEN); + NGHTTP2_CLIENT_CONNECTION_PREFACE, + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN); rv = nghttp2_submit_settings(session_data->session, NGHTTP2_FLAG_NONE, iv, ARRLEN(iv)); if(rv != 0) { @@ -365,7 +365,7 @@ request in submit_request()}; fprintf(stderr, "Request headers:\n"); print_headers(stderr, hdrs, ARRLEN(hdrs)); - rv = nghttp2_submit_request(session_data->session, NGHTTP2_PRI_DEFAULT, + rv = nghttp2_submit_request(session_data->session, NULL, hdrs, ARRLEN(hdrs), NULL, stream_data); if(rv != 0) { errx(1, "Could not submit HTTP request: %s", nghttp2_strerror(rv)); @@ -507,7 +507,7 @@ request based on priority and stream ID must be monotonically increased, the stream ID is not assigned just before transmission. The one of the purpose of this callback is get the stream ID assigned to the frame. First we check that the frame is HEADERS frame. Since -HEADERS has several meanings in HTTP/2.0, we check that it is request +HEADERS has several meanings in HTTP/2, we check that it is request HEADERS (which means that the first HEADERS frame to create a stream). The assigned stream ID is frame->hd.stream_id. Recall that we passed stream_data in the stream_user_data parameter of @@ -527,6 +527,7 @@ how to use it here. const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, + uint8_t flags, void *user_data) { http2_session_data *session_data = (http2_session_data*)user_data; @@ -611,13 +612,13 @@ is about to close: stream is going to be closed. Since we have finished to get the resource we want (or the stream was reset by RST_STREAM from the remote peer), we call nghttp2_session_terminate_session() to -commencing the closure of the HTTP/2.0 session gracefully. If you have +commencing the closure of the HTTP/2 session gracefully. If you have some data associated for the stream to be closed, you may delete it here.
libevent-client.c¶
/* - * nghttp2 - HTTP/2.0 C Library + * nghttp2 - HTTP/2 C Library * * Copyright (c) 2013 Tatsuhiro Tsujikawa * @@ -808,7 +809,7 @@ here. /* nghttp2_before_frame_send_callback: Called when nghttp2 library is about to send a frame. We use this callback to get stream ID of new - stream. Since HEADERS in HTTP/2.0 has several roles, we check that + stream. Since HEADERS in HTTP/2 has several roles, we check that it is a HTTP request HEADERS. */ static int before_frame_send_callback (nghttp2_session *session, const nghttp2_frame *frame, void *user_data) @@ -834,6 +835,7 @@ here. const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, + uint8_t flags, void *user_data) { http2_session_data *session_data = (http2_session_data*)user_data; @@ -926,7 +928,7 @@ here. } /* NPN TLS extension client callback. We check that server advertised - the HTTP/2.0 protocol the nghttp2 library supports. If not, exit + the HTTP/2 protocol the nghttp2 library supports. If not, exit the program. */ static int select_next_proto_cb(SSL* ssl, unsigned char **out, unsigned char *outlen, @@ -989,8 +991,8 @@ here. int rv; bufferevent_write(session_data->bev, - NGHTTP2_CLIENT_CONNECTION_HEADER, - NGHTTP2_CLIENT_CONNECTION_HEADER_LEN); + NGHTTP2_CLIENT_CONNECTION_PREFACE, + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN); rv = nghttp2_submit_settings(session_data->session, NGHTTP2_FLAG_NONE, iv, ARRLEN(iv)); if(rv != 0) { @@ -999,10 +1001,12 @@ here. } #define MAKE_NV(NAME, VALUE, VALUELEN) \ - { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, VALUELEN } + { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, VALUELEN, \ + NGHTTP2_NV_FLAG_NONE } #define MAKE_NV2(NAME, VALUE) \ - { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1 } + { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \ + NGHTTP2_NV_FLAG_NONE } /* Send HTTP request to the remote peer */ static void submit_request(http2_session_data *session_data) @@ -1020,7 +1024,7 @@ here. }; fprintf(stderr, "Request headers:\n"); print_headers(stderr, hdrs, ARRLEN(hdrs)); - rv = nghttp2_submit_request(session_data->session, NGHTTP2_PRI_DEFAULT, + rv = nghttp2_submit_request(session_data->session, NULL, hdrs, ARRLEN(hdrs), NULL, stream_data); if(rv != 0) { errx(1, "Could not submit HTTP request: %s", nghttp2_strerror(rv)); @@ -1206,10 +1210,10 @@ here. diff --git a/tutorial-server.html b/tutorial-server.html index 69efeea3..2054deb2 100644 --- a/tutorial-server.html +++ b/tutorial-server.html @@ -7,7 +7,7 @@ -
Tutorial: HTTP/2.0 server — nghttp2 0.4.0-DEV documentation +Tutorial: HTTP/2 server — nghttp2 0.4.0-DEV documentation @@ -54,7 +54,7 @@ - + @@ -81,7 +81,7 @@-
-
--Tutorial: HTTP/2.0 server¶
++Tutorial: HTTP/2 server¶
In this tutorial, we are going to write single-threaded, event-based -HTTP/2.0 web server, which supports HTTPS only. It can handle +HTTP/2 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 @@ -202,7 +202,7 @@ life time:
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 +identifier. In this tutorial, we advertise the HTTP/2 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 @@ -217,7 +217,7 @@ callback function is set to SSL_C
We use http2_session_data structure to store the session-level -(which corresponds to 1 HTTP/2.0 connection) data:
+(which corresponds to 1 HTTP/2 connection) data:-typedef struct http2_session_data { struct http2_stream_data root; struct bufferevent *bev; @@ -238,19 +238,20 @@ data: } http2_stream_data;
1 HTTP/2.0 session can have multiple streams. We manage these -multiple streams by intrusive doubly linked list to add and remove the -object in O(1). The first element of this list is pointed by the +
1 HTTP/2 session can have multiple streams. We manage these multiple +streams by intrusive doubly linked list to add and remove the 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 +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 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 -logical stream multiplexed over the single connection managed by -bufferevent in http2_session_data.
+when receiving first client connection preface +(NGHTTP2_CLIENT_CONNECTION_PREFACE), which is 24 bytes magic +byte string, 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 logical stream multiplexed +over the single connection managed by bufferevent in +http2_session_data.We first create listener object to accept incoming connections. We use libevent’s struct evconnlistener for this purpose:
static void start_listen(struct event_base *evbase, const char *service, @@ -340,9 +341,9 @@ it: uint8_t data[24]; struct evbuffer *input = bufferevent_get_input(session_data->bev); int readlen = evbuffer_remove(input, data, session_data->handshake_leftlen); - const char *conhead = NGHTTP2_CLIENT_CONNECTION_HEADER; + const char *conhead = NGHTTP2_CLIENT_CONNECTION_PREFACE; - if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_HEADER_LEN + if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN - session_data->handshake_leftlen, data, readlen) != 0) { delete_http2_session_data(session_data); return; @@ -366,11 +367,11 @@ it:
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 +NGHTTP2_CLIENT_CONNECTION_PREFACE. When they match, the +connection state is ready for starting HTTP/2 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 +writecb function to handle HTTP/2 communication. We describe these 2 functions later.
We initialize nghttp2 session object which is done in initialize_nghttp2_session():
@@ -568,7 +569,7 @@ of header block in HEADERS or PUSH_PROMISE frame is started: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 +frame has several roles in HTTP/2 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 @@ -673,7 +674,7 @@ file descriptor. We also set file function to read content of the file:
static ssize_t file_read_callback (nghttp2_session *session, int32_t stream_id, - uint8_t *buf, size_t length, int *eof, + uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data) { int fd = source->fd; @@ -683,17 +684,17 @@ function to read content of the file: return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; } if(r == 0) { - *eof = 1; + *data_flags |= NGHTTP2_DATA_FLAG_EOF; } return r; }
If error happens while reading file, we return -NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE. This tells the library -to send RST_STREAM to the stream. When all data is read, set 1 to -*eof to tell the nghttp2 library that we have finished reading -file.
+NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE. This tells the +library to send RST_STREAM to the stream. When all data are read, set +NGHTTP2_DATA_FLAG_EOF flag to *data_flags to tell the +nghttp2 library that we have finished reading file.The nghttp2_submit_response() is used to send response to the remote peer.
The on_stream_close_callback() function is invoked when the stream @@ -721,7 +722,7 @@ stream is about to close and we no longer use that object.
libevent-server.c¶
/* - * nghttp2 - HTTP/2.0 C Library + * nghttp2 - HTTP/2 C Library * * Copyright (c) 2013 Tatsuhiro Tsujikawa * @@ -771,7 +772,8 @@ stream is about to close and we no longer use that object. #define ARRLEN(x) (sizeof(x)/sizeof(x[0])) #define MAKE_NV(NAME, VALUE) \ - { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1 } + { (uint8_t*)NAME, (uint8_t*)VALUE, sizeof(NAME) - 1, sizeof(VALUE) - 1, \ + NGHTTP2_NV_FLAG_NONE } struct app_context; typedef struct app_context app_context; @@ -912,7 +914,7 @@ stream is about to close and we no longer use that object. (app_ctx->evbase, fd, ssl, BUFFEREVENT_SSL_ACCEPTING, BEV_OPT_CLOSE_ON_FREE | BEV_OPT_DEFER_CALLBACKS); - session_data->handshake_leftlen = NGHTTP2_CLIENT_CONNECTION_HEADER_LEN; + session_data->handshake_leftlen = NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN; rv = getnameinfo(addr, addrlen, host, sizeof(host), NULL, 0, NI_NUMERICHOST); if(rv != 0) { session_data->client_addr = strdup("(unknown)"); @@ -1049,7 +1051,7 @@ stream is about to close and we no longer use that object. static ssize_t file_read_callback (nghttp2_session *session, int32_t stream_id, - uint8_t *buf, size_t length, int *eof, + uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data) { int fd = source->fd; @@ -1059,7 +1061,7 @@ stream is about to close and we no longer use that object. return NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE; } if(r == 0) { - *eof = 1; + *data_flags |= NGHTTP2_DATA_FLAG_EOF; } return r; } @@ -1121,6 +1123,7 @@ stream is about to close and we no longer use that object. const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, + uint8_t flags, void *user_data) { http2_stream_data *stream_data; @@ -1271,7 +1274,7 @@ stream is about to close and we no longer use that object. nghttp2_session_server_new(&session_data->session, &callbacks, session_data); } -/* Send HTTP/2.0 client connection header, which includes 24 bytes +/* Send HTTP/2 client connection header, which includes 24 bytes magic octets and SETTINGS frame */ static int send_server_connection_header(http2_session_data *session_data) { @@ -1351,9 +1354,9 @@ stream is about to close and we no longer use that object. uint8_t data[24]; struct evbuffer *input = bufferevent_get_input(session_data->bev); int readlen = evbuffer_remove(input, data, session_data->handshake_leftlen); - const char *conhead = NGHTTP2_CLIENT_CONNECTION_HEADER; + const char *conhead = NGHTTP2_CLIENT_CONNECTION_PREFACE; - if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_HEADER_LEN + if(memcmp(conhead + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN - session_data->handshake_leftlen, data, readlen) != 0) { delete_http2_session_data(session_data); return; @@ -1478,7 +1481,7 @@ stream is about to close and we no longer use that object. Next - Previous + Previous
- nghttp2 - HTTP/2 C Library
nghttp2.h¶
/* - * nghttp2 - HTTP/2.0 C Library + * nghttp2 - HTTP/2 C Library * * Copyright (c) 2013, 2014 Tatsuhiro Tsujikawa * @@ -188,9 +188,10 @@ /** * @macro * - * The protocol version identification of this library supports. + * The protocol version identification string of this library + * supports. This identifier is used if HTTP/2 is used over TLS. */ -#define NGHTTP2_PROTO_VERSION_ID "h2-10" +#define NGHTTP2_PROTO_VERSION_ID "h2-11" /** * @macro * @@ -198,11 +199,27 @@ */ #define NGHTTP2_PROTO_VERSION_ID_LEN 5 +/** + * @macro + * + * The protocol version identification string of this library + * supports. This identifier is used if HTTP/2 is used over cleartext + * TCP. + */ +#define NGHTTP2_CLEARTEXT_PROTO_VERSION_ID "h2c-11" + +/** + * @macro + * + * The length of :macro:`NGHTTP2_CLEARTEXT_PROTO_VERSION_ID`. + */ +#define NGHTTP2_CLEARTEXT_PROTO_VERSION_ID_LEN 6 + struct nghttp2_session; /** * @struct * - * The primary structure to hold the resources needed for a HTTP/2.0 + * The primary structure to hold the resources needed for a HTTP/2 * session. The details of this structure are intentionally hidden * from the public API. */ @@ -247,15 +264,23 @@ /** * @macro * - * The default priority value + * The default weight of priority group. */ -#define NGHTTP2_PRI_DEFAULT (1 << 30) +#define NGHTTP2_DEFAULT_WEIGHT 16 + /** * @macro * - * The lowest priority value + * The maximum weight of priority group. */ -#define NGHTTP2_PRI_LOWEST ((1U << 31) - 1) +#define NGHTTP2_MAX_WEIGHT 256 + +/** + * @macro + * + * The minimum weight of priority group. + */ +#define NGHTTP2_MIN_WEIGHT 1 /** * @macro @@ -284,18 +309,36 @@ */ #define NGHTTP2_MAX_HEADER_TABLE_SIZE (1 << 16) + /** * @macro * - * The client connection header. + * The client connection preface. */ -#define NGHTTP2_CLIENT_CONNECTION_HEADER "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" +#define NGHTTP2_CLIENT_CONNECTION_PREFACE "PRI * HTTP/2.0\r\n\r\nSM\r\n\r\n" + +/** + * @macro + * + * The length of :macro:`NGHTTP2_CLIENT_CONNECTION_PREFACE`. + */ +#define NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN 24 + +/** + * @macro + * + * The client connection header. This macro is obsoleted by + * NGHTTP2_CLIENT_CONNECTION_PREFACE. + */ +#define NGHTTP2_CLIENT_CONNECTION_HEADER NGHTTP2_CLIENT_CONNECTION_PREFACE + /** * @macro * * The length of :macro:`NGHTTP2_CLIENT_CONNECTION_HEADER`. */ -#define NGHTTP2_CLIENT_CONNECTION_HEADER_LEN 24 +#define NGHTTP2_CLIENT_CONNECTION_HEADER_LEN \ + NGHTTP2_CLIENT_CONNECTION_PREFACE_LEN /** * @enum @@ -429,6 +472,11 @@ */ NGHTTP2_ERR_PUSH_DISABLED = -528, /** + * DATA frame for a given stream has been already submitted and has + * not been fully processed yet. + */ + NGHTTP2_ERR_DATA_EXIST = -529, + /** * The errors < :enum:`NGHTTP2_ERR_FATAL` mean that the library is * under unexpected condition and cannot process any further data * reliably (e.g., out of memory). @@ -448,6 +496,22 @@ NGHTTP2_MSG_MORE } nghttp2_io_flag; +/** + * @enum + * + * The flags for header field name/value pair. + */ +typedef enum { + /** + * No flag set. + */ + NGHTTP2_NV_FLAG_NONE = 0, + /** + * Indicates that this name/value pair must not be indexed. + */ + NGHTTP2_NV_FLAG_NO_INDEX = 0x1 +} nghttp2_nv_flag; + /** * @struct * @@ -472,11 +536,15 @@ * The length of the |value|. */ uint16_t valuelen; + /** + * Bitwise OR of one or more of :type:`nghttp2_nv_flag`. + */ + uint8_t flags; } nghttp2_nv; /** * @enum - * The control frame types in HTTP/2.0. + * The control frame types in HTTP/2. */ typedef enum { /** @@ -486,45 +554,49 @@ /** * The HEADERS frame. */ - NGHTTP2_HEADERS = 1, + NGHTTP2_HEADERS = 0x01, /** * The PRIORITY frame. */ - NGHTTP2_PRIORITY = 2, + NGHTTP2_PRIORITY = 0x02, /** * The RST_STREAM frame. */ - NGHTTP2_RST_STREAM = 3, + NGHTTP2_RST_STREAM = 0x03, /** * The SETTINGS frame. */ - NGHTTP2_SETTINGS = 4, + NGHTTP2_SETTINGS = 0x04, /** * The PUSH_PROMISE frame. */ - NGHTTP2_PUSH_PROMISE = 5, + NGHTTP2_PUSH_PROMISE = 0x05, /** * The PING frame. */ - NGHTTP2_PING = 6, + NGHTTP2_PING = 0x06, /** * The GOAWAY frame. */ - NGHTTP2_GOAWAY = 7, + NGHTTP2_GOAWAY = 0x07, /** * The WINDOW_UPDATE frame. */ - NGHTTP2_WINDOW_UPDATE = 8, + NGHTTP2_WINDOW_UPDATE = 0x08, /** * The CONTINUATION frame. */ - NGHTTP2_CONTINUATION = 9 + NGHTTP2_CONTINUATION = 0x09, + /** + * The ALTSVC frame. + */ + NGHTTP2_ALTSVC = 0x0a } nghttp2_frame_type; /** * @enum * - * The flags for HTTP/2.0 frames. This enum defines all flags for + * The flags for HTTP/2 frames. This enum defines all flags for * frames, assuming that the same flag name has the same mask. */ typedef enum { @@ -535,31 +607,35 @@ /** * The END_STREAM flag. */ - NGHTTP2_FLAG_END_STREAM = 0x1, + NGHTTP2_FLAG_END_STREAM = 0x01, /** * The END_HEADERS flag. */ - NGHTTP2_FLAG_END_HEADERS = 0x4, - /** - * The PRIORITY flag. - */ - NGHTTP2_FLAG_PRIORITY = 0x8, + NGHTTP2_FLAG_END_HEADERS = 0x04, /** * The ACK flag. */ - NGHTTP2_FLAG_ACK = 0x1, + NGHTTP2_FLAG_ACK = 0x01, /** * The END_SEGMENT flag. */ - NGHTTP2_FLAG_END_SEGMENT = 0x2, + NGHTTP2_FLAG_END_SEGMENT = 0x02, /** * The PAD_LOW flag. */ - NGHTTP2_FLAG_PAD_LOW = 0x10, + NGHTTP2_FLAG_PAD_LOW = 0x08, /** * The PAD_HIGH flag. */ - NGHTTP2_FLAG_PAD_HIGH = 0x20 + NGHTTP2_FLAG_PAD_HIGH = 0x10, + /** + * The PRIORITY_GROUP flag. + */ + NGHTTP2_FLAG_PRIORITY_GROUP = 0x20, + /** + * The PRIORITY_DEPENDENCY flag. + */ + NGHTTP2_FLAG_PRIORITY_DEPENDENCY = 0x40 } nghttp2_flag; /** @@ -695,6 +771,23 @@ void *ptr; } nghttp2_data_source; +/** + * @enum + * + * The flags used to set in |data_flags| output parameter in + * :type:`nghttp2_data_source_read_callback`. + */ +typedef enum { + /** + * No flag set. + */ + NGHTTP2_DATA_FLAG_NONE = 0, + /** + * Indicates EOF was sensed. + */ + NGHTTP2_DATA_FLAG_EOF = 0x01 +} nghttp2_data_flag; + /** * @functypedef * @@ -703,21 +796,22 @@ * implementation of this function must read at most |length| bytes of * data from |source| (or possibly other places) and store them in * |buf| and return number of data stored in |buf|. If EOF is reached, - * set |*eof| to 1. If the application wants to postpone DATA frames, - * (e.g., asynchronous I/O, or reading data blocks for long time), it - * is achieved by returning :enum:`NGHTTP2_ERR_DEFERRED` without - * reading any data in this invocation. The library removes DATA - * frame from the outgoing queue temporarily. To move back deferred - * DATA frame to outgoing queue, call `nghttp2_session_resume_data()`. - * In case of error, there are 2 choices. Returning - * :enum:`NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` will close the stream - * by issuing RST_STREAM with :enum:`NGHTTP2_INTERNAL_ERROR`. - * Returning :enum:`NGHTTP2_ERR_CALLBACK_FAILURE` will signal the - * entire session failure. + * set :enum:`NGHTTP2_DATA_FLAG_EOF` flag in |*data_falgs|. If the + * application wants to postpone DATA frames, (e.g., asynchronous I/O, + * or reading data blocks for long time), it is achieved by returning + * :enum:`NGHTTP2_ERR_DEFERRED` without reading any data in this + * invocation. The library removes DATA frame from the outgoing queue + * temporarily. To move back deferred DATA frame to outgoing queue, + * call `nghttp2_session_resume_data()`. In case of error, there are + * 2 choices. Returning :enum:`NGHTTP2_ERR_TEMPORAL_CALLBACK_FAILURE` + * will close the stream by issuing RST_STREAM with + * :enum:`NGHTTP2_INTERNAL_ERROR`. Returning + * :enum:`NGHTTP2_ERR_CALLBACK_FAILURE` will signal the entire session + * failure. */ typedef ssize_t (*nghttp2_data_source_read_callback) (nghttp2_session *session, int32_t stream_id, - uint8_t *buf, size_t length, int *eof, + uint8_t *buf, size_t length, uint32_t *data_flags, nghttp2_data_source *source, void *user_data); /** @@ -756,7 +850,7 @@ * @enum * * The category of HEADERS, which indicates the role of the frame. In - * HTTP/2.0 spec, request, response, push response and other arbitrary + * HTTP/2 spec, request, response, push response and other arbitrary * headers (e.g., trailers) are all called just HEADERS. To give the * application the role of incoming HEADERS frame, we define several * categories. @@ -784,6 +878,95 @@ NGHTTP2_HCAT_HEADERS = 3 } nghttp2_headers_category; +/** + * @enum + * + * The type of priority specified in :type:`nghttp2_priority_spec`. + */ +typedef enum { + /** + * No priority is given. The default priority will be used. + */ + NGHTTP2_PRIORITY_TYPE_NONE = 0, + /** + * Priority group ID and its weight are specified. + */ + NGHTTP2_PRIORITY_TYPE_GROUP = 1, + /** + * The stream ID of a stream to depend on and its exclusive flag is + * specified. + */ + NGHTTP2_PRIORITY_TYPE_DEP = 2 +} nghttp2_priority_type; + +/** + * @struct + * + * This structure stores priority group ID and its weight. + */ +typedef struct { + /** + * The priority group ID + */ + int32_t pri_group_id; + /** + * The weight of the priority group + */ + int32_t weight; +} nghttp2_priority_group; + +/** + * @struct + * + * This structure stores stream ID of the stream to depend on and its + * dependency is exclusive or not. + */ +typedef struct { + /** + * The stream ID of the stream to depend on. + */ + int32_t stream_id; + /** + * nonzero means exclusive dependency + */ + uint8_t exclusive; +} nghttp2_priority_dep; + +/** + * @struct + * + * The structure to specify stream dependency. To specify stream + * dependency, specify |pri_type| and fill the |group| or |dep| member + * according to |pri_type|. + */ +typedef struct { + /** + * Type of priority specification. If |pri_type| is + * :enum:`NGHTTP2_PRIORITY_TYPE_GROUP`, fill |group|. If |pri_type| + * is :enum:`NGHTTP2_PRIORITY_TYPE_DEP`, fill |dep|. If |pri_type| + * is :enum:`NGHTTP2_PRIORITY_TYPE_NONE`, the other data members are + * ignored and it means that default priority group ID (which is + * same as the stream ID) and default weight + * :macro:`NGHTTP2_DEFAULT_WEIGHT` are specified. + */ + nghttp2_priority_type pri_type; + + union { + /** + * Specify priority group ID and its weight. This field is + * interpreted only when |pri_type| member is + * :enum:`NGHTTP2_PRIORITY_TYPE_GROUP`. + */ + nghttp2_priority_group group; + /** + * Specify stream ID of a stream to depend on and exclusive flag. + * This field is interpreted only when |pri_type| member is + * :enum:`NGHTTP2_PRIORITY_TYPE_DEP`. + */ + nghttp2_priority_dep dep; + } spec; +} nghttp2_priority_spec; + /** * @struct * The HEADERS frame. It has the following members: @@ -799,6 +982,10 @@ */ size_t padlen; /** + * The priority specification + */ + nghttp2_priority_spec pri_spec; + /** * The name/value pairs. */ nghttp2_nv *nva; @@ -810,10 +997,6 @@ * The category of this HEADERS frame. */ nghttp2_headers_category cat; - /** - * The priority. - */ - int32_t pri; } nghttp2_headers; /** @@ -826,9 +1009,9 @@ */ nghttp2_frame_hd hd; /** - * The priority. + * The priority specification. */ - int32_t pri; + nghttp2_priority_spec pri_spec; } nghttp2_priority; /** @@ -966,6 +1149,50 @@ int32_t window_size_increment; } nghttp2_window_update; +/** + * @struct + * + * The ALTSVC frame. It has following members: + */ +typedef struct { + /** + * The frame header. + */ + nghttp2_frame_hd hd; + /** + * Protocol ID + */ + uint8_t *protocol_id; + /** + * Host + */ + uint8_t *host; + /** + * Origin + */ + uint8_t *origin; + /** + * The length of |protocol_id| + */ + size_t protocol_id_len; + /** + * The length of |host| + */ + size_t host_len; + /** + * The length of |origin| + */ + size_t origin_len; + /** + * Max-Age + */ + uint32_t max_age; + /** + * Port + */ + uint16_t port; +} nghttp2_altsvc; + /** * @union * @@ -1014,6 +1241,10 @@ * The WINDOW_UPDATE frame. */ nghttp2_window_update window_update; + /** + * The ALTSVC frame. + */ + nghttp2_altsvc altsvc; } nghttp2_frame; /** @@ -1275,12 +1506,19 @@ * @functypedef * * Callback function invoked when a header name/value pair is received - * for the |frame|. When this callback is invoked, ``frame->hd.type`` - * is either :enum:`NGHTTP2_HEADERS` or :enum:`NGHTTP2_PUSH_PROMISE`. - * After all header name/value pairs are processed with this callback, - * and no error has been detected, - * :type:`nghttp2_on_frame_recv_callback` will be invoked. If there - * is an error in decompression, + * for the |frame|. The |name| of length |namelen| is header name. + * The |value| of length |valuelen| is header value. The |flags| is + * bitwise OR of one or more of :type:`nghttp2_nv_flag`. + * + * If :enum:`NGHTTP2_NV_FLAG_NO_INDEX` is set in |flags|, the receiver + * must not index this name/value pair when forwarding it to the next + * hop. + * + * When this callback is invoked, ``frame->hd.type`` is either + * :enum:`NGHTTP2_HEADERS` or :enum:`NGHTTP2_PUSH_PROMISE`. After all + * header name/value pairs are processed with this callback, and no + * error has been detected, :type:`nghttp2_on_frame_recv_callback` + * will be invoked. If there is an error in decompression, * :type:`nghttp2_on_frame_recv_callback` for the |frame| will not be * invoked. * @@ -1330,6 +1568,7 @@ const nghttp2_frame *frame, const uint8_t *name, size_t namelen, const uint8_t *value, size_t valuelen, + uint8_t flags, void *user_data); /** @@ -1426,6 +1665,84 @@ nghttp2_select_padding_callback select_padding_callback; } nghttp2_session_callbacks; +struct nghttp2_option; + +/** + * @struct + * + * Configuration options for :type:`nghttp2_session`. The details of + * this structure are intentionally hidden from the public API. + */ +typedef struct nghttp2_option nghttp2_option; + +/** + * @function + * + * Initializes |*option_ptr| with default values. + * + * When the application finished using this object, it can use + * `nghttp2_option_del()` to free its memory. + * + * This function returns 0 if it succeeds, or one of the following + * negative error codes: + * + * :enum:`NGHTTP2_ERR_NOMEM` + * Out of memory. + */ +int nghttp2_option_new(nghttp2_option **option_ptr); + +/** + * @function + * + * Frees any resources allocated for |option|. If |option| is + * ``NULL``, this function does nothing. + */ +void nghttp2_option_del(nghttp2_option *option); + +/** + * @function + * + * This option prevents the library from sending WINDOW_UPDATE for a + * stream automatically. If this option is set to nonzero, the + * library won't send WINDOW_UPDATE for a stream and the application + * is responsible for sending WINDOW_UPDATE using + * `nghttp2_submit_window_update`. By default, this option is set to + * zero. + */ +void nghttp2_option_set_no_auto_stream_window_update(nghttp2_option *option, + int val); + +/** + * @function + * + * This option prevents the library from sending WINDOW_UPDATE for a + * connection automatically. If this option is set to nonzero, the + * library won't send WINDOW_UPDATE for a connection and the + * application is responsible for sending WINDOW_UPDATE with stream + * ID 0 using `nghttp2_submit_window_update`. By default, this + * option is set to zero. + */ +void nghttp2_option_set_no_auto_connection_window_update +(nghttp2_option *option, int val); + +/** + * @function + * + * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of + * remote endpoint as if it is received in SETTINGS frame. Without + * specifying this option, before the local endpoint receives + * SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote + * endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may + * cause problem if local endpoint submits lots of requests + * initially and sending them at once to the remote peer may lead to + * the rejection of some requests. Specifying this option to the + * sensible value, say 100, may avoid this kind of issue. This value + * will be overwritten if the local endpoint receives + * SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint. + */ +void nghttp2_option_set_peer_max_concurrent_streams(nghttp2_option *option, + uint32_t val); + /** * @function * @@ -1472,80 +1789,20 @@ const nghttp2_session_callbacks *callbacks, void *user_data); -/** - * @enum - * - * Configuration options for :type:`nghttp2_session`. - */ -typedef enum { - /** - * This option prevents the library from sending WINDOW_UPDATE for a - * stream automatically. If this option is set to nonzero, the - * library won't send WINDOW_UPDATE for a stream and the application - * is responsible for sending WINDOW_UPDATE using - * `nghttp2_submit_window_update`. By default, this option is set to - * zero. - */ - NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE = 1, - /** - * This option prevents the library from sending WINDOW_UPDATE for a - * connection automatically. If this option is set to nonzero, the - * library won't send WINDOW_UPDATE for a connection and the - * application is responsible for sending WINDOW_UPDATE with stream - * ID 0 using `nghttp2_submit_window_update`. By default, this - * option is set to zero. - */ - NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE = 1 << 1, - /** - * This option sets the SETTINGS_MAX_CONCURRENT_STREAMS value of - * remote endpoint as if it is received in SETTINGS frame. Without - * specifying this option, before the local endpoint receives - * SETTINGS_MAX_CONCURRENT_STREAMS in SETTINGS frame from remote - * endpoint, SETTINGS_MAX_CONCURRENT_STREAMS is unlimited. This may - * cause problem if local endpoint submits lots of requests - * initially and sending them at once to the remote peer may lead to - * the rejection of some requests. Specifying this option to the - * sensible value, say 100, may avoid this kind of issue. This value - * will be overwritten if the local endpoint receives - * SETTINGS_MAX_CONCURRENT_STREAMS from the remote endpoint. - */ - NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS = 1 << 2 -} nghttp2_opt; - -/** - * @struct - * - * Struct to store option values for nghttp2_session. - */ -typedef struct { - /** - * :enum:`NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS` - */ - uint32_t peer_max_concurrent_streams; - /** - * :enum:`NGHTTP2_OPT_NO_AUTO_STREAM_WINDOW_UPDATE` - */ - uint8_t no_auto_stream_window_update; - /** - * :enum:`NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE` - */ - uint8_t no_auto_connection_window_update; -} nghttp2_opt_set; - /** * @function * * Like `nghttp2_session_client_new()`, but with additional options - * specified in the |opt_set|. The caller must set bitwise-OR of - * :enum:`nghttp2_opt` for given options. For example, if it - * specifies :enum:`NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE` and - * :enum:`NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS` in the |opt_set|, - * the |opt_set_mask| should be - * ``NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE | - * NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS``. + * specified in the |option|. * - * If the |opt_set_mask| is 0, the |opt_set| could be ``NULL`` safely - * and the call is equivalent to `nghttp2_session_client_new()`. + * The |option| can be ``NULL`` and the call is equivalent to + * `nghttp2_session_client_new()`. + * + * This function does not take ownership |option|. The application is + * responsible for freeing |option| if it finishes using the object. + * + * The library code does not refer to |option| after this function + * returns. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1556,23 +1813,22 @@ int nghttp2_session_client_new2(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, - uint32_t opt_set_mask, - const nghttp2_opt_set *opt_set); + const nghttp2_option *option); /** * @function * * Like `nghttp2_session_server_new()`, but with additional options - * specified in the |opt_set|. The caller must set bitwise-OR of - * :enum:`nghttp2_opt` for given options. For example, if it - * specifies :enum:`NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE` and - * :enum:`NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS` in the |opt_set|, - * the |opt_set_mask| should be - * ``NGHTTP2_OPT_NO_AUTO_CONNECTION_WINDOW_UPDATE | - * NGHTTP2_OPT_PEER_MAX_CONCURRENT_STREAMS``. + * specified in the |option|. * - * If the |opt_set_mask| is 0, the |opt_set| could be ``NULL`` safely - * and the call is equivalent to `nghttp2_session_server_new()`. + * The |option| can be ``NULL`` and the call is equivalent to + * `nghttp2_session_server_new()`. + * + * This function does not take ownership |option|. The application is + * responsible for freeing |option| if it finishes using the object. + * + * The library code does not refer to |option| after this function + * returns. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -1583,8 +1839,7 @@ int nghttp2_session_server_new2(nghttp2_session **session_ptr, const nghttp2_session_callbacks *callbacks, void *user_data, - uint32_t opt_set_mask, - const nghttp2_opt_set *opt_set); + const nghttp2_option *option); /** * @function @@ -1781,7 +2036,8 @@ * negative error codes: * * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The stream does not exist or no deferred data exist. + * The stream does not exist; or no deferred data exist; or data + * was deferred by flow control. * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ @@ -1916,6 +2172,18 @@ int32_t nghttp2_session_get_effective_local_window_size (nghttp2_session *session); +/** + * @function + * + * Returns the remote window size for a given stream |stream_id|. + * This is the amount of flow-controlled payload (e.g., DATA) that the + * local endpoint can send without WINDOW_UPDATE. + * + * This function returns -1 if it fails. + */ +int32_t nghttp2_session_get_stream_remote_window_size(nghttp2_session* session, + int32_t stream_id); + /** * @function * @@ -1977,10 +2245,7 @@ * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` * The |settings_payload| is badly formed. * :enum:`NGHTTP2_ERR_PROTO` - * The stream ID 1 is already used or closed; or is not available; - * or the |settings_payload| does not include both - * :enum:`NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS` and - * :enum:`NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE`. + * The stream ID 1 is already used or closed; or is not available. */ int nghttp2_session_upgrade(nghttp2_session *session, const uint8_t *settings_payload, @@ -2021,13 +2286,47 @@ */ const char* nghttp2_strerror(int lib_error_code); +/** + * @function + * + * Initializes |pri_spec| with priority group ID |pri_group_id| and + * its weight |weight|. + * + * The |weight| must be in [:enum:`NGHTTP2_MIN_WEIGHT`, + * :enum:`NGHTTP2_MAX_WEIGHT`], inclusive. If |weight| is strictly + * less than :enum:`NGHTTP2_MIN_WEIGHT`, it becomes + * :enum:`NGHTTP2_MIN_WEIGHT`. If it is strictly greater than + * :enum:`NGHTTP2_MAX_WEIGHT`, it becomes :enum:`NGHTTP2_MAX_WEIGHT`. + * + * To specify weight for the default priority group (which is the same + * as the stream ID of the stream) in `nghttp2_submit_request()` and + * `nghttp2_submit_headers()` and its stream ID is not known in + * advance, specify -1 to |pri_group_id|. + */ +void nghttp2_priority_spec_group_init(nghttp2_priority_spec *pri_spec, + int32_t pri_group_id, int32_t weight); + +/** + * @function + * + * Initializes |pri_spec| with the |stream_id| of the stream to depend + * on and its exclusive flag. If |exclusive| is nonzero, exclusive + * flag is set. + */ +void nghttp2_priority_spec_dep_init(nghttp2_priority_spec *pri_spec, + int32_t stream_id, int exclusive); + /** * @function * * Submits HEADERS frame and optionally one or more DATA frames. * - * The |pri| is priority of this request. 0 is the highest priority - * value and :macro:`NGHTTP2_PRI_LOWEST` is the lowest value. + * The |pri_spec| is priority specification of this request. ``NULL`` + * means the default priority (priority group ID becomes its stream ID + * and weight is :macro:`NGHTTP2_DEFAULT_WEIGHT`). To specify the + * priority, use either `nghttp2_priority_spec_group_init()` or + * `nghttp2_priority_spec_dep_init()`. If |pri_spec| is not ``NULL``, + * this function will copy its data members. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The value is opaque sequence of bytes and @@ -2036,7 +2335,7 @@ * appearing in different header fields, it has to concatenate them * using NULL byte (0x0) before passing them to this function. * - * HTTP/2.0 specification has requirement about header fields in the + * HTTP/2 specification has requirement about header fields in the * request HEADERS. See the specification for more details. * * This function creates copies of all name/value pairs in |nva|. It @@ -2055,7 +2354,7 @@ * `nghttp2_session_get_stream_user_data()`. * * Since the library reorders the frames and tries to send the highest - * prioritized one first and the HTTP/2.0 specification requires the + * prioritized one first and the HTTP/2 specification requires the * stream ID must be strictly increasing, the stream ID of this * request cannot be known until it is about to sent. To know the * stream ID of the request, the application can use @@ -2069,12 +2368,11 @@ * This function returns 0 if it succeeds, or one of the following * negative error codes: * - * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |pri| is invalid * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ -int nghttp2_submit_request(nghttp2_session *session, int32_t pri, +int nghttp2_submit_request(nghttp2_session *session, + const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, const nghttp2_data_provider *data_prd, void *stream_user_data); @@ -2092,7 +2390,7 @@ * appearing in different header fields, it has to concatenate them * using NULL byte (0x0) before passing them to this function. * - * HTTP/2.0 specification has requirement about header fields in the + * HTTP/2 specification has requirement about header fields in the * response HEADERS. See the specification for more details. * * This function creates copies of all name/value pairs in |nva|. It @@ -2128,7 +2426,6 @@ * following values: * * * :enum:`NGHTTP2_FLAG_END_STREAM` - * * :enum:`NGHTTP2_FLAG_PRIORITY` * * If |flags| includes :enum:`NGHTTP2_FLAG_END_STREAM`, this frame has * END_STREAM flag set. @@ -2142,7 +2439,12 @@ * actual stream ID is assigned just before the frame is sent. For * response, specify stream ID in |stream_id|. * - * The |pri| is priority of this request. + * The |pri_spec| is priority specification of this request. ``NULL`` + * means the default priority (priority group ID becomes its stream ID + * and weight is :macro:`NGHTTP2_DEFAULT_WEIGHT`). To specify the + * priority, use either `nghttp2_priority_spec_group_init()` or + * `nghttp2_priority_spec_dep_init()`. If |pri_spec| is not ``NULL``, + * this function will copy its data members. * * The |nva| is an array of name/value pair :type:`nghttp2_nv` with * |nvlen| elements. The value is opaque sequence of bytes and @@ -2166,13 +2468,12 @@ * This function returns 0 if it succeeds, or one of the following * negative error codes: * - * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` - * The |pri| is invalid * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ int nghttp2_submit_headers(nghttp2_session *session, uint8_t flags, - int32_t stream_id, int32_t pri, + int32_t stream_id, + const nghttp2_priority_spec *pri_spec, const nghttp2_nv *nva, size_t nvlen, void *stream_user_data); @@ -2193,6 +2494,8 @@ * * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. + * :enum:`NGHTTP2_ERR_DATA_EXIST` + * DATA has been already submitted and not fully processed yet. */ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags, int32_t stream_id, @@ -2202,21 +2505,28 @@ * @function * * Submits PRIORITY frame to change the priority of stream |stream_id| - * to the priority value |pri|. + * to the priority specification |pri_spec|. * * The |flags| is currently ignored and should be * :enum:`NGHTTP2_FLAG_NONE`. * + * The |pri_spec| is priority specification of this request. ``NULL`` + * is not allowed for this function. To specify the priority, use + * either `nghttp2_priority_spec_group_init()` or + * `nghttp2_priority_spec_dep_init()`. This function will copy its + * data members. + * * 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_INVALID_ARGUMENT` - * The |pri| is negative. + * The |pri_spec| is NULL; or trying to depend on itself. */ int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags, - int32_t stream_id, int32_t pri); + int32_t stream_id, + const nghttp2_priority_spec *pri_spec); /** * @function @@ -2263,6 +2573,10 @@ * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` * The |iv| contains invalid value (e.g., initial window size * strictly greater than (1 << 31) - 1. + * :enum:`NGHTTP2_ERR_TOO_MANY_INFLIGHT_SETTINGS` + * There is already another in-flight SETTINGS. Note that the + * current implementation only allows 1 in-flight SETTINGS frame + * without ACK flag set. * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. */ @@ -2299,7 +2613,7 @@ * :type:`nghttp2_on_frame_send_callback` of this frame. * * Since the library reorders the frames and tries to send the highest - * prioritized one first and the HTTP/2.0 specification requires the + * prioritized one first and the HTTP/2 specification requires the * stream ID must be strictly increasing, the promised stream ID * cannot be known until it is about to sent. To know the promised * stream ID, the application can use @@ -2365,10 +2679,12 @@ * * :enum:`NGHTTP2_ERR_NOMEM` * Out of memory. + * NGHTTP2_ERR_INVALID_ARGUMENT + * The |opaque_data_len| is too large. */ int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags, nghttp2_error_code error_code, - uint8_t *opaque_data, size_t opaque_data_len); + const uint8_t *opaque_data, size_t opaque_data_len); /** * @function @@ -2407,6 +2723,43 @@ int32_t stream_id, int32_t window_size_increment); +/** + * @function + * + * Submits ALTSVC frame with given parameters. + * + * The |flags| is currently ignored and should be + * :enum:`NGHTTP2_FLAG_NONE`. + * + * Only the server can send the ALTSVC frame. If |session| is + * initialized as client, this function fails and returns + * :enum:`NGHTTP2_ERR_INVALID_STATE`. + * + * If the |protocol_id_len| is 0, the |protocol_id| could be ``NULL``. + * + * If the |host_len| is 0, the |host| could be ``NULL``. + * + * If the |origin_len| is 0, the |origin| could be ``NULL``. + * + * 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_INVALID_STATE` + * The function is invoked with |session| which was initialized as + * client. + * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` + * The combined length of |protocol_id_len|, |host_len| and + * |origin_len| is is too large. + */ +int nghttp2_submit_altsvc(nghttp2_session *session, uint8_t flags, + int32_t stream_id, + uint32_t max_age, uint16_t port, + const uint8_t *protocol_id, size_t protocol_id_len, + const uint8_t *host, size_t host_len, + const uint8_t *origin, size_t origin_len); + /** * @function * @@ -2434,7 +2787,7 @@ * * The selection algorithm is as follows: * - * 1. If peer's list contains HTTP/2.0 protocol the library supports, + * 1. If peer's list contains HTTP/2 protocol the library supports, * it is selected and returns 1. The following step is not taken. * * 2. If peer's list contains ``http/1.1``, this function selects diff --git a/nghttp2ver.h.html b/nghttp2ver.h.html index 0084363f..e15bd3b0 100644 --- a/nghttp2ver.h.html +++ b/nghttp2ver.h.html @@ -80,7 +80,7 @@
-
-
- nghttp2 - HTTP/2 C Library
-
-
- nghttp2 - HTTP/2 C Library