• Home
  • Raw
  • Download

Lines Matching refs:session

47 session_is_outgoing_concurrent_streams_max(nghttp2_session *session) {  in session_is_outgoing_concurrent_streams_max()  argument
48 return session->remote_settings.max_concurrent_streams <= in session_is_outgoing_concurrent_streams_max()
49 session->num_outgoing_streams; in session_is_outgoing_concurrent_streams_max()
58 session_is_incoming_concurrent_streams_max(nghttp2_session *session) { in session_is_incoming_concurrent_streams_max() argument
59 return session->local_settings.max_concurrent_streams <= in session_is_incoming_concurrent_streams_max()
60 session->num_incoming_streams; in session_is_incoming_concurrent_streams_max()
69 session_is_incoming_concurrent_streams_pending_max(nghttp2_session *session) { in session_is_incoming_concurrent_streams_pending_max() argument
70 return session->pending_local_max_concurrent_stream <= in session_is_incoming_concurrent_streams_pending_max()
71 session->num_incoming_streams; in session_is_incoming_concurrent_streams_pending_max()
85 static int session_enforce_http_messaging(nghttp2_session *session) { in session_enforce_http_messaging() argument
86 return (session->opt_flags & NGHTTP2_OPTMASK_NO_HTTP_MESSAGING) == 0; in session_enforce_http_messaging()
92 static int session_trailer_headers(nghttp2_session *session, in session_trailer_headers() argument
98 if (session->server) { in session_trailer_headers()
107 static int state_reserved_remote(nghttp2_session *session, in state_reserved_remote() argument
110 !nghttp2_session_is_my_stream_id(session, stream->stream_id); in state_reserved_remote()
114 static int state_reserved_local(nghttp2_session *session, in state_reserved_local() argument
117 nghttp2_session_is_my_stream_id(session, stream->stream_id); in state_reserved_local()
124 static int session_is_new_peer_stream_id(nghttp2_session *session, in session_is_new_peer_stream_id() argument
127 !nghttp2_session_is_my_stream_id(session, stream_id) && in session_is_new_peer_stream_id()
128 session->last_recv_stream_id < stream_id; in session_is_new_peer_stream_id()
131 static int session_detect_idle_stream(nghttp2_session *session, in session_detect_idle_stream() argument
134 if (nghttp2_session_is_my_stream_id(session, stream_id)) { in session_detect_idle_stream()
135 if (session->last_sent_stream_id < stream_id) { in session_detect_idle_stream()
140 if (session_is_new_peer_stream_id(session, stream_id)) { in session_detect_idle_stream()
150 static int session_call_error_callback(nghttp2_session *session, in session_call_error_callback() argument
159 if (!session->callbacks.error_callback && in session_call_error_callback()
160 !session->callbacks.error_callback2) { in session_call_error_callback()
164 mem = &session->mem; in session_call_error_callback()
194 if (session->callbacks.error_callback2) { in session_call_error_callback()
195 rv = session->callbacks.error_callback2(session, lib_error_code, buf, in session_call_error_callback()
196 (size_t)rv, session->user_data); in session_call_error_callback()
198 rv = session->callbacks.error_callback(session, buf, (size_t)rv, in session_call_error_callback()
199 session->user_data); in session_call_error_callback()
211 static int session_terminate_session(nghttp2_session *session, in session_terminate_session() argument
218 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) { in session_terminate_session()
224 session->iframe.state = NGHTTP2_IB_IGN_ALL; in session_terminate_session()
234 rv = nghttp2_session_add_goaway(session, last_stream_id, error_code, in session_terminate_session()
242 session->goaway_flags |= NGHTTP2_GOAWAY_TERM_ON_SEND; in session_terminate_session()
247 int nghttp2_session_terminate_session(nghttp2_session *session, in nghttp2_session_terminate_session() argument
249 return session_terminate_session(session, session->last_proc_stream_id, in nghttp2_session_terminate_session()
253 int nghttp2_session_terminate_session2(nghttp2_session *session, in nghttp2_session_terminate_session2() argument
256 return session_terminate_session(session, last_stream_id, error_code, NULL); in nghttp2_session_terminate_session2()
259 int nghttp2_session_terminate_session_with_reason(nghttp2_session *session, in nghttp2_session_terminate_session_with_reason() argument
262 return session_terminate_session(session, session->last_proc_stream_id, in nghttp2_session_terminate_session_with_reason()
266 int nghttp2_session_is_my_stream_id(nghttp2_session *session, in nghttp2_session_is_my_stream_id() argument
273 if (session->server) { in nghttp2_session_is_my_stream_id()
279 nghttp2_stream *nghttp2_session_get_stream(nghttp2_session *session, in nghttp2_session_get_stream() argument
283 stream = (nghttp2_stream *)nghttp2_map_find(&session->streams, stream_id); in nghttp2_session_get_stream()
293 nghttp2_stream *nghttp2_session_get_stream_raw(nghttp2_session *session, in nghttp2_session_get_stream_raw() argument
295 return (nghttp2_stream *)nghttp2_map_find(&session->streams, stream_id); in nghttp2_session_get_stream_raw()
298 static void session_inbound_frame_reset(nghttp2_session *session) { in session_inbound_frame_reset() argument
299 nghttp2_inbound_frame *iframe = &session->iframe; in session_inbound_frame_reset()
300 nghttp2_mem *mem = &session->mem; in session_inbound_frame_reset()
340 if (check_ext_type_set(session->user_recv_ext_types, in session_inbound_frame_reset()
346 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ALTSVC) == 0) { in session_inbound_frame_reset()
352 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN) == 0) { in session_inbound_frame_reset()
620 nghttp2_session *session; in nghttp2_session_client_new3() local
622 rv = session_new(&session, callbacks, user_data, 0, option, mem); in nghttp2_session_client_new3()
628 session->next_stream_id = 1; in nghttp2_session_client_new3()
630 *session_ptr = session; in nghttp2_session_client_new3()
654 nghttp2_session *session; in nghttp2_session_server_new3() local
656 rv = session_new(&session, callbacks, user_data, 1, option, mem); in nghttp2_session_server_new3()
662 session->next_stream_id = 2; in nghttp2_session_server_new3()
664 *session_ptr = session; in nghttp2_session_server_new3()
670 nghttp2_session *session; in free_streams() local
675 session = (nghttp2_session *)ptr; in free_streams()
676 mem = &session->mem; in free_streams()
680 if (item && !item->queued && item != session->aob.item) { in free_streams()
735 void nghttp2_session_del(nghttp2_session *session) { in nghttp2_session_del() argument
739 if (session == NULL) { in nghttp2_session_del()
743 mem = &session->mem; in nghttp2_session_del()
745 for (settings = session->inflight_settings_head; settings;) { in nghttp2_session_del()
751 nghttp2_stream_free(&session->root); in nghttp2_session_del()
755 nghttp2_map_each_free(&session->streams, free_streams, session); in nghttp2_session_del()
756 nghttp2_map_free(&session->streams); in nghttp2_session_del()
758 ob_q_free(&session->ob_urgent, mem); in nghttp2_session_del()
759 ob_q_free(&session->ob_reg, mem); in nghttp2_session_del()
760 ob_q_free(&session->ob_syn, mem); in nghttp2_session_del()
762 active_outbound_item_reset(&session->aob, mem); in nghttp2_session_del()
763 session_inbound_frame_reset(session); in nghttp2_session_del()
764 nghttp2_hd_deflate_free(&session->hd_deflater); in nghttp2_session_del()
765 nghttp2_hd_inflate_free(&session->hd_inflater); in nghttp2_session_del()
766 nghttp2_bufs_free(&session->aob.framebufs); in nghttp2_session_del()
767 nghttp2_mem_free(mem, session); in nghttp2_session_del()
771 nghttp2_session *session, nghttp2_stream *stream, in nghttp2_session_reprioritize_stream() argument
785 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id); in nghttp2_session_reprioritize_stream()
788 session_detect_idle_stream(session, pri_spec->stream_id)) { in nghttp2_session_reprioritize_stream()
793 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, in nghttp2_session_reprioritize_stream()
806 dep_stream = &session->root; in nghttp2_session_reprioritize_stream()
845 int nghttp2_session_add_item(nghttp2_session *session, in nghttp2_session_add_item() argument
854 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_add_item()
882 nghttp2_outbound_queue_push(&session->ob_syn, item); in nghttp2_session_add_item()
888 nghttp2_outbound_queue_push(&session->ob_reg, item); in nghttp2_session_add_item()
893 nghttp2_outbound_queue_push(&session->ob_urgent, item); in nghttp2_session_add_item()
900 nghttp2_outbound_queue_push(&session->ob_reg, item); in nghttp2_session_add_item()
917 session, frame->push_promise.promised_stream_id, in nghttp2_session_add_item()
927 nghttp2_outbound_queue_push(&session->ob_reg, item); in nghttp2_session_add_item()
936 session->window_update_queued = 1; in nghttp2_session_add_item()
938 nghttp2_outbound_queue_push(&session->ob_reg, item); in nghttp2_session_add_item()
942 nghttp2_outbound_queue_push(&session->ob_reg, item); in nghttp2_session_add_item()
948 int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id, in nghttp2_session_add_rst_stream() argument
956 mem = &session->mem; in nghttp2_session_add_rst_stream()
957 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_add_rst_stream()
966 if (nghttp2_session_is_my_stream_id(session, stream_id)) { in nghttp2_session_add_rst_stream()
967 if ((uint32_t)stream_id >= session->next_stream_id) { in nghttp2_session_add_rst_stream()
970 } else if (session->last_recv_stream_id < stream_id) { in nghttp2_session_add_rst_stream()
976 if (!session->server && nghttp2_session_is_my_stream_id(session, stream_id) && in nghttp2_session_add_rst_stream()
977 nghttp2_outbound_queue_top(&session->ob_syn)) { in nghttp2_session_add_rst_stream()
981 headers_frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame; in nghttp2_session_add_rst_stream()
986 for (item = session->ob_syn.head; item; item = item->qnext) { in nghttp2_session_add_rst_stream()
1017 rv = nghttp2_session_add_item(session, item); in nghttp2_session_add_rst_stream()
1026 nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session, in nghttp2_session_open_stream() argument
1039 mem = &session->mem; in nghttp2_session_open_stream()
1040 stream = nghttp2_session_get_stream_raw(session, stream_id); in nghttp2_session_open_stream()
1045 nghttp2_session_detach_idle_stream(session, stream); in nghttp2_session_open_stream()
1060 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id); in nghttp2_session_open_stream()
1063 session_detect_idle_stream(session, pri_spec->stream_id)) { in nghttp2_session_open_stream()
1069 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default, in nghttp2_session_open_stream()
1101 (int32_t)session->remote_settings.initial_window_size, in nghttp2_session_open_stream()
1102 (int32_t)session->local_settings.initial_window_size, in nghttp2_session_open_stream()
1105 rv = nghttp2_map_insert(&session->streams, &stream->map_entry); in nghttp2_session_open_stream()
1120 if (nghttp2_session_is_my_stream_id(session, stream_id)) { in nghttp2_session_open_stream()
1126 ++session->num_incoming_reserved_streams; in nghttp2_session_open_stream()
1134 nghttp2_session_keep_idle_stream(session, stream); in nghttp2_session_open_stream()
1137 if (nghttp2_session_is_my_stream_id(session, stream_id)) { in nghttp2_session_open_stream()
1138 ++session->num_outgoing_streams; in nghttp2_session_open_stream()
1140 ++session->num_incoming_streams; in nghttp2_session_open_stream()
1145 dep_stream = &session->root; in nghttp2_session_open_stream()
1162 int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id, in nghttp2_session_close_stream() argument
1169 mem = &session->mem; in nghttp2_session_close_stream()
1170 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_close_stream()
1193 if (!item->queued && item != session->aob.item) { in nghttp2_session_close_stream()
1206 if (session->callbacks.on_stream_close_callback) { in nghttp2_session_close_stream()
1207 if (session->callbacks.on_stream_close_callback( in nghttp2_session_close_stream()
1208 session, stream_id, error_code, session->user_data) != 0) { in nghttp2_session_close_stream()
1214 is_my_stream_id = nghttp2_session_is_my_stream_id(session, stream_id); in nghttp2_session_close_stream()
1220 --session->num_incoming_reserved_streams; in nghttp2_session_close_stream()
1224 --session->num_outgoing_streams; in nghttp2_session_close_stream()
1226 --session->num_incoming_streams; in nghttp2_session_close_stream()
1233 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_CLOSED_STREAMS) == 0 && in nghttp2_session_close_stream()
1234 session->server && !is_my_stream_id && in nghttp2_session_close_stream()
1239 nghttp2_session_keep_closed_stream(session, stream); in nghttp2_session_close_stream()
1241 rv = nghttp2_session_destroy_stream(session, stream); in nghttp2_session_close_stream()
1250 int nghttp2_session_destroy_stream(nghttp2_session *session, in nghttp2_session_destroy_stream() argument
1257 mem = &session->mem; in nghttp2_session_destroy_stream()
1266 nghttp2_map_remove(&session->streams, stream->stream_id); in nghttp2_session_destroy_stream()
1273 void nghttp2_session_keep_closed_stream(nghttp2_session *session, in nghttp2_session_keep_closed_stream() argument
1278 if (session->closed_stream_tail) { in nghttp2_session_keep_closed_stream()
1279 session->closed_stream_tail->closed_next = stream; in nghttp2_session_keep_closed_stream()
1280 stream->closed_prev = session->closed_stream_tail; in nghttp2_session_keep_closed_stream()
1282 session->closed_stream_head = stream; in nghttp2_session_keep_closed_stream()
1284 session->closed_stream_tail = stream; in nghttp2_session_keep_closed_stream()
1286 ++session->num_closed_streams; in nghttp2_session_keep_closed_stream()
1289 void nghttp2_session_keep_idle_stream(nghttp2_session *session, in nghttp2_session_keep_idle_stream() argument
1294 if (session->idle_stream_tail) { in nghttp2_session_keep_idle_stream()
1295 session->idle_stream_tail->closed_next = stream; in nghttp2_session_keep_idle_stream()
1296 stream->closed_prev = session->idle_stream_tail; in nghttp2_session_keep_idle_stream()
1298 session->idle_stream_head = stream; in nghttp2_session_keep_idle_stream()
1300 session->idle_stream_tail = stream; in nghttp2_session_keep_idle_stream()
1302 ++session->num_idle_streams; in nghttp2_session_keep_idle_stream()
1305 void nghttp2_session_detach_idle_stream(nghttp2_session *session, in nghttp2_session_detach_idle_stream() argument
1318 session->idle_stream_head = next_stream; in nghttp2_session_detach_idle_stream()
1324 session->idle_stream_tail = prev_stream; in nghttp2_session_detach_idle_stream()
1330 --session->num_idle_streams; in nghttp2_session_detach_idle_stream()
1333 int nghttp2_session_adjust_closed_stream(nghttp2_session *session) { in nghttp2_session_adjust_closed_stream() argument
1337 if (session->local_settings.max_concurrent_streams == in nghttp2_session_adjust_closed_stream()
1339 num_stream_max = session->pending_local_max_concurrent_stream; in nghttp2_session_adjust_closed_stream()
1341 num_stream_max = session->local_settings.max_concurrent_streams; in nghttp2_session_adjust_closed_stream()
1346 session->num_closed_streams, session->num_incoming_streams, in nghttp2_session_adjust_closed_stream()
1349 while (session->num_closed_streams > 0 && in nghttp2_session_adjust_closed_stream()
1350 session->num_closed_streams + session->num_incoming_streams > in nghttp2_session_adjust_closed_stream()
1355 head_stream = session->closed_stream_head; in nghttp2_session_adjust_closed_stream()
1361 rv = nghttp2_session_destroy_stream(session, head_stream); in nghttp2_session_adjust_closed_stream()
1368 session->closed_stream_head = next; in nghttp2_session_adjust_closed_stream()
1370 if (session->closed_stream_head) { in nghttp2_session_adjust_closed_stream()
1371 session->closed_stream_head->closed_prev = NULL; in nghttp2_session_adjust_closed_stream()
1373 session->closed_stream_tail = NULL; in nghttp2_session_adjust_closed_stream()
1376 --session->num_closed_streams; in nghttp2_session_adjust_closed_stream()
1382 int nghttp2_session_adjust_idle_stream(nghttp2_session *session) { in nghttp2_session_adjust_idle_stream() argument
1390 16, nghttp2_min(session->local_settings.max_concurrent_streams, in nghttp2_session_adjust_idle_stream()
1391 session->pending_local_max_concurrent_stream))); in nghttp2_session_adjust_idle_stream()
1394 session->num_idle_streams, max); in nghttp2_session_adjust_idle_stream()
1396 while (session->num_idle_streams > max) { in nghttp2_session_adjust_idle_stream()
1400 head = session->idle_stream_head; in nghttp2_session_adjust_idle_stream()
1405 rv = nghttp2_session_destroy_stream(session, head); in nghttp2_session_adjust_idle_stream()
1412 session->idle_stream_head = next; in nghttp2_session_adjust_idle_stream()
1414 if (session->idle_stream_head) { in nghttp2_session_adjust_idle_stream()
1415 session->idle_stream_head->closed_prev = NULL; in nghttp2_session_adjust_idle_stream()
1417 session->idle_stream_tail = NULL; in nghttp2_session_adjust_idle_stream()
1420 --session->num_idle_streams; in nghttp2_session_adjust_idle_stream()
1439 int nghttp2_session_close_stream_if_shut_rdwr(nghttp2_session *session, in nghttp2_session_close_stream_if_shut_rdwr() argument
1442 return nghttp2_session_close_stream(session, stream->stream_id, in nghttp2_session_close_stream_if_shut_rdwr()
1452 static int session_allow_incoming_new_stream(nghttp2_session *session) { in session_allow_incoming_new_stream() argument
1453 return (session->goaway_flags & in session_allow_incoming_new_stream()
1460 static int session_is_closing(nghttp2_session *session) { in session_is_closing() argument
1461 return (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) != 0 || in session_is_closing()
1462 (nghttp2_session_want_read(session) == 0 && in session_is_closing()
1463 nghttp2_session_want_write(session) == 0); in session_is_closing()
1478 static int session_predicate_for_stream_send(nghttp2_session *session, in session_predicate_for_stream_send() argument
1483 if (session_is_closing(session)) { in session_predicate_for_stream_send()
1492 int nghttp2_session_check_request_allowed(nghttp2_session *session) { in nghttp2_session_check_request_allowed() argument
1493 return !session->server && session->next_stream_id <= INT32_MAX && in nghttp2_session_check_request_allowed()
1494 (session->goaway_flags & NGHTTP2_GOAWAY_RECV) == 0 && in nghttp2_session_check_request_allowed()
1495 !session_is_closing(session); in nghttp2_session_check_request_allowed()
1512 static int session_predicate_request_headers_send(nghttp2_session *session, in session_predicate_request_headers_send() argument
1520 if ((session->goaway_flags & NGHTTP2_GOAWAY_RECV) || in session_predicate_request_headers_send()
1521 session_is_closing(session)) { in session_predicate_request_headers_send()
1551 static int session_predicate_response_headers_send(nghttp2_session *session, in session_predicate_response_headers_send() argument
1554 rv = session_predicate_for_stream_send(session, stream); in session_predicate_response_headers_send()
1559 if (!session->server) { in session_predicate_response_headers_send()
1562 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) { in session_predicate_response_headers_send()
1600 session_predicate_push_response_headers_send(nghttp2_session *session, in session_predicate_push_response_headers_send() argument
1604 rv = session_predicate_for_stream_send(session, stream); in session_predicate_push_response_headers_send()
1609 if (!session->server) { in session_predicate_push_response_headers_send()
1615 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) { in session_predicate_push_response_headers_send()
1641 static int session_predicate_headers_send(nghttp2_session *session, in session_predicate_headers_send() argument
1644 rv = session_predicate_for_stream_send(session, stream); in session_predicate_headers_send()
1656 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) { in session_predicate_headers_send()
1688 static int session_predicate_push_promise_send(nghttp2_session *session, in session_predicate_push_promise_send() argument
1692 if (!session->server) { in session_predicate_push_promise_send()
1696 rv = session_predicate_for_stream_send(session, stream); in session_predicate_push_promise_send()
1703 if (session->remote_settings.enable_push == 0) { in session_predicate_push_promise_send()
1709 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) { in session_predicate_push_promise_send()
1732 static int session_predicate_window_update_send(nghttp2_session *session, in session_predicate_window_update_send() argument
1736 if (session_is_closing(session)) { in session_predicate_window_update_send()
1744 stream = nghttp2_session_get_stream(session, stream_id); in session_predicate_window_update_send()
1751 if (state_reserved_local(session, stream)) { in session_predicate_window_update_send()
1757 static int session_predicate_altsvc_send(nghttp2_session *session, in session_predicate_altsvc_send() argument
1761 if (session_is_closing(session)) { in session_predicate_altsvc_send()
1769 stream = nghttp2_session_get_stream(session, stream_id); in session_predicate_altsvc_send()
1780 static int session_predicate_origin_send(nghttp2_session *session) { in session_predicate_origin_send() argument
1781 if (session_is_closing(session)) { in session_predicate_origin_send()
1790 nghttp2_session_enforce_flow_control_limits(nghttp2_session *session, in nghttp2_session_enforce_flow_control_limits() argument
1795 session->remote_window_size, session->remote_settings.max_frame_size, in nghttp2_session_enforce_flow_control_limits()
1800 session->remote_window_size), in nghttp2_session_enforce_flow_control_limits()
1801 (int32_t)session->remote_settings.max_frame_size); in nghttp2_session_enforce_flow_control_limits()
1810 static size_t nghttp2_session_next_data_read(nghttp2_session *session, in nghttp2_session_next_data_read() argument
1815 session, stream, NGHTTP2_DATA_PAYLOADLEN); in nghttp2_session_next_data_read()
1841 static int nghttp2_session_predicate_data_send(nghttp2_session *session, in nghttp2_session_predicate_data_send() argument
1844 rv = session_predicate_for_stream_send(session, stream); in nghttp2_session_predicate_data_send()
1849 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) { in nghttp2_session_predicate_data_send()
1872 static ssize_t session_call_select_padding(nghttp2_session *session, in session_call_select_padding() argument
1881 if (session->callbacks.select_padding_callback) { in session_call_select_padding()
1887 rv = session->callbacks.select_padding_callback( in session_call_select_padding()
1888 session, frame, max_paddedlen, session->user_data); in session_call_select_padding()
1900 static int session_headers_add_pad(nghttp2_session *session, in session_headers_add_pad() argument
1909 aob = &session->aob; in session_headers_add_pad()
1916 session_call_select_padding(session, frame, max_payloadlen); in session_headers_add_pad()
1938 static size_t session_estimate_headers_payload(nghttp2_session *session, in session_estimate_headers_payload() argument
1942 return nghttp2_hd_deflate_bound(&session->hd_deflater, nva, nvlen) + in session_estimate_headers_payload()
1946 static int session_pack_extension(nghttp2_session *session, nghttp2_bufs *bufs, in session_pack_extension() argument
1953 assert(session->callbacks.pack_extension_callback); in session_pack_extension()
1958 rv = session->callbacks.pack_extension_callback(session, buf->last, buflen, in session_pack_extension()
1959 frame, session->user_data); in session_pack_extension()
1987 static int session_prep_frame(nghttp2_session *session, in session_prep_frame() argument
1993 mem = &session->mem; in session_prep_frame()
2001 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_prep_frame()
2007 rv = nghttp2_session_predicate_data_send(session, stream); in session_prep_frame()
2012 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); in session_prep_frame()
2027 next_readmax = nghttp2_session_next_data_read(session, stream); in session_prep_frame()
2033 assert(session->remote_window_size > 0); in session_prep_frame()
2042 session->aob.item = NULL; in session_prep_frame()
2043 active_outbound_item_reset(&session->aob, mem); in session_prep_frame()
2047 rv = nghttp2_session_pack_data(session, &session->aob.framebufs, in session_prep_frame()
2060 session->aob.item = NULL; in session_prep_frame()
2061 active_outbound_item_reset(&session->aob, mem); in session_prep_frame()
2071 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id, in session_prep_frame()
2102 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, in session_prep_frame()
2113 rv = session_predicate_request_headers_send(session, item); in session_prep_frame()
2118 if (session_enforce_http_messaging(session)) { in session_prep_frame()
2124 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_prep_frame()
2127 rv = session_predicate_push_response_headers_send(session, stream); in session_prep_frame()
2135 } else if (session_predicate_response_headers_send(session, stream) == in session_prep_frame()
2142 rv = session_predicate_headers_send(session, stream); in session_prep_frame()
2151 session, frame->headers.nva, frame->headers.nvlen, in session_prep_frame()
2154 if (estimated_payloadlen > session->max_send_header_block_length) { in session_prep_frame()
2158 rv = nghttp2_frame_pack_headers(&session->aob.framebufs, &frame->headers, in session_prep_frame()
2159 &session->hd_deflater); in session_prep_frame()
2166 nghttp2_bufs_len(&session->aob.framebufs)); in session_prep_frame()
2168 rv = session_headers_add_pad(session, frame); in session_prep_frame()
2175 nghttp2_bufs_len(&session->aob.framebufs)); in session_prep_frame()
2178 assert(session->last_sent_stream_id < frame->hd.stream_id); in session_prep_frame()
2179 session->last_sent_stream_id = frame->hd.stream_id; in session_prep_frame()
2185 if (session_is_closing(session)) { in session_prep_frame()
2190 nghttp2_frame_pack_priority(&session->aob.framebufs, &frame->priority); in session_prep_frame()
2199 if (session_is_closing(session)) { in session_prep_frame()
2202 nghttp2_frame_pack_rst_stream(&session->aob.framebufs, &frame->rst_stream); in session_prep_frame()
2206 assert(session->obq_flood_counter_ > 0); in session_prep_frame()
2207 --session->obq_flood_counter_; in session_prep_frame()
2212 if (session_is_closing(session)) { in session_prep_frame()
2217 rv = nghttp2_frame_pack_settings(&session->aob.framebufs, &frame->settings); in session_prep_frame()
2229 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_prep_frame()
2232 rv = session_predicate_push_promise_send(session, stream); in session_prep_frame()
2240 session, frame->push_promise.nva, frame->push_promise.nvlen, 0); in session_prep_frame()
2242 if (estimated_payloadlen > session->max_send_header_block_length) { in session_prep_frame()
2247 &session->aob.framebufs, &frame->push_promise, &session->hd_deflater); in session_prep_frame()
2251 rv = session_headers_add_pad(session, frame); in session_prep_frame()
2256 assert(session->last_sent_stream_id + 2 <= in session_prep_frame()
2258 session->last_sent_stream_id = frame->push_promise.promised_stream_id; in session_prep_frame()
2264 assert(session->obq_flood_counter_ > 0); in session_prep_frame()
2265 --session->obq_flood_counter_; in session_prep_frame()
2269 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) { in session_prep_frame()
2272 nghttp2_frame_pack_ping(&session->aob.framebufs, &frame->ping); in session_prep_frame()
2275 rv = nghttp2_frame_pack_goaway(&session->aob.framebufs, &frame->goaway); in session_prep_frame()
2279 session->local_last_stream_id = frame->goaway.last_stream_id; in session_prep_frame()
2283 rv = session_predicate_window_update_send(session, frame->hd.stream_id); in session_prep_frame()
2287 nghttp2_frame_pack_window_update(&session->aob.framebufs, in session_prep_frame()
2302 if (session_is_closing(session)) { in session_prep_frame()
2306 return session_pack_extension(session, &session->aob.framebufs, frame); in session_prep_frame()
2311 rv = session_predicate_altsvc_send(session, frame->hd.stream_id); in session_prep_frame()
2316 nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext); in session_prep_frame()
2320 rv = session_predicate_origin_send(session); in session_prep_frame()
2325 rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext); in session_prep_frame()
2341 nghttp2_session_get_next_ob_item(nghttp2_session *session) { in nghttp2_session_get_next_ob_item() argument
2342 if (nghttp2_outbound_queue_top(&session->ob_urgent)) { in nghttp2_session_get_next_ob_item()
2343 return nghttp2_outbound_queue_top(&session->ob_urgent); in nghttp2_session_get_next_ob_item()
2346 if (nghttp2_outbound_queue_top(&session->ob_reg)) { in nghttp2_session_get_next_ob_item()
2347 return nghttp2_outbound_queue_top(&session->ob_reg); in nghttp2_session_get_next_ob_item()
2350 if (!session_is_outgoing_concurrent_streams_max(session)) { in nghttp2_session_get_next_ob_item()
2351 if (nghttp2_outbound_queue_top(&session->ob_syn)) { in nghttp2_session_get_next_ob_item()
2352 return nghttp2_outbound_queue_top(&session->ob_syn); in nghttp2_session_get_next_ob_item()
2356 if (session->remote_window_size > 0) { in nghttp2_session_get_next_ob_item()
2357 return nghttp2_stream_next_outbound_item(&session->root); in nghttp2_session_get_next_ob_item()
2364 nghttp2_session_pop_next_ob_item(nghttp2_session *session) { in nghttp2_session_pop_next_ob_item() argument
2367 item = nghttp2_outbound_queue_top(&session->ob_urgent); in nghttp2_session_pop_next_ob_item()
2369 nghttp2_outbound_queue_pop(&session->ob_urgent); in nghttp2_session_pop_next_ob_item()
2374 item = nghttp2_outbound_queue_top(&session->ob_reg); in nghttp2_session_pop_next_ob_item()
2376 nghttp2_outbound_queue_pop(&session->ob_reg); in nghttp2_session_pop_next_ob_item()
2381 if (!session_is_outgoing_concurrent_streams_max(session)) { in nghttp2_session_pop_next_ob_item()
2382 item = nghttp2_outbound_queue_top(&session->ob_syn); in nghttp2_session_pop_next_ob_item()
2384 nghttp2_outbound_queue_pop(&session->ob_syn); in nghttp2_session_pop_next_ob_item()
2390 if (session->remote_window_size > 0) { in nghttp2_session_pop_next_ob_item()
2391 return nghttp2_stream_next_outbound_item(&session->root); in nghttp2_session_pop_next_ob_item()
2397 static int session_call_before_frame_send(nghttp2_session *session, in session_call_before_frame_send() argument
2400 if (session->callbacks.before_frame_send_callback) { in session_call_before_frame_send()
2401 rv = session->callbacks.before_frame_send_callback(session, frame, in session_call_before_frame_send()
2402 session->user_data); in session_call_before_frame_send()
2414 static int session_call_on_frame_send(nghttp2_session *session, in session_call_on_frame_send() argument
2417 if (session->callbacks.on_frame_send_callback) { in session_call_on_frame_send()
2418 rv = session->callbacks.on_frame_send_callback(session, frame, in session_call_on_frame_send()
2419 session->user_data); in session_call_on_frame_send()
2434 if (nghttp2_session_is_my_stream_id(arg->session, stream->stream_id)) { in find_stream_on_goaway_func()
2465 static int session_close_stream_on_goaway(nghttp2_session *session, in session_close_stream_on_goaway() argument
2470 nghttp2_close_stream_on_goaway_arg arg = {session, NULL, last_stream_id, in session_close_stream_on_goaway()
2473 rv = nghttp2_map_each(&session->streams, find_stream_on_goaway_func, &arg); in session_close_stream_on_goaway()
2480 rv = nghttp2_session_close_stream(session, stream->stream_id, in session_close_stream_on_goaway()
2507 static int session_update_stream_consumed_size(nghttp2_session *session,
2511 static int session_update_connection_consumed_size(nghttp2_session *session,
2528 static int session_after_frame_sent1(nghttp2_session *session) { in session_after_frame_sent1() argument
2530 nghttp2_active_outbound_item *aob = &session->aob; in session_after_frame_sent1()
2543 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_after_frame_sent1()
2547 session->remote_window_size -= (int32_t)frame->hd.length; in session_after_frame_sent1()
2561 if (session->callbacks.on_frame_send_callback) { in session_after_frame_sent1()
2562 rv = session_call_on_frame_send(session, frame); in session_after_frame_sent1()
2576 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream); in session_after_frame_sent1()
2588 if (session->callbacks.on_frame_send_callback) { in session_after_frame_sent1()
2589 rv = session_call_on_frame_send(session, frame); in session_after_frame_sent1()
2607 rv = session_call_on_frame_send(session, frame); in session_after_frame_sent1()
2615 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_after_frame_sent1()
2626 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream); in session_after_frame_sent1()
2634 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM, in session_after_frame_sent1()
2646 ++session->num_outgoing_streams; in session_after_frame_sent1()
2655 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream); in session_after_frame_sent1()
2662 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM, in session_after_frame_sent1()
2678 if (session->server) { in session_after_frame_sent1()
2683 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); in session_after_frame_sent1()
2686 if (!session_detect_idle_stream(session, frame->hd.stream_id)) { in session_after_frame_sent1()
2691 session, frame->hd.stream_id, NGHTTP2_FLAG_NONE, in session_after_frame_sent1()
2697 rv = nghttp2_session_reprioritize_stream(session, stream, in session_after_frame_sent1()
2704 rv = nghttp2_session_adjust_idle_stream(session); in session_after_frame_sent1()
2712 rv = nghttp2_session_close_stream(session, frame->hd.stream_id, in session_after_frame_sent1()
2726 session->goaway_flags |= NGHTTP2_GOAWAY_TERM_SENT; in session_after_frame_sent1()
2729 session->goaway_flags |= NGHTTP2_GOAWAY_SENT; in session_after_frame_sent1()
2731 rv = session_close_stream_on_goaway(session, frame->goaway.last_stream_id, in session_after_frame_sent1()
2743 session->window_update_queued = 0; in session_after_frame_sent1()
2744 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { in session_after_frame_sent1()
2745 rv = session_update_connection_consumed_size(session, 0); in session_after_frame_sent1()
2747 rv = nghttp2_session_update_recv_connection_window_size(session, 0); in session_after_frame_sent1()
2757 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_after_frame_sent1()
2770 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { in session_after_frame_sent1()
2771 rv = session_update_stream_consumed_size(session, stream, 0); in session_after_frame_sent1()
2774 nghttp2_session_update_recv_stream_window_size(session, stream, 0, 1); in session_after_frame_sent1()
2799 static int session_after_frame_sent2(nghttp2_session *session) { in session_after_frame_sent2() argument
2801 nghttp2_active_outbound_item *aob = &session->aob; in session_after_frame_sent2()
2809 mem = &session->mem; in session_after_frame_sent2()
2827 active_outbound_item_reset(&session->aob, mem); in session_after_frame_sent2()
2849 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_after_frame_sent2()
2853 if (nghttp2_session_predicate_data_send(session, stream) != 0) { in session_after_frame_sent2()
2868 active_outbound_item_reset(&session->aob, mem); in session_after_frame_sent2()
2873 static int session_call_send_data(nghttp2_session *session, in session_call_send_data() argument
2887 rv = session->callbacks.send_data_callback(session, frame, buf->pos, length, in session_call_send_data()
2889 session->user_data); in session_call_send_data()
2902 static ssize_t nghttp2_session_mem_send_internal(nghttp2_session *session, in nghttp2_session_mem_send_internal() argument
2910 mem = &session->mem; in nghttp2_session_mem_send_internal()
2911 aob = &session->aob; in nghttp2_session_mem_send_internal()
2917 rv = nghttp2_session_adjust_idle_stream(session); in nghttp2_session_mem_send_internal()
2927 item = nghttp2_session_pop_next_ob_item(session); in nghttp2_session_mem_send_internal()
2932 rv = session_prep_frame(session, item); in nghttp2_session_mem_send_internal()
2949 session->callbacks.on_frame_not_send_callback && is_non_fatal(rv)) { in nghttp2_session_mem_send_internal()
2955 session->callbacks.on_frame_not_send_callback( in nghttp2_session_mem_send_internal()
2956 session, frame, rv, session->user_data) != 0) { in nghttp2_session_mem_send_internal()
2986 rv2 = nghttp2_session_close_stream(session, opened_stream_id, in nghttp2_session_mem_send_internal()
3001 rv = nghttp2_session_terminate_session(session, in nghttp2_session_mem_send_internal()
3024 rv = session_call_before_frame_send(session, frame); in nghttp2_session_mem_send_internal()
3033 if (session->callbacks.on_frame_not_send_callback) { in nghttp2_session_mem_send_internal()
3034 if (session->callbacks.on_frame_not_send_callback( in nghttp2_session_mem_send_internal()
3035 session, frame, rv, session->user_data) != 0) { in nghttp2_session_mem_send_internal()
3061 rv2 = nghttp2_session_close_stream(session, opened_stream_id, in nghttp2_session_mem_send_internal()
3101 rv = session_after_frame_sent2(session); in nghttp2_session_mem_send_internal()
3103 rv = session_after_frame_sent1(session); in nghttp2_session_mem_send_internal()
3109 rv = session_after_frame_sent2(session); in nghttp2_session_mem_send_internal()
3138 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_mem_send_internal()
3147 rv = session_call_send_data(session, aob->item, framebufs); in nghttp2_session_mem_send_internal()
3159 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id, in nghttp2_session_mem_send_internal()
3176 rv = session_after_frame_sent1(session); in nghttp2_session_mem_send_internal()
3181 rv = session_after_frame_sent2(session); in nghttp2_session_mem_send_internal()
3218 ssize_t nghttp2_session_mem_send(nghttp2_session *session, in nghttp2_session_mem_send() argument
3225 len = nghttp2_session_mem_send_internal(session, data_ptr, 1); in nghttp2_session_mem_send()
3230 if (session->aob.item) { in nghttp2_session_mem_send()
3235 rv = session_after_frame_sent1(session); in nghttp2_session_mem_send()
3245 int nghttp2_session_send(nghttp2_session *session) { in nghttp2_session_send() argument
3251 framebufs = &session->aob.framebufs; in nghttp2_session_send()
3254 datalen = nghttp2_session_mem_send_internal(session, &data, 0); in nghttp2_session_send()
3258 sentlen = session->callbacks.send_callback(session, data, (size_t)datalen, in nghttp2_session_send()
3259 0, session->user_data); in nghttp2_session_send()
3274 static ssize_t session_recv(nghttp2_session *session, uint8_t *buf, in session_recv() argument
3277 rv = session->callbacks.recv_callback(session, buf, len, 0, in session_recv()
3278 session->user_data); in session_recv()
3289 static int session_call_on_begin_frame(nghttp2_session *session, in session_call_on_begin_frame() argument
3293 if (session->callbacks.on_begin_frame_callback) { in session_call_on_begin_frame()
3295 rv = session->callbacks.on_begin_frame_callback(session, hd, in session_call_on_begin_frame()
3296 session->user_data); in session_call_on_begin_frame()
3306 static int session_call_on_frame_received(nghttp2_session *session, in session_call_on_frame_received() argument
3309 if (session->callbacks.on_frame_recv_callback) { in session_call_on_frame_received()
3310 rv = session->callbacks.on_frame_recv_callback(session, frame, in session_call_on_frame_received()
3311 session->user_data); in session_call_on_frame_received()
3319 static int session_call_on_begin_headers(nghttp2_session *session, in session_call_on_begin_headers() argument
3324 if (session->callbacks.on_begin_headers_callback) { in session_call_on_begin_headers()
3325 rv = session->callbacks.on_begin_headers_callback(session, frame, in session_call_on_begin_headers()
3326 session->user_data); in session_call_on_begin_headers()
3337 static int session_call_on_header(nghttp2_session *session, in session_call_on_header() argument
3341 if (session->callbacks.on_header_callback2) { in session_call_on_header()
3342 rv = session->callbacks.on_header_callback2( in session_call_on_header()
3343 session, frame, nv->name, nv->value, nv->flags, session->user_data); in session_call_on_header()
3344 } else if (session->callbacks.on_header_callback) { in session_call_on_header()
3345 rv = session->callbacks.on_header_callback( in session_call_on_header()
3346 session, frame, nv->name->base, nv->name->len, nv->value->base, in session_call_on_header()
3347 nv->value->len, nv->flags, session->user_data); in session_call_on_header()
3360 static int session_call_on_invalid_header(nghttp2_session *session, in session_call_on_invalid_header() argument
3364 if (session->callbacks.on_invalid_header_callback2) { in session_call_on_invalid_header()
3365 rv = session->callbacks.on_invalid_header_callback2( in session_call_on_invalid_header()
3366 session, frame, nv->name, nv->value, nv->flags, session->user_data); in session_call_on_invalid_header()
3367 } else if (session->callbacks.on_invalid_header_callback) { in session_call_on_invalid_header()
3368 rv = session->callbacks.on_invalid_header_callback( in session_call_on_invalid_header()
3369 session, frame, nv->name->base, nv->name->len, nv->value->base, in session_call_on_invalid_header()
3370 nv->value->len, nv->flags, session->user_data); in session_call_on_invalid_header()
3386 session_call_on_extension_chunk_recv_callback(nghttp2_session *session, in session_call_on_extension_chunk_recv_callback() argument
3389 nghttp2_inbound_frame *iframe = &session->iframe; in session_call_on_extension_chunk_recv_callback()
3392 if (session->callbacks.on_extension_chunk_recv_callback) { in session_call_on_extension_chunk_recv_callback()
3393 rv = session->callbacks.on_extension_chunk_recv_callback( in session_call_on_extension_chunk_recv_callback()
3394 session, &frame->hd, data, len, session->user_data); in session_call_on_extension_chunk_recv_callback()
3406 static int session_call_unpack_extension_callback(nghttp2_session *session) { in session_call_unpack_extension_callback() argument
3408 nghttp2_inbound_frame *iframe = &session->iframe; in session_call_unpack_extension_callback()
3412 rv = session->callbacks.unpack_extension_callback( in session_call_unpack_extension_callback()
3413 session, &payload, &frame->hd, session->user_data); in session_call_unpack_extension_callback()
3435 static int session_handle_frame_size_error(nghttp2_session *session) { in session_handle_frame_size_error() argument
3438 return nghttp2_session_terminate_session(session, NGHTTP2_FRAME_SIZE_ERROR); in session_handle_frame_size_error()
3471 static int session_call_on_invalid_frame_recv_callback(nghttp2_session *session, in session_call_on_invalid_frame_recv_callback() argument
3474 if (session->callbacks.on_invalid_frame_recv_callback) { in session_call_on_invalid_frame_recv_callback()
3475 if (session->callbacks.on_invalid_frame_recv_callback( in session_call_on_invalid_frame_recv_callback()
3476 session, frame, lib_error_code, session->user_data) != 0) { in session_call_on_invalid_frame_recv_callback()
3483 static int session_handle_invalid_stream2(nghttp2_session *session, in session_handle_invalid_stream2() argument
3489 session, stream_id, get_error_code_from_lib_error_code(lib_error_code)); in session_handle_invalid_stream2()
3493 if (session->callbacks.on_invalid_frame_recv_callback) { in session_handle_invalid_stream2()
3494 if (session->callbacks.on_invalid_frame_recv_callback( in session_handle_invalid_stream2()
3495 session, frame, lib_error_code, session->user_data) != 0) { in session_handle_invalid_stream2()
3502 static int session_handle_invalid_stream(nghttp2_session *session, in session_handle_invalid_stream() argument
3505 return session_handle_invalid_stream2(session, frame->hd.stream_id, frame, in session_handle_invalid_stream()
3509 static int session_inflate_handle_invalid_stream(nghttp2_session *session, in session_inflate_handle_invalid_stream() argument
3513 rv = session_handle_invalid_stream(session, frame, lib_error_code); in session_inflate_handle_invalid_stream()
3523 static int session_handle_invalid_connection(nghttp2_session *session, in session_handle_invalid_connection() argument
3527 if (session->callbacks.on_invalid_frame_recv_callback) { in session_handle_invalid_connection()
3528 if (session->callbacks.on_invalid_frame_recv_callback( in session_handle_invalid_connection()
3529 session, frame, lib_error_code, session->user_data) != 0) { in session_handle_invalid_connection()
3534 session, get_error_code_from_lib_error_code(lib_error_code), reason); in session_handle_invalid_connection()
3537 static int session_inflate_handle_invalid_connection(nghttp2_session *session, in session_inflate_handle_invalid_connection() argument
3543 session_handle_invalid_connection(session, frame, lib_error_code, reason); in session_inflate_handle_invalid_connection()
3577 static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame, in inflate_header_block() argument
3589 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in inflate_header_block()
3593 session, frame->push_promise.promised_stream_id); in inflate_header_block()
3596 trailer = session_trailer_headers(session, stream, frame); in inflate_header_block()
3602 proclen = nghttp2_hd_inflate_hd_nv(&session->hd_inflater, &nv, in inflate_header_block()
3608 if (session->iframe.state == NGHTTP2_IB_READ_HEADER_BLOCK) { in inflate_header_block()
3614 session, subject_stream->stream_id, NGHTTP2_COMPRESSION_ERROR); in inflate_header_block()
3622 nghttp2_session_terminate_session(session, NGHTTP2_COMPRESSION_ERROR); in inflate_header_block()
3638 if (session_enforce_http_messaging(session)) { in inflate_header_block()
3639 rv = nghttp2_http_on_header(session, subject_stream, frame, &nv, in inflate_header_block()
3646 rv2 = session_call_on_invalid_header(session, frame, &nv); in inflate_header_block()
3660 session, NGHTTP2_ERR_HTTP_HEADER, in inflate_header_block()
3678 session, NGHTTP2_ERR_HTTP_HEADER, in inflate_header_block()
3688 rv = session_handle_invalid_stream2(session, in inflate_header_block()
3698 rv = session_call_on_header(session, frame, &nv); in inflate_header_block()
3708 nghttp2_hd_inflate_end_headers(&session->hd_inflater); in inflate_header_block()
3729 static int session_end_stream_headers_received(nghttp2_session *session, in session_end_stream_headers_received() argument
3738 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream); in session_end_stream_headers_received()
3746 static int session_after_header_block_received(nghttp2_session *session) { in session_after_header_block_received() argument
3748 nghttp2_frame *frame = &session->iframe.frame; in session_after_header_block_received()
3753 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_after_header_block_received()
3758 if (session_enforce_http_messaging(session)) { in session_after_header_block_received()
3763 session, frame->push_promise.promised_stream_id); in session_after_header_block_received()
3779 assert(!session->server); in session_after_header_block_received()
3801 rv = session_handle_invalid_stream2(session, stream_id, frame, in session_after_header_block_received()
3817 rv = session_call_on_frame_received(session, frame); in session_after_header_block_received()
3826 return session_end_stream_headers_received(session, frame, stream); in session_after_header_block_received()
3829 int nghttp2_session_on_request_headers_received(nghttp2_session *session, in nghttp2_session_on_request_headers_received() argument
3835 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0"); in nghttp2_session_on_request_headers_received()
3841 if (!session->server) { in nghttp2_session_on_request_headers_received()
3842 if (session_detect_idle_stream(session, frame->hd.stream_id)) { in nghttp2_session_on_request_headers_received()
3844 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_request_headers_received()
3851 assert(session->server); in nghttp2_session_on_request_headers_received()
3853 if (!session_is_new_peer_stream_id(session, frame->hd.stream_id)) { in nghttp2_session_on_request_headers_received()
3855 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { in nghttp2_session_on_request_headers_received()
3857 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_request_headers_received()
3881 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); in nghttp2_session_on_request_headers_received()
3884 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); in nghttp2_session_on_request_headers_received()
3889 session->last_recv_stream_id = frame->hd.stream_id; in nghttp2_session_on_request_headers_received()
3891 if (session_is_incoming_concurrent_streams_max(session)) { in nghttp2_session_on_request_headers_received()
3893 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_request_headers_received()
3897 if (!session_allow_incoming_new_stream(session)) { in nghttp2_session_on_request_headers_received()
3904 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself"); in nghttp2_session_on_request_headers_received()
3907 if (session_is_incoming_concurrent_streams_pending_max(session)) { in nghttp2_session_on_request_headers_received()
3908 return session_inflate_handle_invalid_stream(session, frame, in nghttp2_session_on_request_headers_received()
3913 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, in nghttp2_session_on_request_headers_received()
3919 rv = nghttp2_session_adjust_closed_stream(session); in nghttp2_session_on_request_headers_received()
3924 session->last_proc_stream_id = session->last_recv_stream_id; in nghttp2_session_on_request_headers_received()
3926 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_request_headers_received()
3933 int nghttp2_session_on_response_headers_received(nghttp2_session *session, in nghttp2_session_on_response_headers_received() argument
3940 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)); in nghttp2_session_on_response_headers_received()
3943 session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0"); in nghttp2_session_on_response_headers_received()
3955 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); in nghttp2_session_on_response_headers_received()
3958 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_response_headers_received()
3965 int nghttp2_session_on_push_response_headers_received(nghttp2_session *session, in nghttp2_session_on_push_response_headers_received() argument
3972 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_push_response_headers_received()
3976 if (session->server) { in nghttp2_session_on_push_response_headers_received()
3978 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_push_response_headers_received()
3982 if (session_is_incoming_concurrent_streams_max(session)) { in nghttp2_session_on_push_response_headers_received()
3984 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_push_response_headers_received()
3988 if (!session_allow_incoming_new_stream(session)) { in nghttp2_session_on_push_response_headers_received()
3993 if (session_is_incoming_concurrent_streams_pending_max(session)) { in nghttp2_session_on_push_response_headers_received()
3994 return session_inflate_handle_invalid_stream(session, frame, in nghttp2_session_on_push_response_headers_received()
3999 if (!nghttp2_session_is_my_stream_id(session, stream->stream_id)) { in nghttp2_session_on_push_response_headers_received()
4000 --session->num_incoming_reserved_streams; in nghttp2_session_on_push_response_headers_received()
4002 ++session->num_incoming_streams; in nghttp2_session_on_push_response_headers_received()
4003 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_push_response_headers_received()
4010 int nghttp2_session_on_headers_received(nghttp2_session *session, in nghttp2_session_on_headers_received() argument
4016 session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0"); in nghttp2_session_on_headers_received()
4028 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed"); in nghttp2_session_on_headers_received()
4030 if (nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { in nghttp2_session_on_headers_received()
4032 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_headers_received()
4046 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_headers_received()
4055 static int session_process_headers_frame(nghttp2_session *session) { in session_process_headers_frame() argument
4057 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_headers_frame()
4065 session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: could not unpack"); in session_process_headers_frame()
4067 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_process_headers_frame()
4070 return nghttp2_session_on_request_headers_received(session, frame); in session_process_headers_frame()
4075 return nghttp2_session_on_push_response_headers_received(session, frame, in session_process_headers_frame()
4080 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { in session_process_headers_frame()
4082 return nghttp2_session_on_response_headers_received(session, frame, stream); in session_process_headers_frame()
4086 return nghttp2_session_on_headers_received(session, frame, stream); in session_process_headers_frame()
4089 int nghttp2_session_on_priority_received(nghttp2_session *session, in nghttp2_session_on_priority_received() argument
4095 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_priority_received()
4101 session, NGHTTP2_PROTOCOL_ERROR, "depend on itself"); in nghttp2_session_on_priority_received()
4104 if (!session->server) { in nghttp2_session_on_priority_received()
4106 return session_call_on_frame_received(session, frame); in nghttp2_session_on_priority_received()
4109 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id); in nghttp2_session_on_priority_received()
4114 if (!session_detect_idle_stream(session, frame->hd.stream_id)) { in nghttp2_session_on_priority_received()
4119 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE, in nghttp2_session_on_priority_received()
4126 rv = nghttp2_session_adjust_idle_stream(session); in nghttp2_session_on_priority_received()
4131 rv = nghttp2_session_reprioritize_stream(session, stream, in nghttp2_session_on_priority_received()
4138 rv = nghttp2_session_adjust_idle_stream(session); in nghttp2_session_on_priority_received()
4144 return session_call_on_frame_received(session, frame); in nghttp2_session_on_priority_received()
4147 static int session_process_priority_frame(nghttp2_session *session) { in session_process_priority_frame() argument
4148 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_priority_frame()
4153 return nghttp2_session_on_priority_received(session, frame); in session_process_priority_frame()
4156 int nghttp2_session_on_rst_stream_received(nghttp2_session *session, in nghttp2_session_on_rst_stream_received() argument
4161 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_rst_stream_received()
4165 if (session_detect_idle_stream(session, frame->hd.stream_id)) { in nghttp2_session_on_rst_stream_received()
4166 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_rst_stream_received()
4170 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_on_rst_stream_received()
4176 rv = session_call_on_frame_received(session, frame); in nghttp2_session_on_rst_stream_received()
4180 rv = nghttp2_session_close_stream(session, frame->hd.stream_id, in nghttp2_session_on_rst_stream_received()
4188 static int session_process_rst_stream_frame(nghttp2_session *session) { in session_process_rst_stream_frame() argument
4189 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_rst_stream_frame()
4194 return nghttp2_session_on_rst_stream_received(session, frame); in session_process_rst_stream_frame()
4209 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id, in update_remote_initial_window_size_func()
4239 session_update_remote_initial_window_size(nghttp2_session *session, in session_update_remote_initial_window_size() argument
4243 arg.session = session; in session_update_remote_initial_window_size()
4245 arg.old_window_size = (int32_t)session->remote_settings.initial_window_size; in session_update_remote_initial_window_size()
4247 return nghttp2_map_each(&session->streams, in session_update_remote_initial_window_size()
4261 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id, in update_local_initial_window_size_func()
4264 if (!(arg->session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) && in update_local_initial_window_size_func()
4269 rv = nghttp2_session_add_window_update(arg->session, NGHTTP2_FLAG_NONE, in update_local_initial_window_size_func()
4292 session_update_local_initial_window_size(nghttp2_session *session, in session_update_local_initial_window_size() argument
4296 arg.session = session; in session_update_local_initial_window_size()
4299 return nghttp2_map_each(&session->streams, in session_update_local_initial_window_size()
4316 int nghttp2_session_update_local_settings(nghttp2_session *session, in nghttp2_session_update_local_settings() argument
4342 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater, in nghttp2_session_update_local_settings()
4349 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater, in nghttp2_session_update_local_settings()
4357 session, new_initial_window_size, in nghttp2_session_update_local_settings()
4358 (int32_t)session->local_settings.initial_window_size); in nghttp2_session_update_local_settings()
4367 session->local_settings.header_table_size = iv[i].value; in nghttp2_session_update_local_settings()
4370 session->local_settings.enable_push = iv[i].value; in nghttp2_session_update_local_settings()
4373 session->local_settings.max_concurrent_streams = iv[i].value; in nghttp2_session_update_local_settings()
4376 session->local_settings.initial_window_size = iv[i].value; in nghttp2_session_update_local_settings()
4379 session->local_settings.max_frame_size = iv[i].value; in nghttp2_session_update_local_settings()
4382 session->local_settings.max_header_list_size = iv[i].value; in nghttp2_session_update_local_settings()
4385 session->local_settings.enable_connect_protocol = iv[i].value; in nghttp2_session_update_local_settings()
4393 int nghttp2_session_on_settings_received(nghttp2_session *session, in nghttp2_session_on_settings_received() argument
4400 mem = &session->mem; in nghttp2_session_on_settings_received()
4403 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4409 session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR, in nghttp2_session_on_settings_received()
4413 settings = session->inflight_settings_head; in nghttp2_session_on_settings_received()
4417 session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK"); in nghttp2_session_on_settings_received()
4420 rv = nghttp2_session_update_local_settings(session, settings->iv, in nghttp2_session_on_settings_received()
4423 session->inflight_settings_head = settings->next; in nghttp2_session_on_settings_received()
4431 return session_handle_invalid_connection(session, frame, rv, NULL); in nghttp2_session_on_settings_received()
4433 return session_call_on_frame_received(session, frame); in nghttp2_session_on_settings_received()
4436 if (!session->remote_settings_received) { in nghttp2_session_on_settings_received()
4437 session->remote_settings.max_concurrent_streams = in nghttp2_session_on_settings_received()
4439 session->remote_settings_received = 1; in nghttp2_session_on_settings_received()
4448 rv = nghttp2_hd_deflate_change_table_size(&session->hd_deflater, in nghttp2_session_on_settings_received()
4455 session, frame, NGHTTP2_ERR_HEADER_COMP, NULL); in nghttp2_session_on_settings_received()
4459 session->remote_settings.header_table_size = entry->value; in nghttp2_session_on_settings_received()
4466 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4470 if (!session->server && entry->value != 0) { in nghttp2_session_on_settings_received()
4472 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4476 session->remote_settings.enable_push = entry->value; in nghttp2_session_on_settings_received()
4481 session->remote_settings.max_concurrent_streams = entry->value; in nghttp2_session_on_settings_received()
4490 session, frame, NGHTTP2_ERR_FLOW_CONTROL, in nghttp2_session_on_settings_received()
4494 rv = session_update_remote_initial_window_size(session, in nghttp2_session_on_settings_received()
4503 session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL); in nghttp2_session_on_settings_received()
4506 session->remote_settings.initial_window_size = entry->value; in nghttp2_session_on_settings_received()
4514 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4518 session->remote_settings.max_frame_size = entry->value; in nghttp2_session_on_settings_received()
4523 session->remote_settings.max_header_list_size = entry->value; in nghttp2_session_on_settings_received()
4530 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4534 if (!session->server && in nghttp2_session_on_settings_received()
4535 session->remote_settings.enable_connect_protocol && in nghttp2_session_on_settings_received()
4538 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_settings_received()
4543 session->remote_settings.enable_connect_protocol = entry->value; in nghttp2_session_on_settings_received()
4549 if (!noack && !session_is_closing(session)) { in nghttp2_session_on_settings_received()
4550 rv = nghttp2_session_add_settings(session, NGHTTP2_FLAG_ACK, NULL, 0); in nghttp2_session_on_settings_received()
4557 return session_handle_invalid_connection(session, frame, in nghttp2_session_on_settings_received()
4562 return session_call_on_frame_received(session, frame); in nghttp2_session_on_settings_received()
4565 static int session_process_settings_frame(nghttp2_session *session) { in session_process_settings_frame() argument
4566 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_settings_frame()
4599 return nghttp2_session_on_settings_received(session, frame, 0 /* ACK */); in session_process_settings_frame()
4602 int nghttp2_session_on_push_promise_received(nghttp2_session *session, in nghttp2_session_on_push_promise_received() argument
4611 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0"); in nghttp2_session_on_push_promise_received()
4613 if (session->server || session->local_settings.enable_push == 0) { in nghttp2_session_on_push_promise_received()
4615 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled"); in nghttp2_session_on_push_promise_received()
4618 if (!nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) { in nghttp2_session_on_push_promise_received()
4620 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id"); in nghttp2_session_on_push_promise_received()
4623 if (!session_allow_incoming_new_stream(session)) { in nghttp2_session_on_push_promise_received()
4628 if (!session_is_new_peer_stream_id(session, in nghttp2_session_on_push_promise_received()
4634 session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_push_promise_received()
4638 if (session_detect_idle_stream(session, frame->hd.stream_id)) { in nghttp2_session_on_push_promise_received()
4640 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle"); in nghttp2_session_on_push_promise_received()
4643 session->last_recv_stream_id = frame->push_promise.promised_stream_id; in nghttp2_session_on_push_promise_received()
4644 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_on_push_promise_received()
4646 !session->pending_enable_push || in nghttp2_session_on_push_promise_received()
4647 session->num_incoming_reserved_streams >= in nghttp2_session_on_push_promise_received()
4648 session->max_incoming_reserved_streams) { in nghttp2_session_on_push_promise_received()
4653 session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL); in nghttp2_session_on_push_promise_received()
4662 session, frame, NGHTTP2_ERR_STREAM_CLOSED, in nghttp2_session_on_push_promise_received()
4670 session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE, in nghttp2_session_on_push_promise_received()
4680 session->last_proc_stream_id = session->last_recv_stream_id; in nghttp2_session_on_push_promise_received()
4681 rv = session_call_on_begin_headers(session, frame); in nghttp2_session_on_push_promise_received()
4688 static int session_process_push_promise_frame(nghttp2_session *session) { in session_process_push_promise_frame() argument
4690 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_push_promise_frame()
4698 session, NGHTTP2_PROTOCOL_ERROR, "PUSH_PROMISE: could not unpack"); in session_process_push_promise_frame()
4701 return nghttp2_session_on_push_promise_received(session, frame); in session_process_push_promise_frame()
4704 int nghttp2_session_on_ping_received(nghttp2_session *session, in nghttp2_session_on_ping_received() argument
4708 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_ping_received()
4711 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_PING_ACK) == 0 && in nghttp2_session_on_ping_received()
4713 !session_is_closing(session)) { in nghttp2_session_on_ping_received()
4715 rv = nghttp2_session_add_ping(session, NGHTTP2_FLAG_ACK, in nghttp2_session_on_ping_received()
4721 return session_call_on_frame_received(session, frame); in nghttp2_session_on_ping_received()
4724 static int session_process_ping_frame(nghttp2_session *session) { in session_process_ping_frame() argument
4725 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_ping_frame()
4730 return nghttp2_session_on_ping_received(session, frame); in session_process_ping_frame()
4733 int nghttp2_session_on_goaway_received(nghttp2_session *session, in nghttp2_session_on_goaway_received() argument
4738 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_goaway_received()
4744 !nghttp2_session_is_my_stream_id(session, in nghttp2_session_on_goaway_received()
4746 session->remote_last_stream_id < frame->goaway.last_stream_id) { in nghttp2_session_on_goaway_received()
4747 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in nghttp2_session_on_goaway_received()
4751 session->goaway_flags |= NGHTTP2_GOAWAY_RECV; in nghttp2_session_on_goaway_received()
4753 session->remote_last_stream_id = frame->goaway.last_stream_id; in nghttp2_session_on_goaway_received()
4755 rv = session_call_on_frame_received(session, frame); in nghttp2_session_on_goaway_received()
4761 return session_close_stream_on_goaway(session, frame->goaway.last_stream_id, in nghttp2_session_on_goaway_received()
4765 static int session_process_goaway_frame(nghttp2_session *session) { in session_process_goaway_frame() argument
4766 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_goaway_frame()
4775 return nghttp2_session_on_goaway_received(session, frame); in session_process_goaway_frame()
4779 session_on_connection_window_update_received(nghttp2_session *session, in session_on_connection_window_update_received() argument
4784 session, frame, NGHTTP2_ERR_PROTO, in session_on_connection_window_update_received()
4789 session->remote_window_size) { in session_on_connection_window_update_received()
4790 return session_handle_invalid_connection(session, frame, in session_on_connection_window_update_received()
4793 session->remote_window_size += frame->window_update.window_size_increment; in session_on_connection_window_update_received()
4795 return session_call_on_frame_received(session, frame); in session_on_connection_window_update_received()
4798 static int session_on_stream_window_update_received(nghttp2_session *session, in session_on_stream_window_update_received() argument
4803 if (session_detect_idle_stream(session, frame->hd.stream_id)) { in session_on_stream_window_update_received()
4804 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO, in session_on_stream_window_update_received()
4808 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in session_on_stream_window_update_received()
4812 if (state_reserved_remote(session, stream)) { in session_on_stream_window_update_received()
4814 session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream"); in session_on_stream_window_update_received()
4818 session, frame, NGHTTP2_ERR_PROTO, in session_on_stream_window_update_received()
4823 return session_handle_invalid_stream(session, frame, in session_on_stream_window_update_received()
4838 return session_call_on_frame_received(session, frame); in session_on_stream_window_update_received()
4841 int nghttp2_session_on_window_update_received(nghttp2_session *session, in nghttp2_session_on_window_update_received() argument
4844 return session_on_connection_window_update_received(session, frame); in nghttp2_session_on_window_update_received()
4846 return session_on_stream_window_update_received(session, frame); in nghttp2_session_on_window_update_received()
4850 static int session_process_window_update_frame(nghttp2_session *session) { in session_process_window_update_frame() argument
4851 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_window_update_frame()
4857 return nghttp2_session_on_window_update_received(session, frame); in session_process_window_update_frame()
4860 int nghttp2_session_on_altsvc_received(nghttp2_session *session, in nghttp2_session_on_altsvc_received() argument
4871 return session_call_on_invalid_frame_recv_callback(session, frame, in nghttp2_session_on_altsvc_received()
4876 return session_call_on_invalid_frame_recv_callback(session, frame, in nghttp2_session_on_altsvc_received()
4880 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_on_altsvc_received()
4891 return session_call_on_invalid_frame_recv_callback(session, frame, in nghttp2_session_on_altsvc_received()
4895 return session_call_on_frame_received(session, frame); in nghttp2_session_on_altsvc_received()
4898 int nghttp2_session_on_origin_received(nghttp2_session *session, in nghttp2_session_on_origin_received() argument
4900 return session_call_on_frame_received(session, frame); in nghttp2_session_on_origin_received()
4903 static int session_process_altsvc_frame(nghttp2_session *session) { in session_process_altsvc_frame() argument
4904 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_altsvc_frame()
4915 return nghttp2_session_on_altsvc_received(session, frame); in session_process_altsvc_frame()
4918 static int session_process_origin_frame(nghttp2_session *session) { in session_process_origin_frame() argument
4919 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_origin_frame()
4921 nghttp2_mem *mem = &session->mem; in session_process_origin_frame()
4934 return nghttp2_session_on_origin_received(session, frame); in session_process_origin_frame()
4937 static int session_process_extension_frame(nghttp2_session *session) { in session_process_extension_frame() argument
4939 nghttp2_inbound_frame *iframe = &session->iframe; in session_process_extension_frame()
4942 rv = session_call_unpack_extension_callback(session); in session_process_extension_frame()
4952 return session_call_on_frame_received(session, frame); in session_process_extension_frame()
4955 int nghttp2_session_on_data_received(nghttp2_session *session, in nghttp2_session_on_data_received() argument
4962 stream = nghttp2_session_get_stream(session, frame->hd.stream_id); in nghttp2_session_on_data_received()
4970 if (session_enforce_http_messaging(session) && in nghttp2_session_on_data_received()
4973 rv = nghttp2_session_add_rst_stream(session, stream->stream_id, in nghttp2_session_on_data_received()
4986 rv = session_call_on_frame_received(session, frame); in nghttp2_session_on_data_received()
4993 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream); in nghttp2_session_on_data_received()
5002 static int session_process_data_frame(nghttp2_session *session) { in session_process_data_frame() argument
5004 nghttp2_frame *public_data_frame = &session->iframe.frame; in session_process_data_frame()
5005 rv = nghttp2_session_on_data_received(session, public_data_frame); in session_process_data_frame()
5032 int nghttp2_session_update_recv_stream_window_size(nghttp2_session *session, in nghttp2_session_update_recv_stream_window_size() argument
5040 return nghttp2_session_add_rst_stream(session, stream->stream_id, in nghttp2_session_update_recv_stream_window_size()
5048 !(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) && in nghttp2_session_update_recv_stream_window_size()
5052 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, in nghttp2_session_update_recv_stream_window_size()
5064 int nghttp2_session_update_recv_connection_window_size(nghttp2_session *session, in nghttp2_session_update_recv_connection_window_size() argument
5067 rv = adjust_recv_window_size(&session->recv_window_size, delta_size, in nghttp2_session_update_recv_connection_window_size()
5068 session->local_window_size); in nghttp2_session_update_recv_connection_window_size()
5070 return nghttp2_session_terminate_session(session, in nghttp2_session_update_recv_connection_window_size()
5073 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) && in nghttp2_session_update_recv_connection_window_size()
5074 session->window_update_queued == 0 && in nghttp2_session_update_recv_connection_window_size()
5075 nghttp2_should_send_window_update(session->local_window_size, in nghttp2_session_update_recv_connection_window_size()
5076 session->recv_window_size)) { in nghttp2_session_update_recv_connection_window_size()
5079 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, 0, in nghttp2_session_update_recv_connection_window_size()
5080 session->recv_window_size); in nghttp2_session_update_recv_connection_window_size()
5085 session->recv_window_size = 0; in nghttp2_session_update_recv_connection_window_size()
5090 static int session_update_consumed_size(nghttp2_session *session, in session_update_consumed_size() argument
5100 return nghttp2_session_terminate_session(session, in session_update_consumed_size()
5113 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, in session_update_consumed_size()
5128 static int session_update_stream_consumed_size(nghttp2_session *session, in session_update_stream_consumed_size() argument
5132 session, &stream->consumed_size, &stream->recv_window_size, in session_update_stream_consumed_size()
5137 static int session_update_connection_consumed_size(nghttp2_session *session, in session_update_connection_consumed_size() argument
5140 session, &session->consumed_size, &session->recv_window_size, in session_update_connection_consumed_size()
5141 session->window_update_queued, 0, delta_size, session->local_window_size); in session_update_connection_consumed_size()
5161 static int session_on_data_received_fail_fast(nghttp2_session *session) { in session_on_data_received_fail_fast() argument
5169 iframe = &session->iframe; in session_on_data_received_fail_fast()
5180 if (session_detect_idle_stream(session, stream_id)) { in session_on_data_received_fail_fast()
5186 stream = nghttp2_session_get_stream(session, stream_id); in session_on_data_received_fail_fast()
5188 stream = nghttp2_session_get_stream_raw(session, stream_id); in session_on_data_received_fail_fast()
5203 if (nghttp2_session_is_my_stream_id(session, stream_id)) { in session_on_data_received_fail_fast()
5222 rv = nghttp2_session_terminate_session_with_reason(session, error_code, in session_on_data_received_fail_fast()
5369 ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in, in nghttp2_session_mem_recv() argument
5372 nghttp2_inbound_frame *iframe = &session->iframe; in nghttp2_session_mem_recv()
5391 session->recv_window_size, session->local_window_size); in nghttp2_session_mem_recv()
5393 mem = &session->mem; in nghttp2_session_mem_recv()
5398 rv = nghttp2_session_adjust_idle_stream(session); in nghttp2_session_mem_recv()
5403 if (!nghttp2_session_want_read(session)) { in nghttp2_session_mem_recv()
5422 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
5440 session, NGHTTP2_ERR_SETTINGS_EXPECTED, in nghttp2_session_mem_recv()
5450 session, NGHTTP2_PROTOCOL_ERROR, "SETTINGS expected"); in nghttp2_session_mem_recv()
5481 if (iframe->frame.hd.length > session->local_settings.max_frame_size) { in nghttp2_session_mem_recv()
5483 session->local_settings.max_frame_size); in nghttp2_session_mem_recv()
5486 session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size"); in nghttp2_session_mem_recv()
5505 rv = session_on_data_received_fail_fast(session); in nghttp2_session_mem_recv()
5523 session, NGHTTP2_PROTOCOL_ERROR, in nghttp2_session_mem_recv()
5551 session, NGHTTP2_PROTOCOL_ERROR, in nghttp2_session_mem_recv()
5583 rv = session_call_on_begin_frame(session, &iframe->frame.hd); in nghttp2_session_mem_recv()
5591 rv = session_process_headers_frame(session); in nghttp2_session_mem_recv()
5604 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); in nghttp2_session_mem_recv()
5678 if (session->obq_flood_counter_ >= session->max_outbound_ack && in nghttp2_session_mem_recv()
5693 if (iframe->max_niv - 1 > session->max_settings) { in nghttp2_session_mem_recv()
5695 session, NGHTTP2_ENHANCE_YOUR_CALM, in nghttp2_session_mem_recv()
5733 session, NGHTTP2_PROTOCOL_ERROR, in nghttp2_session_mem_recv()
5793 session, NGHTTP2_PROTOCOL_ERROR, "CONTINUATION: unexpected"); in nghttp2_session_mem_recv()
5802 if (check_ext_type_set(session->user_recv_ext_types, in nghttp2_session_mem_recv()
5804 if (!session->callbacks.unpack_extension_callback) { in nghttp2_session_mem_recv()
5822 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ALTSVC) == in nghttp2_session_mem_recv()
5834 if (session->server) { in nghttp2_session_mem_recv()
5853 if (!(session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN)) { in nghttp2_session_mem_recv()
5863 if (session->server || iframe->frame.hd.stream_id || in nghttp2_session_mem_recv()
5907 rv = session_call_on_begin_frame(session, &iframe->frame.hd); in nghttp2_session_mem_recv()
5940 session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: invalid padding"); in nghttp2_session_mem_recv()
5963 rv = session_process_headers_frame(session); in nghttp2_session_mem_recv()
5976 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR); in nghttp2_session_mem_recv()
5993 rv = session_process_priority_frame(session); in nghttp2_session_mem_recv()
6002 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6006 rv = session_process_rst_stream_frame(session); in nghttp2_session_mem_recv()
6015 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6025 session, NGHTTP2_PROTOCOL_ERROR, in nghttp2_session_mem_recv()
6048 rv = session_process_push_promise_frame(session); in nghttp2_session_mem_recv()
6061 session, iframe->frame.push_promise.promised_stream_id, in nghttp2_session_mem_recv()
6079 rv = session_process_ping_frame(session); in nghttp2_session_mem_recv()
6088 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6114 rv = session_process_window_update_frame(session); in nghttp2_session_mem_recv()
6123 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6159 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6201 inflate_header_block(session, &iframe->frame, &hd_proclen, in nghttp2_session_mem_recv()
6229 session, in nghttp2_session_mem_recv()
6248 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6277 rv = session_after_header_block_received(session); in nghttp2_session_mem_recv()
6282 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6305 session->hd_inflater.ctx.bad = 1; in nghttp2_session_mem_recv()
6311 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6317 rv = session_handle_frame_size_error(session); in nghttp2_session_mem_recv()
6347 rv = session_process_settings_frame(session); in nghttp2_session_mem_recv()
6357 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6381 rv = session_process_goaway_frame(session); in nghttp2_session_mem_recv()
6391 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6424 session, NGHTTP2_PROTOCOL_ERROR, in nghttp2_session_mem_recv()
6444 rv = session_call_on_begin_frame(session, &cont_hd); in nghttp2_session_mem_recv()
6469 rv = nghttp2_session_update_recv_connection_window_size(session, readlen); in nghttp2_session_mem_recv()
6480 nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen); in nghttp2_session_mem_recv()
6490 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id); in nghttp2_session_mem_recv()
6493 session, stream, readlen, in nghttp2_session_mem_recv()
6506 session, NGHTTP2_PROTOCOL_ERROR, "DATA: invalid padding"); in nghttp2_session_mem_recv()
6519 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id); in nghttp2_session_mem_recv()
6539 rv = nghttp2_session_update_recv_connection_window_size(session, in nghttp2_session_mem_recv()
6550 session, stream, readlen, in nghttp2_session_mem_recv()
6569 rv = nghttp2_session_consume(session, iframe->frame.hd.stream_id, in nghttp2_session_mem_recv()
6584 if (session_enforce_http_messaging(session)) { in nghttp2_session_mem_recv()
6586 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { in nghttp2_session_mem_recv()
6589 session, (size_t)data_readlen); in nghttp2_session_mem_recv()
6601 session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR); in nghttp2_session_mem_recv()
6610 if (session->callbacks.on_data_chunk_recv_callback) { in nghttp2_session_mem_recv()
6611 rv = session->callbacks.on_data_chunk_recv_callback( in nghttp2_session_mem_recv()
6612 session, iframe->frame.hd.flags, iframe->frame.hd.stream_id, in nghttp2_session_mem_recv()
6613 in - readlen, (size_t)data_readlen, session->user_data); in nghttp2_session_mem_recv()
6629 rv = session_process_data_frame(session); in nghttp2_session_mem_recv()
6634 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6650 rv = nghttp2_session_update_recv_connection_window_size(session, in nghttp2_session_mem_recv()
6660 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) { in nghttp2_session_mem_recv()
6663 rv = session_update_connection_consumed_size(session, readlen); in nghttp2_session_mem_recv()
6679 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6696 session, in - readlen, readlen); in nghttp2_session_mem_recv()
6714 rv = session_process_extension_frame(session); in nghttp2_session_mem_recv()
6719 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6742 rv = session_process_altsvc_frame(session); in nghttp2_session_mem_recv()
6747 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6771 rv = session_process_origin_frame(session); in nghttp2_session_mem_recv()
6781 session_inbound_frame_reset(session); in nghttp2_session_mem_recv()
6798 int nghttp2_session_recv(nghttp2_session *session) { in nghttp2_session_recv() argument
6802 readlen = session_recv(session, buf, sizeof(buf)); in nghttp2_session_recv()
6804 ssize_t proclen = nghttp2_session_mem_recv(session, buf, (size_t)readlen); in nghttp2_session_recv()
6823 static size_t session_get_num_active_streams(nghttp2_session *session) { in session_get_num_active_streams() argument
6824 return nghttp2_map_size(&session->streams) - session->num_closed_streams - in session_get_num_active_streams()
6825 session->num_idle_streams; in session_get_num_active_streams()
6828 int nghttp2_session_want_read(nghttp2_session *session) { in nghttp2_session_want_read() argument
6833 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) { in nghttp2_session_want_read()
6837 num_active_streams = session_get_num_active_streams(session); in nghttp2_session_want_read()
6848 return (session->goaway_flags & in nghttp2_session_want_read()
6852 int nghttp2_session_want_write(nghttp2_session *session) { in nghttp2_session_want_write() argument
6855 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) { in nghttp2_session_want_write()
6865 return session->aob.item || nghttp2_outbound_queue_top(&session->ob_urgent) || in nghttp2_session_want_write()
6866 nghttp2_outbound_queue_top(&session->ob_reg) || in nghttp2_session_want_write()
6867 (!nghttp2_pq_empty(&session->root.obq) && in nghttp2_session_want_write()
6868 session->remote_window_size > 0) || in nghttp2_session_want_write()
6869 (nghttp2_outbound_queue_top(&session->ob_syn) && in nghttp2_session_want_write()
6870 !session_is_outgoing_concurrent_streams_max(session)); in nghttp2_session_want_write()
6873 int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags, in nghttp2_session_add_ping() argument
6880 mem = &session->mem; in nghttp2_session_add_ping()
6883 session->obq_flood_counter_ >= session->max_outbound_ack) { in nghttp2_session_add_ping()
6898 rv = nghttp2_session_add_item(session, item); in nghttp2_session_add_ping()
6907 ++session->obq_flood_counter_; in nghttp2_session_add_ping()
6913 int nghttp2_session_add_goaway(nghttp2_session *session, int32_t last_stream_id, in nghttp2_session_add_goaway() argument
6923 mem = &session->mem; in nghttp2_session_add_goaway()
6925 if (nghttp2_session_is_my_stream_id(session, last_stream_id)) { in nghttp2_session_add_goaway()
6952 last_stream_id = nghttp2_min(last_stream_id, session->local_last_stream_id); in nghttp2_session_add_goaway()
6960 rv = nghttp2_session_add_item(session, item); in nghttp2_session_add_goaway()
6969 int nghttp2_session_add_window_update(nghttp2_session *session, uint8_t flags, in nghttp2_session_add_window_update() argument
6977 mem = &session->mem; in nghttp2_session_add_window_update()
6990 rv = nghttp2_session_add_item(session, item); in nghttp2_session_add_window_update()
7001 session_append_inflight_settings(nghttp2_session *session, in session_append_inflight_settings() argument
7005 for (i = &session->inflight_settings_head; *i; i = &(*i)->next) in session_append_inflight_settings()
7011 int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags, in nghttp2_session_add_settings() argument
7021 mem = &session->mem; in nghttp2_session_add_settings()
7028 if (session->obq_flood_counter_ >= session->max_outbound_ack) { in nghttp2_session_add_settings()
7067 rv = nghttp2_session_add_item(session, item); in nghttp2_session_add_settings()
7081 ++session->obq_flood_counter_; in nghttp2_session_add_settings()
7083 session_append_inflight_settings(session, inflight_settings); in nghttp2_session_add_settings()
7092 session->pending_local_max_concurrent_stream = iv[i - 1].value; in nghttp2_session_add_settings()
7099 session->pending_enable_push = (uint8_t)iv[i - 1].value; in nghttp2_session_add_settings()
7106 session->pending_enable_connect_protocol = (uint8_t)iv[i - 1].value; in nghttp2_session_add_settings()
7114 int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs, in nghttp2_session_pack_data() argument
7129 if (session->callbacks.read_length_callback) { in nghttp2_session_pack_data()
7131 payloadlen = session->callbacks.read_length_callback( in nghttp2_session_pack_data()
7132 session, frame->hd.type, stream->stream_id, session->remote_window_size, in nghttp2_session_pack_data()
7133 stream->remote_window_size, session->remote_settings.max_frame_size, in nghttp2_session_pack_data()
7134 session->user_data); in nghttp2_session_pack_data()
7138 payloadlen = nghttp2_session_enforce_flow_control_limits(session, stream, in nghttp2_session_pack_data()
7150 rv = nghttp2_bufs_realloc(&session->aob.framebufs, in nghttp2_session_pack_data()
7161 assert(&session->aob.framebufs == bufs); in nghttp2_session_pack_data()
7174 session, frame->hd.stream_id, buf->pos, datamax, &data_flags, in nghttp2_session_pack_data()
7175 &aux_data->data_prd.source, session->user_data); in nghttp2_session_pack_data()
7209 if (session->callbacks.send_data_callback == NULL) { in nghttp2_session_pack_data()
7223 session_call_select_padding(session, frame, max_payloadlen); in nghttp2_session_pack_data()
7252 void *nghttp2_session_get_stream_user_data(nghttp2_session *session, in nghttp2_session_get_stream_user_data() argument
7255 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_user_data()
7263 int nghttp2_session_set_stream_user_data(nghttp2_session *session, in nghttp2_session_set_stream_user_data() argument
7270 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_set_stream_user_data()
7276 if (session->server || !nghttp2_session_is_my_stream_id(session, stream_id) || in nghttp2_session_set_stream_user_data()
7277 !nghttp2_outbound_queue_top(&session->ob_syn)) { in nghttp2_session_set_stream_user_data()
7281 frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame; in nghttp2_session_set_stream_user_data()
7285 (uint32_t)stream_id >= session->next_stream_id) { in nghttp2_session_set_stream_user_data()
7289 for (item = session->ob_syn.head; item; item = item->qnext) { in nghttp2_session_set_stream_user_data()
7305 int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) { in nghttp2_session_resume_data() argument
7308 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_resume_data()
7323 size_t nghttp2_session_get_outbound_queue_size(nghttp2_session *session) { in nghttp2_session_get_outbound_queue_size() argument
7324 return nghttp2_outbound_queue_size(&session->ob_urgent) + in nghttp2_session_get_outbound_queue_size()
7325 nghttp2_outbound_queue_size(&session->ob_reg) + in nghttp2_session_get_outbound_queue_size()
7326 nghttp2_outbound_queue_size(&session->ob_syn); in nghttp2_session_get_outbound_queue_size()
7331 nghttp2_session_get_stream_effective_recv_data_length(nghttp2_session *session, in nghttp2_session_get_stream_effective_recv_data_length() argument
7334 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_effective_recv_data_length()
7342 nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session, in nghttp2_session_get_stream_effective_local_window_size() argument
7345 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_effective_local_window_size()
7352 int32_t nghttp2_session_get_stream_local_window_size(nghttp2_session *session, in nghttp2_session_get_stream_local_window_size() argument
7356 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_local_window_size()
7373 nghttp2_session_get_effective_recv_data_length(nghttp2_session *session) { in nghttp2_session_get_effective_recv_data_length() argument
7374 return session->recv_window_size < 0 ? 0 : session->recv_window_size; in nghttp2_session_get_effective_recv_data_length()
7378 nghttp2_session_get_effective_local_window_size(nghttp2_session *session) { in nghttp2_session_get_effective_local_window_size() argument
7379 return session->local_window_size; in nghttp2_session_get_effective_local_window_size()
7382 int32_t nghttp2_session_get_local_window_size(nghttp2_session *session) { in nghttp2_session_get_local_window_size() argument
7383 return session->local_window_size - session->recv_window_size; in nghttp2_session_get_local_window_size()
7386 int32_t nghttp2_session_get_stream_remote_window_size(nghttp2_session *session, in nghttp2_session_get_stream_remote_window_size() argument
7390 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_remote_window_size()
7400 int32_t nghttp2_session_get_remote_window_size(nghttp2_session *session) { in nghttp2_session_get_remote_window_size() argument
7401 return session->remote_window_size; in nghttp2_session_get_remote_window_size()
7404 uint32_t nghttp2_session_get_remote_settings(nghttp2_session *session, in nghttp2_session_get_remote_settings() argument
7408 return session->remote_settings.header_table_size; in nghttp2_session_get_remote_settings()
7410 return session->remote_settings.enable_push; in nghttp2_session_get_remote_settings()
7412 return session->remote_settings.max_concurrent_streams; in nghttp2_session_get_remote_settings()
7414 return session->remote_settings.initial_window_size; in nghttp2_session_get_remote_settings()
7416 return session->remote_settings.max_frame_size; in nghttp2_session_get_remote_settings()
7418 return session->remote_settings.max_header_list_size; in nghttp2_session_get_remote_settings()
7420 return session->remote_settings.enable_connect_protocol; in nghttp2_session_get_remote_settings()
7427 uint32_t nghttp2_session_get_local_settings(nghttp2_session *session, in nghttp2_session_get_local_settings() argument
7431 return session->local_settings.header_table_size; in nghttp2_session_get_local_settings()
7433 return session->local_settings.enable_push; in nghttp2_session_get_local_settings()
7435 return session->local_settings.max_concurrent_streams; in nghttp2_session_get_local_settings()
7437 return session->local_settings.initial_window_size; in nghttp2_session_get_local_settings()
7439 return session->local_settings.max_frame_size; in nghttp2_session_get_local_settings()
7441 return session->local_settings.max_header_list_size; in nghttp2_session_get_local_settings()
7443 return session->local_settings.enable_connect_protocol; in nghttp2_session_get_local_settings()
7450 static int nghttp2_session_upgrade_internal(nghttp2_session *session, in nghttp2_session_upgrade_internal() argument
7462 mem = &session->mem; in nghttp2_session_upgrade_internal()
7464 if ((!session->server && session->next_stream_id != 1) || in nghttp2_session_upgrade_internal()
7465 (session->server && session->last_recv_stream_id >= 1)) { in nghttp2_session_upgrade_internal()
7473 session->max_settings) { in nghttp2_session_upgrade_internal()
7482 if (session->server) { in nghttp2_session_upgrade_internal()
7487 rv = nghttp2_session_on_settings_received(session, &frame, 1 /* No ACK */); in nghttp2_session_upgrade_internal()
7489 rv = nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, niv); in nghttp2_session_upgrade_internal()
7499 session, 1, NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_OPENING, in nghttp2_session_upgrade_internal()
7500 session->server ? NULL : stream_user_data); in nghttp2_session_upgrade_internal()
7508 if (session->server) { in nghttp2_session_upgrade_internal()
7510 session->last_recv_stream_id = 1; in nghttp2_session_upgrade_internal()
7511 session->last_proc_stream_id = 1; in nghttp2_session_upgrade_internal()
7514 session->last_sent_stream_id = 1; in nghttp2_session_upgrade_internal()
7515 session->next_stream_id += 2; in nghttp2_session_upgrade_internal()
7520 int nghttp2_session_upgrade(nghttp2_session *session, in nghttp2_session_upgrade() argument
7527 rv = nghttp2_session_upgrade_internal(session, settings_payload, in nghttp2_session_upgrade()
7533 stream = nghttp2_session_get_stream(session, 1); in nghttp2_session_upgrade()
7549 int nghttp2_session_upgrade2(nghttp2_session *session, in nghttp2_session_upgrade2() argument
7556 rv = nghttp2_session_upgrade_internal(session, settings_payload, in nghttp2_session_upgrade2()
7562 stream = nghttp2_session_get_stream(session, 1); in nghttp2_session_upgrade2()
7572 int nghttp2_session_get_stream_local_close(nghttp2_session *session, in nghttp2_session_get_stream_local_close() argument
7576 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_local_close()
7585 int nghttp2_session_get_stream_remote_close(nghttp2_session *session, in nghttp2_session_get_stream_remote_close() argument
7589 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_get_stream_remote_close()
7598 int nghttp2_session_consume(nghttp2_session *session, int32_t stream_id, in nghttp2_session_consume() argument
7607 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) { in nghttp2_session_consume()
7611 rv = session_update_connection_consumed_size(session, size); in nghttp2_session_consume()
7617 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_consume()
7623 rv = session_update_stream_consumed_size(session, stream, size); in nghttp2_session_consume()
7632 int nghttp2_session_consume_connection(nghttp2_session *session, size_t size) { in nghttp2_session_consume_connection() argument
7635 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) { in nghttp2_session_consume_connection()
7639 rv = session_update_connection_consumed_size(session, size); in nghttp2_session_consume_connection()
7648 int nghttp2_session_consume_stream(nghttp2_session *session, int32_t stream_id, in nghttp2_session_consume_stream() argument
7657 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) { in nghttp2_session_consume_stream()
7661 stream = nghttp2_session_get_stream(session, stream_id); in nghttp2_session_consume_stream()
7667 rv = session_update_stream_consumed_size(session, stream, size); in nghttp2_session_consume_stream()
7676 int nghttp2_session_set_next_stream_id(nghttp2_session *session, in nghttp2_session_set_next_stream_id() argument
7679 session->next_stream_id > (uint32_t)next_stream_id) { in nghttp2_session_set_next_stream_id()
7683 if (session->server) { in nghttp2_session_set_next_stream_id()
7691 session->next_stream_id = (uint32_t)next_stream_id; in nghttp2_session_set_next_stream_id()
7695 uint32_t nghttp2_session_get_next_stream_id(nghttp2_session *session) { in nghttp2_session_get_next_stream_id() argument
7696 return session->next_stream_id; in nghttp2_session_get_next_stream_id()
7699 int32_t nghttp2_session_get_last_proc_stream_id(nghttp2_session *session) { in nghttp2_session_get_last_proc_stream_id() argument
7700 return session->last_proc_stream_id; in nghttp2_session_get_last_proc_stream_id()
7703 nghttp2_stream *nghttp2_session_find_stream(nghttp2_session *session, in nghttp2_session_find_stream() argument
7706 return &session->root; in nghttp2_session_find_stream()
7709 return nghttp2_session_get_stream_raw(session, stream_id); in nghttp2_session_find_stream()
7712 nghttp2_stream *nghttp2_session_get_root_stream(nghttp2_session *session) { in nghttp2_session_get_root_stream() argument
7713 return &session->root; in nghttp2_session_get_root_stream()
7716 int nghttp2_session_check_server_session(nghttp2_session *session) { in nghttp2_session_check_server_session() argument
7717 return session->server; in nghttp2_session_check_server_session()
7721 nghttp2_session *session, int32_t stream_id, in nghttp2_session_change_stream_priority() argument
7731 stream = nghttp2_session_get_stream_raw(session, stream_id); in nghttp2_session_change_stream_priority()
7739 rv = nghttp2_session_reprioritize_stream(session, stream, &pri_spec_copy); in nghttp2_session_change_stream_priority()
7753 int nghttp2_session_create_idle_stream(nghttp2_session *session, in nghttp2_session_create_idle_stream() argument
7760 !session_detect_idle_stream(session, stream_id)) { in nghttp2_session_create_idle_stream()
7764 stream = nghttp2_session_get_stream_raw(session, stream_id); in nghttp2_session_create_idle_stream()
7773 nghttp2_session_open_stream(session, stream_id, NGHTTP2_STREAM_FLAG_NONE, in nghttp2_session_create_idle_stream()
7788 nghttp2_session_get_hd_inflate_dynamic_table_size(nghttp2_session *session) { in nghttp2_session_get_hd_inflate_dynamic_table_size() argument
7789 return nghttp2_hd_inflate_get_dynamic_table_size(&session->hd_inflater); in nghttp2_session_get_hd_inflate_dynamic_table_size()
7793 nghttp2_session_get_hd_deflate_dynamic_table_size(nghttp2_session *session) { in nghttp2_session_get_hd_deflate_dynamic_table_size() argument
7794 return nghttp2_hd_deflate_get_dynamic_table_size(&session->hd_deflater); in nghttp2_session_get_hd_deflate_dynamic_table_size()
7797 void nghttp2_session_set_user_data(nghttp2_session *session, void *user_data) { in nghttp2_session_set_user_data() argument
7798 session->user_data = user_data; in nghttp2_session_set_user_data()