Lines Matching refs:session
49 session_is_outgoing_concurrent_streams_max(nghttp2_session *session) {
50 return session->remote_settings.max_concurrent_streams <=
51 session->num_outgoing_streams;
60 session_is_incoming_concurrent_streams_max(nghttp2_session *session) {
61 return session->local_settings.max_concurrent_streams <=
62 session->num_incoming_streams;
68 * session->pending_local_max_concurrent_stream.
71 session_is_incoming_concurrent_streams_pending_max(nghttp2_session *session) {
72 return session->pending_local_max_concurrent_stream <=
73 session->num_incoming_streams;
87 static int session_enforce_http_messaging(nghttp2_session *session) {
88 return (session->opt_flags & NGHTTP2_OPTMASK_NO_HTTP_MESSAGING) == 0;
94 static int session_trailer_headers(nghttp2_session *session,
100 if (session->server) {
109 static int state_reserved_remote(nghttp2_session *session,
112 !nghttp2_session_is_my_stream_id(session, stream->stream_id);
116 static int state_reserved_local(nghttp2_session *session,
119 nghttp2_session_is_my_stream_id(session, stream->stream_id);
126 static int session_is_new_peer_stream_id(nghttp2_session *session,
129 !nghttp2_session_is_my_stream_id(session, stream_id) &&
130 session->last_recv_stream_id < stream_id;
133 static int session_detect_idle_stream(nghttp2_session *session,
136 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
137 if (session->last_sent_stream_id < stream_id) {
142 if (session_is_new_peer_stream_id(session, stream_id)) {
148 static int session_no_rfc7540_pri_no_fallback(nghttp2_session *session) {
149 return session->pending_no_rfc7540_priorities == 1 &&
150 !session->fallback_rfc7540_priorities;
157 static int session_call_error_callback(nghttp2_session *session,
166 if (!session->callbacks.error_callback &&
167 !session->callbacks.error_callback2) {
171 mem = &session->mem;
195 imagine, but typically we don't want to drop session just for
201 if (session->callbacks.error_callback2) {
202 rv = session->callbacks.error_callback2(session, lib_error_code, buf,
203 (size_t)rv, session->user_data);
205 rv = session->callbacks.error_callback(session, buf, (size_t)rv,
206 session->user_data);
218 static int session_terminate_session(nghttp2_session *session,
225 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) {
230 session. */
231 session->iframe.state = NGHTTP2_IB_IGN_ALL;
241 rv = nghttp2_session_add_goaway(session, last_stream_id, error_code,
249 session->goaway_flags |= NGHTTP2_GOAWAY_TERM_ON_SEND;
254 int nghttp2_session_terminate_session(nghttp2_session *session,
256 return session_terminate_session(session, session->last_proc_stream_id,
260 int nghttp2_session_terminate_session2(nghttp2_session *session,
263 return session_terminate_session(session, last_stream_id, error_code, NULL);
266 int nghttp2_session_terminate_session_with_reason(nghttp2_session *session,
269 return session_terminate_session(session, session->last_proc_stream_id,
273 int nghttp2_session_is_my_stream_id(nghttp2_session *session,
280 if (session->server) {
286 nghttp2_stream *nghttp2_session_get_stream(nghttp2_session *session,
290 stream = (nghttp2_stream *)nghttp2_map_find(&session->streams, stream_id);
300 nghttp2_stream *nghttp2_session_get_stream_raw(nghttp2_session *session,
302 return (nghttp2_stream *)nghttp2_map_find(&session->streams, stream_id);
305 static void session_inbound_frame_reset(nghttp2_session *session) {
306 nghttp2_inbound_frame *iframe = &session->iframe;
307 nghttp2_mem *mem = &session->mem;
347 if (check_ext_type_set(session->user_recv_ext_types,
353 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ALTSVC) == 0) {
359 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN) == 0) {
365 if ((session->builtin_recv_ext_types &
677 nghttp2_session *session;
679 rv = session_new(&session, callbacks, user_data, 0, option, mem);
685 session->next_stream_id = 1;
687 *session_ptr = session;
711 nghttp2_session *session;
713 rv = session_new(&session, callbacks, user_data, 1, option, mem);
719 session->next_stream_id = 2;
721 *session_ptr = session;
727 nghttp2_session *session;
732 session = (nghttp2_session *)ptr;
733 mem = &session->mem;
737 if (item && !item->queued && item != session->aob.item) {
792 void nghttp2_session_del(nghttp2_session *session) {
797 if (session == NULL) {
801 mem = &session->mem;
803 for (settings = session->inflight_settings_head; settings;) {
810 nghttp2_pq_free(&session->sched[i].ob_data);
812 nghttp2_stream_free(&session->root);
816 nghttp2_map_each_free(&session->streams, free_streams, session);
817 nghttp2_map_free(&session->streams);
819 ob_q_free(&session->ob_urgent, mem);
820 ob_q_free(&session->ob_reg, mem);
821 ob_q_free(&session->ob_syn, mem);
823 active_outbound_item_reset(&session->aob, mem);
824 session_inbound_frame_reset(session);
825 nghttp2_hd_deflate_free(&session->hd_deflater);
826 nghttp2_hd_inflate_free(&session->hd_inflater);
827 nghttp2_bufs_free(&session->aob.framebufs);
828 nghttp2_mem_free(mem, session);
832 nghttp2_session *session, nghttp2_stream *stream,
839 assert((!session->server && session->pending_no_rfc7540_priorities != 1) ||
840 (session->server && !session_no_rfc7540_pri_no_fallback(session)));
848 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id);
851 session_detect_idle_stream(session, pri_spec->stream_id)) {
856 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default,
869 dep_stream = &session->root;
919 static int session_ob_data_push(nghttp2_session *session,
934 pq = &session->sched[urgency].ob_data;
951 static void session_ob_data_remove(nghttp2_session *session,
962 nghttp2_pq_remove(&session->sched[urgency].ob_data, &stream->pq_entry);
967 static int session_attach_stream_item(nghttp2_session *session,
981 return session_ob_data_push(session, stream);
984 static void session_detach_stream_item(nghttp2_session *session,
993 session_ob_data_remove(session, stream);
996 static void session_defer_stream_item(nghttp2_session *session,
1005 session_ob_data_remove(session, stream);
1008 static int session_resume_deferred_stream_item(nghttp2_session *session,
1023 return session_ob_data_push(session, stream);
1027 session_sched_get_next_outbound_item(nghttp2_session *session) {
1033 ent = nghttp2_pq_top(&session->sched[i].ob_data);
1045 static int session_sched_empty(nghttp2_session *session) {
1049 if (!nghttp2_pq_empty(&session->sched[i].ob_data)) {
1057 static void session_sched_reschedule_stream(nghttp2_session *session,
1069 pq = &session->sched[urgency].ob_data;
1084 static int session_update_stream_priority(nghttp2_session *session,
1092 session_ob_data_remove(session, stream);
1096 return session_ob_data_push(session, stream);
1104 int nghttp2_session_add_item(nghttp2_session *session,
1113 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
1125 rv = session_attach_stream_item(session, stream, item);
1141 nghttp2_outbound_queue_push(&session->ob_syn, item);
1147 nghttp2_outbound_queue_push(&session->ob_reg, item);
1152 nghttp2_outbound_queue_push(&session->ob_urgent, item);
1159 nghttp2_outbound_queue_push(&session->ob_reg, item);
1176 session, frame->push_promise.promised_stream_id,
1186 nghttp2_outbound_queue_push(&session->ob_reg, item);
1195 session->window_update_queued = 1;
1197 nghttp2_outbound_queue_push(&session->ob_reg, item);
1201 nghttp2_outbound_queue_push(&session->ob_reg, item);
1207 int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id,
1215 mem = &session->mem;
1216 stream = nghttp2_session_get_stream(session, stream_id);
1225 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1226 if ((uint32_t)stream_id >= session->next_stream_id) {
1229 } else if (session->last_recv_stream_id < stream_id) {
1235 if (!session->server && nghttp2_session_is_my_stream_id(session, stream_id) &&
1236 nghttp2_outbound_queue_top(&session->ob_syn)) {
1240 headers_frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
1245 for (item = session->ob_syn.head; item; item = item->qnext) {
1276 rv = nghttp2_session_add_item(session, item);
1285 nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session,
1298 mem = &session->mem;
1299 stream = nghttp2_session_get_stream_raw(session, stream_id);
1301 if (session->opt_flags &
1313 nghttp2_session_detach_idle_stream(session, stream);
1319 if (session_no_rfc7540_pri_no_fallback(session)) {
1332 if (session_no_rfc7540_pri_no_fallback(session) ||
1333 session->remote_settings.no_rfc7540_priorities == 1) {
1337 if (session->server ||
1338 session->remote_settings.no_rfc7540_priorities == 1) {
1343 if (session->pending_no_rfc7540_priorities == 1) {
1347 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id);
1350 session_detect_idle_stream(session, pri_spec->stream_id)) {
1356 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default,
1388 (int32_t)session->remote_settings.initial_window_size,
1389 (int32_t)session->local_settings.initial_window_size,
1392 if (session_no_rfc7540_pri_no_fallback(session)) {
1393 stream->seq = session->stream_seq++;
1396 rv = nghttp2_map_insert(&session->streams, stream_id, stream);
1411 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1417 ++session->num_incoming_reserved_streams;
1425 nghttp2_session_keep_idle_stream(session, stream);
1428 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1429 ++session->num_outgoing_streams;
1431 ++session->num_incoming_streams;
1440 dep_stream = &session->root;
1457 int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
1464 mem = &session->mem;
1465 stream = nghttp2_session_get_stream(session, stream_id);
1478 session_detach_stream_item(session, stream);
1481 (nghttp2_session_prep_frame() will fail). If session->aob.item
1484 if (!item->queued && item != session->aob.item) {
1497 if (session->callbacks.on_stream_close_callback) {
1498 if (session->callbacks.on_stream_close_callback(
1499 session, stream_id, error_code, session->user_data) != 0) {
1505 is_my_stream_id = nghttp2_session_is_my_stream_id(session, stream_id);
1511 --session->num_incoming_reserved_streams;
1515 --session->num_outgoing_streams;
1517 --session->num_incoming_streams;
1524 if (session->pending_no_rfc7540_priorities == 1) {
1525 return nghttp2_session_destroy_stream(session, stream);
1528 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_CLOSED_STREAMS) == 0 &&
1529 session->server && !is_my_stream_id &&
1534 nghttp2_session_keep_closed_stream(session, stream);
1536 rv = nghttp2_session_destroy_stream(session, stream);
1545 int nghttp2_session_destroy_stream(nghttp2_session *session,
1552 mem = &session->mem;
1561 nghttp2_map_remove(&session->streams, stream->stream_id);
1568 void nghttp2_session_keep_closed_stream(nghttp2_session *session,
1573 if (session->closed_stream_tail) {
1574 session->closed_stream_tail->closed_next = stream;
1575 stream->closed_prev = session->closed_stream_tail;
1577 session->closed_stream_head = stream;
1579 session->closed_stream_tail = stream;
1581 ++session->num_closed_streams;
1584 void nghttp2_session_keep_idle_stream(nghttp2_session *session,
1589 if (session->idle_stream_tail) {
1590 session->idle_stream_tail->closed_next = stream;
1591 stream->closed_prev = session->idle_stream_tail;
1593 session->idle_stream_head = stream;
1595 session->idle_stream_tail = stream;
1597 ++session->num_idle_streams;
1600 void nghttp2_session_detach_idle_stream(nghttp2_session *session,
1613 session->idle_stream_head = next_stream;
1619 session->idle_stream_tail = prev_stream;
1625 --session->num_idle_streams;
1628 int nghttp2_session_adjust_closed_stream(nghttp2_session *session) {
1632 if (session->local_settings.max_concurrent_streams ==
1634 num_stream_max = session->pending_local_max_concurrent_stream;
1636 num_stream_max = session->local_settings.max_concurrent_streams;
1641 session->num_closed_streams, session->num_incoming_streams,
1644 while (session->num_closed_streams > 0 &&
1645 session->num_closed_streams + session->num_incoming_streams >
1650 head_stream = session->closed_stream_head;
1656 rv = nghttp2_session_destroy_stream(session, head_stream);
1663 session->closed_stream_head = next;
1665 if (session->closed_stream_head) {
1666 session->closed_stream_head->closed_prev = NULL;
1668 session->closed_stream_tail = NULL;
1671 --session->num_closed_streams;
1677 int nghttp2_session_adjust_idle_stream(nghttp2_session *session) {
1685 16, nghttp2_min(session->local_settings.max_concurrent_streams,
1686 session->pending_local_max_concurrent_stream)));
1689 session->num_idle_streams, max);
1691 while (session->num_idle_streams > max) {
1695 head = session->idle_stream_head;
1700 rv = nghttp2_session_destroy_stream(session, head);
1707 session->idle_stream_head = next;
1709 if (session->idle_stream_head) {
1710 session->idle_stream_head->closed_prev = NULL;
1712 session->idle_stream_tail = NULL;
1715 --session->num_idle_streams;
1734 int nghttp2_session_close_stream_if_shut_rdwr(nghttp2_session *session,
1737 return nghttp2_session_close_stream(session, stream->stream_id,
1747 static int session_allow_incoming_new_stream(nghttp2_session *session) {
1748 return (session->goaway_flags &
1753 * This function returns nonzero if session is closing.
1755 static int session_is_closing(nghttp2_session *session) {
1756 return (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) != 0 ||
1757 (nghttp2_session_want_read(session) == 0 &&
1758 nghttp2_session_want_write(session) == 0);
1771 * This session is closing.
1773 static int session_predicate_for_stream_send(nghttp2_session *session,
1778 if (session_is_closing(session)) {
1787 int nghttp2_session_check_request_allowed(nghttp2_session *session) {
1788 return !session->server && session->next_stream_id <= INT32_MAX &&
1789 (session->goaway_flags & NGHTTP2_GOAWAY_RECV) == 0 &&
1790 !session_is_closing(session);
1801 * New stream cannot be created because of GOAWAY: session is
1807 static int session_predicate_request_headers_send(nghttp2_session *session,
1812 /* If we are terminating session (NGHTTP2_GOAWAY_TERM_ON_SEND),
1813 GOAWAY was received from peer, or session is about to close, new
1815 if ((session->goaway_flags & NGHTTP2_GOAWAY_RECV) ||
1816 session_is_closing(session)) {
1842 * This session is closing.
1846 static int session_predicate_response_headers_send(nghttp2_session *session,
1849 rv = session_predicate_for_stream_send(session, stream);
1854 if (!session->server) {
1857 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
1872 * |stream| must be reserved state and the |session| is server side.
1887 * This session is closing.
1895 session_predicate_push_response_headers_send(nghttp2_session *session,
1899 rv = session_predicate_for_stream_send(session, stream);
1904 if (!session->server) {
1910 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) {
1934 * This session is closing.
1936 static int session_predicate_headers_send(nghttp2_session *session,
1939 rv = session_predicate_for_stream_send(session, stream);
1951 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
1981 * This session is closing.
1983 static int session_predicate_push_promise_send(nghttp2_session *session,
1987 if (!session->server) {
1991 rv = session_predicate_for_stream_send(session, stream);
1998 if (session->remote_settings.enable_push == 0) {
2004 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) {
2025 * This session is closing.
2027 static int session_predicate_window_update_send(nghttp2_session *session,
2031 if (session_is_closing(session)) {
2039 stream = nghttp2_session_get_stream(session, stream_id);
2046 if (state_reserved_local(session, stream)) {
2052 static int session_predicate_altsvc_send(nghttp2_session *session,
2056 if (session_is_closing(session)) {
2064 stream = nghttp2_session_get_stream(session, stream_id);
2075 static int session_predicate_origin_send(nghttp2_session *session) {
2076 if (session_is_closing(session)) {
2082 static int session_predicate_priority_update_send(nghttp2_session *session,
2086 if (session_is_closing(session)) {
2090 stream = nghttp2_session_get_stream(session, stream_id);
2107 nghttp2_session_enforce_flow_control_limits(nghttp2_session *session,
2112 session->remote_window_size, session->remote_settings.max_frame_size,
2117 session->remote_window_size),
2118 (int32_t)session->remote_settings.max_frame_size);
2127 static size_t nghttp2_session_next_data_read(nghttp2_session *session,
2132 session, stream, NGHTTP2_DATA_PAYLOADLEN);
2156 * This session is closing.
2158 static int nghttp2_session_predicate_data_send(nghttp2_session *session,
2161 rv = session_predicate_for_stream_send(session, stream);
2166 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
2189 static ssize_t session_call_select_padding(nghttp2_session *session,
2198 if (session->callbacks.select_padding_callback) {
2204 rv = session->callbacks.select_padding_callback(
2205 session, frame, max_paddedlen, session->user_data);
2217 static int session_headers_add_pad(nghttp2_session *session,
2225 aob = &session->aob;
2232 session_call_select_padding(session, frame, max_payloadlen);
2250 static size_t session_estimate_headers_payload(nghttp2_session *session,
2254 return nghttp2_hd_deflate_bound(&session->hd_deflater, nva, nvlen) +
2258 static int session_pack_extension(nghttp2_session *session, nghttp2_bufs *bufs,
2265 assert(session->callbacks.pack_extension_callback);
2270 rv = session->callbacks.pack_extension_callback(session, buf->last, buflen,
2271 frame, session->user_data);
2299 static int session_prep_frame(nghttp2_session *session,
2305 mem = &session->mem;
2313 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2319 rv = nghttp2_session_predicate_data_send(session, stream);
2324 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
2326 session_detach_stream_item(session, stream);
2333 next_readmax = nghttp2_session_next_data_read(session, stream);
2338 queue when session->remote_window_size > 0 */
2339 assert(session->remote_window_size > 0);
2341 session_defer_stream_item(session, stream,
2344 session->aob.item = NULL;
2345 active_outbound_item_reset(&session->aob, mem);
2349 rv = nghttp2_session_pack_data(session, &session->aob.framebufs,
2356 session_defer_stream_item(session, stream,
2359 session->aob.item = NULL;
2360 active_outbound_item_reset(&session->aob, mem);
2364 session_detach_stream_item(session, stream);
2366 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
2374 session_detach_stream_item(session, stream);
2391 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
2402 rv = session_predicate_request_headers_send(session, item);
2407 if (session_enforce_http_messaging(session)) {
2413 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2416 rv = session_predicate_push_response_headers_send(session, stream);
2424 } else if (session_predicate_response_headers_send(session, stream) ==
2431 rv = session_predicate_headers_send(session, stream);
2440 session, frame->headers.nva, frame->headers.nvlen,
2443 if (estimated_payloadlen > session->max_send_header_block_length) {
2447 rv = nghttp2_frame_pack_headers(&session->aob.framebufs, &frame->headers,
2448 &session->hd_deflater);
2455 nghttp2_bufs_len(&session->aob.framebufs));
2457 rv = session_headers_add_pad(session, frame);
2464 nghttp2_bufs_len(&session->aob.framebufs));
2467 assert(session->last_sent_stream_id < frame->hd.stream_id);
2468 session->last_sent_stream_id = frame->hd.stream_id;
2474 if (session_is_closing(session)) {
2479 nghttp2_frame_pack_priority(&session->aob.framebufs, &frame->priority);
2488 if (session_is_closing(session)) {
2491 nghttp2_frame_pack_rst_stream(&session->aob.framebufs, &frame->rst_stream);
2495 assert(session->obq_flood_counter_ > 0);
2496 --session->obq_flood_counter_;
2497 /* When session is about to close, don't send SETTINGS ACK.
2501 if (session_is_closing(session)) {
2506 rv = nghttp2_frame_pack_settings(&session->aob.framebufs, &frame->settings);
2518 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2521 rv = session_predicate_push_promise_send(session, stream);
2529 session, frame->push_promise.nva, frame->push_promise.nvlen, 0);
2531 if (estimated_payloadlen > session->max_send_header_block_length) {
2536 &session->aob.framebufs, &frame->push_promise, &session->hd_deflater);
2540 rv = session_headers_add_pad(session, frame);
2545 assert(session->last_sent_stream_id + 2 <=
2547 session->last_sent_stream_id = frame->push_promise.promised_stream_id;
2553 assert(session->obq_flood_counter_ > 0);
2554 --session->obq_flood_counter_;
2558 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) {
2561 nghttp2_frame_pack_ping(&session->aob.framebufs, &frame->ping);
2564 rv = nghttp2_frame_pack_goaway(&session->aob.framebufs, &frame->goaway);
2568 session->local_last_stream_id = frame->goaway.last_stream_id;
2572 rv = session_predicate_window_update_send(session, frame->hd.stream_id);
2576 nghttp2_frame_pack_window_update(&session->aob.framebufs,
2591 if (session_is_closing(session)) {
2595 return session_pack_extension(session, &session->aob.framebufs, frame);
2600 rv = session_predicate_altsvc_send(session, frame->hd.stream_id);
2605 nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
2609 rv = session_predicate_origin_send(session);
2614 rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext);
2622 rv = session_predicate_priority_update_send(session,
2628 nghttp2_frame_pack_priority_update(&session->aob.framebufs, &frame->ext);
2642 nghttp2_session_get_next_ob_item(nghttp2_session *session) {
2645 if (nghttp2_outbound_queue_top(&session->ob_urgent)) {
2646 return nghttp2_outbound_queue_top(&session->ob_urgent);
2649 if (nghttp2_outbound_queue_top(&session->ob_reg)) {
2650 return nghttp2_outbound_queue_top(&session->ob_reg);
2653 if (!session_is_outgoing_concurrent_streams_max(session)) {
2654 if (nghttp2_outbound_queue_top(&session->ob_syn)) {
2655 return nghttp2_outbound_queue_top(&session->ob_syn);
2659 if (session->remote_window_size > 0) {
2660 item = nghttp2_stream_next_outbound_item(&session->root);
2665 return session_sched_get_next_outbound_item(session);
2672 nghttp2_session_pop_next_ob_item(nghttp2_session *session) {
2675 item = nghttp2_outbound_queue_top(&session->ob_urgent);
2677 nghttp2_outbound_queue_pop(&session->ob_urgent);
2682 item = nghttp2_outbound_queue_top(&session->ob_reg);
2684 nghttp2_outbound_queue_pop(&session->ob_reg);
2689 if (!session_is_outgoing_concurrent_streams_max(session)) {
2690 item = nghttp2_outbound_queue_top(&session->ob_syn);
2692 nghttp2_outbound_queue_pop(&session->ob_syn);
2698 if (session->remote_window_size > 0) {
2699 item = nghttp2_stream_next_outbound_item(&session->root);
2704 return session_sched_get_next_outbound_item(session);
2710 static int session_call_before_frame_send(nghttp2_session *session,
2713 if (session->callbacks.before_frame_send_callback) {
2714 rv = session->callbacks.before_frame_send_callback(session, frame,
2715 session->user_data);
2727 static int session_call_on_frame_send(nghttp2_session *session,
2730 if (session->callbacks.on_frame_send_callback) {
2731 rv = session->callbacks.on_frame_send_callback(session, frame,
2732 session->user_data);
2747 if (nghttp2_session_is_my_stream_id(arg->session, stream->stream_id)) {
2778 static int session_close_stream_on_goaway(nghttp2_session *session,
2783 nghttp2_close_stream_on_goaway_arg arg = {session, NULL, last_stream_id,
2786 rv = nghttp2_map_each(&session->streams, find_stream_on_goaway_func, &arg);
2793 rv = nghttp2_session_close_stream(session, stream->stream_id,
2814 static void session_reschedule_stream(nghttp2_session *session,
2823 if (!session->server) {
2827 session_sched_reschedule_stream(session, stream);
2830 static int session_update_stream_consumed_size(nghttp2_session *session,
2834 static int session_update_connection_consumed_size(nghttp2_session *session,
2840 * or RST_STREAM. This function does not reset session->aob. It is a
2851 static int session_after_frame_sent1(nghttp2_session *session) {
2853 nghttp2_active_outbound_item *aob = &session->aob;
2866 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2870 session->remote_window_size -= (int32_t)frame->hd.length;
2876 session_detach_stream_item(session, stream);
2881 if (session->callbacks.on_frame_send_callback) {
2882 rv = session_call_on_frame_send(session, frame);
2896 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2908 if (session->callbacks.on_frame_send_callback) {
2909 rv = session_call_on_frame_send(session, frame);
2927 rv = session_call_on_frame_send(session, frame);
2935 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2946 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2954 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM,
2966 ++session->num_outgoing_streams;
2975 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2982 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM,
2998 if (session->server || session->pending_no_rfc7540_priorities == 1) {
3002 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
3005 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
3010 session, frame->hd.stream_id, NGHTTP2_FLAG_NONE,
3016 rv = nghttp2_session_reprioritize_stream(session, stream,
3023 rv = nghttp2_session_adjust_idle_stream(session);
3031 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
3045 session->goaway_flags |= NGHTTP2_GOAWAY_TERM_SENT;
3048 session->goaway_flags |= NGHTTP2_GOAWAY_SENT;
3050 rv = session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
3062 session->window_update_queued = 0;
3063 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
3064 rv = session_update_connection_consumed_size(session, 0);
3066 rv = nghttp2_session_update_recv_connection_window_size(session, 0);
3076 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3089 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
3090 rv = session_update_stream_consumed_size(session, stream, 0);
3093 nghttp2_session_update_recv_stream_window_size(session, stream, 0, 1);
3108 * function is responsible to reset session->aob.
3110 static void session_after_frame_sent2(nghttp2_session *session) {
3111 nghttp2_active_outbound_item *aob = &session->aob;
3119 mem = &session->mem;
3137 active_outbound_item_reset(&session->aob, mem);
3159 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3161 /* If session is closed or RST_STREAM was queued, we won't send
3163 if (nghttp2_session_predicate_data_send(session, stream) != 0) {
3165 session_detach_stream_item(session, stream);
3174 active_outbound_item_reset(&session->aob, mem);
3179 static int session_call_send_data(nghttp2_session *session,
3193 rv = session->callbacks.send_data_callback(session, frame, buf->pos, length,
3195 session->user_data);
3208 static ssize_t nghttp2_session_mem_send_internal(nghttp2_session *session,
3216 mem = &session->mem;
3217 aob = &session->aob;
3223 rv = nghttp2_session_adjust_idle_stream(session);
3233 item = nghttp2_session_pop_next_ob_item(session);
3238 rv = session_prep_frame(session, item);
3256 session->callbacks.on_frame_not_send_callback && is_non_fatal(rv)) {
3262 session->callbacks.on_frame_not_send_callback(
3263 session, frame, rv, session->user_data) != 0) {
3292 rv2 = nghttp2_session_close_stream(session, opened_stream_id,
3307 rv = nghttp2_session_terminate_session(session,
3330 rv = session_call_before_frame_send(session, frame);
3339 if (session->callbacks.on_frame_not_send_callback) {
3340 if (session->callbacks.on_frame_not_send_callback(
3341 session, frame, rv, session->user_data) != 0) {
3367 rv2 = nghttp2_session_close_stream(session, opened_stream_id,
3407 session_after_frame_sent2(session);
3409 rv = session_after_frame_sent1(session);
3415 session_after_frame_sent2(session);
3439 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3448 rv = session_call_send_data(session, aob->item, framebufs);
3454 session_detach_stream_item(session, stream);
3456 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
3473 rv = session_after_frame_sent1(session);
3478 session_after_frame_sent2(session);
3511 ssize_t nghttp2_session_mem_send(nghttp2_session *session,
3518 len = nghttp2_session_mem_send_internal(session, data_ptr, 1);
3523 if (session->aob.item) {
3528 rv = session_after_frame_sent1(session);
3538 int nghttp2_session_send(nghttp2_session *session) {
3544 framebufs = &session->aob.framebufs;
3547 datalen = nghttp2_session_mem_send_internal(session, &data, 0);
3551 sentlen = session->callbacks.send_callback(session, data, (size_t)datalen,
3552 0, session->user_data);
3567 static ssize_t session_recv(nghttp2_session *session, uint8_t *buf,
3570 rv = session->callbacks.recv_callback(session, buf, len, 0,
3571 session->user_data);
3582 static int session_call_on_begin_frame(nghttp2_session *session,
3586 if (session->callbacks.on_begin_frame_callback) {
3588 rv = session->callbacks.on_begin_frame_callback(session, hd,
3589 session->user_data);
3599 static int session_call_on_frame_received(nghttp2_session *session,
3602 if (session->callbacks.on_frame_recv_callback) {
3603 rv = session->callbacks.on_frame_recv_callback(session, frame,
3604 session->user_data);
3612 static int session_call_on_begin_headers(nghttp2_session *session,
3617 if (session->callbacks.on_begin_headers_callback) {
3618 rv = session->callbacks.on_begin_headers_callback(session, frame,
3619 session->user_data);
3630 static int session_call_on_header(nghttp2_session *session,
3634 if (session->callbacks.on_header_callback2) {
3635 rv = session->callbacks.on_header_callback2(
3636 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3637 } else if (session->callbacks.on_header_callback) {
3638 rv = session->callbacks.on_header_callback(
3639 session, frame, nv->name->base, nv->name->len, nv->value->base,
3640 nv->value->len, nv->flags, session->user_data);
3653 static int session_call_on_invalid_header(nghttp2_session *session,
3657 if (session->callbacks.on_invalid_header_callback2) {
3658 rv = session->callbacks.on_invalid_header_callback2(
3659 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3660 } else if (session->callbacks.on_invalid_header_callback) {
3661 rv = session->callbacks.on_invalid_header_callback(
3662 session, frame, nv->name->base, nv->name->len, nv->value->base,
3663 nv->value->len, nv->flags, session->user_data);
3679 session_call_on_extension_chunk_recv_callback(nghttp2_session *session,
3682 nghttp2_inbound_frame *iframe = &session->iframe;
3685 if (session->callbacks.on_extension_chunk_recv_callback) {
3686 rv = session->callbacks.on_extension_chunk_recv_callback(
3687 session, &frame->hd, data, len, session->user_data);
3699 static int session_call_unpack_extension_callback(nghttp2_session *session) {
3701 nghttp2_inbound_frame *iframe = &session->iframe;
3705 rv = session->callbacks.unpack_extension_callback(
3706 session, &payload, &frame->hd, session->user_data);
3728 static int session_handle_frame_size_error(nghttp2_session *session) {
3731 return nghttp2_session_terminate_session(session, NGHTTP2_FRAME_SIZE_ERROR);
3756 * Calls on_invalid_frame_recv_callback if it is set to |session|.
3764 static int session_call_on_invalid_frame_recv_callback(nghttp2_session *session,
3767 if (session->callbacks.on_invalid_frame_recv_callback) {
3768 if (session->callbacks.on_invalid_frame_recv_callback(
3769 session, frame, lib_error_code, session->user_data) != 0) {
3776 static int session_handle_invalid_stream2(nghttp2_session *session,
3782 session, stream_id, get_error_code_from_lib_error_code(lib_error_code));
3786 if (session->callbacks.on_invalid_frame_recv_callback) {
3787 if (session->callbacks.on_invalid_frame_recv_callback(
3788 session, frame, lib_error_code, session->user_data) != 0) {
3795 static int session_handle_invalid_stream(nghttp2_session *session,
3798 return session_handle_invalid_stream2(session, frame->hd.stream_id, frame,
3802 static int session_inflate_handle_invalid_stream(nghttp2_session *session,
3806 rv = session_handle_invalid_stream(session, frame, lib_error_code);
3816 static int session_handle_invalid_connection(nghttp2_session *session,
3820 if (session->callbacks.on_invalid_frame_recv_callback) {
3821 if (session->callbacks.on_invalid_frame_recv_callback(
3822 session, frame, lib_error_code, session->user_data) != 0) {
3827 session, get_error_code_from_lib_error_code(lib_error_code), reason);
3830 static int session_inflate_handle_invalid_connection(nghttp2_session *session,
3836 session_handle_invalid_connection(session, frame, lib_error_code, reason);
3870 static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame,
3882 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3886 session, frame->push_promise.promised_stream_id);
3889 trailer = session_trailer_headers(session, stream, frame);
3895 proclen = nghttp2_hd_inflate_hd_nv(&session->hd_inflater, &nv,
3901 if (session->iframe.state == NGHTTP2_IB_READ_HEADER_BLOCK) {
3907 session, subject_stream->stream_id, NGHTTP2_COMPRESSION_ERROR);
3915 nghttp2_session_terminate_session(session, NGHTTP2_COMPRESSION_ERROR);
3931 if (session_enforce_http_messaging(session)) {
3932 rv = nghttp2_http_on_header(session, subject_stream, frame, &nv,
3939 rv2 = session_call_on_invalid_header(session, frame, &nv);
3953 session, NGHTTP2_ERR_HTTP_HEADER,
3971 session, NGHTTP2_ERR_HTTP_HEADER,
3981 rv = session_handle_invalid_stream2(session,
3991 rv = session_call_on_header(session, frame, &nv);
4001 nghttp2_hd_inflate_end_headers(&session->hd_inflater);
4022 static int session_end_stream_headers_received(nghttp2_session *session,
4029 if (session->server && session_enforce_http_messaging(session) &&
4034 rv = session_update_stream_priority(session, stream, stream->http_extpri);
4046 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
4054 static int session_after_header_block_received(nghttp2_session *session) {
4056 nghttp2_frame *frame = &session->iframe.frame;
4061 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4066 if (session_enforce_http_messaging(session)) {
4071 session, frame->push_promise.promised_stream_id);
4087 assert(!session->server);
4109 rv = session_handle_invalid_stream2(session, stream_id, frame,
4125 rv = session_call_on_frame_received(session, frame);
4134 return session_end_stream_headers_received(session, frame, stream);
4137 int nghttp2_session_on_request_headers_received(nghttp2_session *session,
4143 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0");
4149 if (!session->server) {
4150 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4152 session, frame, NGHTTP2_ERR_PROTO,
4159 assert(session->server);
4161 if (!session_is_new_peer_stream_id(session, frame->hd.stream_id)) {
4163 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4165 session, frame, NGHTTP2_ERR_PROTO,
4189 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4192 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4197 session->last_recv_stream_id = frame->hd.stream_id;
4199 if (session_is_incoming_concurrent_streams_max(session)) {
4201 session, frame, NGHTTP2_ERR_PROTO,
4205 if (!session_allow_incoming_new_stream(session)) {
4212 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself");
4215 if (session_is_incoming_concurrent_streams_pending_max(session)) {
4216 return session_inflate_handle_invalid_stream(session, frame,
4221 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4227 rv = nghttp2_session_adjust_closed_stream(session);
4232 session->last_proc_stream_id = session->last_recv_stream_id;
4234 rv = session_call_on_begin_headers(session, frame);
4241 int nghttp2_session_on_response_headers_received(nghttp2_session *session,
4248 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id));
4251 session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0");
4263 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4266 rv = session_call_on_begin_headers(session, frame);
4273 int nghttp2_session_on_push_response_headers_received(nghttp2_session *session,
4280 session, frame, NGHTTP2_ERR_PROTO,
4284 if (session->server) {
4286 session, frame, NGHTTP2_ERR_PROTO,
4290 if (session_is_incoming_concurrent_streams_max(session)) {
4292 session, frame, NGHTTP2_ERR_PROTO,
4296 if (!session_allow_incoming_new_stream(session)) {
4301 if (session_is_incoming_concurrent_streams_pending_max(session)) {
4302 return session_inflate_handle_invalid_stream(session, frame,
4307 if (!nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
4308 --session->num_incoming_reserved_streams;
4310 ++session->num_incoming_streams;
4311 rv = session_call_on_begin_headers(session, frame);
4318 int nghttp2_session_on_headers_received(nghttp2_session *session,
4324 session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0");
4336 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4338 if (nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4340 rv = session_call_on_begin_headers(session, frame);
4354 rv = session_call_on_begin_headers(session, frame);
4363 static int session_process_headers_frame(nghttp2_session *session) {
4364 nghttp2_inbound_frame *iframe = &session->iframe;
4370 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4373 return nghttp2_session_on_request_headers_received(session, frame);
4378 return nghttp2_session_on_push_response_headers_received(session, frame,
4383 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4385 return nghttp2_session_on_response_headers_received(session, frame, stream);
4389 return nghttp2_session_on_headers_received(session, frame, stream);
4392 int nghttp2_session_on_priority_received(nghttp2_session *session,
4397 assert(!session_no_rfc7540_pri_no_fallback(session));
4400 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4406 session, NGHTTP2_PROTOCOL_ERROR, "depend on itself");
4409 if (!session->server) {
4411 return session_call_on_frame_received(session, frame);
4414 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4419 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
4424 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4431 rv = nghttp2_session_adjust_idle_stream(session);
4436 rv = nghttp2_session_reprioritize_stream(session, stream,
4443 rv = nghttp2_session_adjust_idle_stream(session);
4449 return session_call_on_frame_received(session, frame);
4452 static int session_process_priority_frame(nghttp2_session *session) {
4453 nghttp2_inbound_frame *iframe = &session->iframe;
4456 assert(!session_no_rfc7540_pri_no_fallback(session));
4460 return nghttp2_session_on_priority_received(session, frame);
4463 static int session_update_stream_reset_ratelim(nghttp2_session *session) {
4464 if (!session->server || (session->goaway_flags & NGHTTP2_GOAWAY_SUBMITTED)) {
4468 nghttp2_ratelim_update(&session->stream_reset_ratelim,
4471 if (nghttp2_ratelim_drain(&session->stream_reset_ratelim, 1) == 0) {
4475 return nghttp2_session_add_goaway(session, session->last_recv_stream_id,
4480 int nghttp2_session_on_rst_stream_received(nghttp2_session *session,
4485 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4489 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4490 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4494 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4500 rv = session_call_on_frame_received(session, frame);
4504 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
4510 return session_update_stream_reset_ratelim(session);
4513 static int session_process_rst_stream_frame(nghttp2_session *session) {
4514 nghttp2_inbound_frame *iframe = &session->iframe;
4519 return nghttp2_session_on_rst_stream_received(session, frame);
4533 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id,
4543 arg->session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL);
4563 session_update_remote_initial_window_size(nghttp2_session *session,
4567 arg.session = session;
4569 arg.old_window_size = (int32_t)session->remote_settings.initial_window_size;
4571 return nghttp2_map_each(&session->streams,
4584 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id,
4592 if (arg->session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
4593 return session_update_stream_consumed_size(arg->session, stream, 0);
4599 rv = nghttp2_session_add_window_update(arg->session, NGHTTP2_FLAG_NONE,
4622 session_update_local_initial_window_size(nghttp2_session *session,
4626 arg.session = session;
4629 return nghttp2_map_each(&session->streams,
4646 int nghttp2_session_update_local_settings(nghttp2_session *session,
4672 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater,
4679 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater,
4687 session, new_initial_window_size,
4688 (int32_t)session->local_settings.initial_window_size);
4697 session->local_settings.header_table_size = iv[i].value;
4700 session->local_settings.enable_push = iv[i].value;
4703 session->local_settings.max_concurrent_streams = iv[i].value;
4706 session->local_settings.initial_window_size = iv[i].value;
4709 session->local_settings.max_frame_size = iv[i].value;
4712 session->local_settings.max_header_list_size = iv[i].value;
4715 session->local_settings.enable_connect_protocol = iv[i].value;
4718 session->local_settings.no_rfc7540_priorities = iv[i].value;
4726 int nghttp2_session_on_settings_received(nghttp2_session *session,
4733 mem = &session->mem;
4736 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4742 session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR,
4746 settings = session->inflight_settings_head;
4750 session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK");
4753 rv = nghttp2_session_update_local_settings(session, settings->iv,
4756 session->inflight_settings_head = settings->next;
4764 return session_handle_invalid_connection(session, frame, rv, NULL);
4766 return session_call_on_frame_received(session, frame);
4769 if (!session->remote_settings_received) {
4770 session->remote_settings.max_concurrent_streams =
4772 session->remote_settings_received = 1;
4781 rv = nghttp2_hd_deflate_change_table_size(&session->hd_deflater,
4788 session, frame, NGHTTP2_ERR_HEADER_COMP, NULL);
4792 session->remote_settings.header_table_size = entry->value;
4799 session, frame, NGHTTP2_ERR_PROTO,
4803 if (!session->server && entry->value != 0) {
4805 session, frame, NGHTTP2_ERR_PROTO,
4809 session->remote_settings.enable_push = entry->value;
4814 session->remote_settings.max_concurrent_streams = entry->value;
4823 session, frame, NGHTTP2_ERR_FLOW_CONTROL,
4827 rv = session_update_remote_initial_window_size(session,
4836 session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL);
4839 session->remote_settings.initial_window_size = entry->value;
4847 session, frame, NGHTTP2_ERR_PROTO,
4851 session->remote_settings.max_frame_size = entry->value;
4856 session->remote_settings.max_header_list_size = entry->value;
4863 session, frame, NGHTTP2_ERR_PROTO,
4867 if (!session->server &&
4868 session->remote_settings.enable_connect_protocol &&
4871 session, frame, NGHTTP2_ERR_PROTO,
4876 session->remote_settings.enable_connect_protocol = entry->value;
4883 session, frame, NGHTTP2_ERR_PROTO,
4887 if (session->remote_settings.no_rfc7540_priorities != UINT32_MAX &&
4888 session->remote_settings.no_rfc7540_priorities != entry->value) {
4890 session, frame, NGHTTP2_ERR_PROTO,
4894 session->remote_settings.no_rfc7540_priorities = entry->value;
4900 if (session->remote_settings.no_rfc7540_priorities == UINT32_MAX) {
4901 session->remote_settings.no_rfc7540_priorities = 0;
4903 if (session->server && session->pending_no_rfc7540_priorities &&
4904 (session->opt_flags &
4906 session->fallback_rfc7540_priorities = 1;
4910 if (!noack && !session_is_closing(session)) {
4911 rv = nghttp2_session_add_settings(session, NGHTTP2_FLAG_ACK, NULL, 0);
4918 return session_handle_invalid_connection(session, frame,
4923 return session_call_on_frame_received(session, frame);
4926 static int session_process_settings_frame(nghttp2_session *session) {
4927 nghttp2_inbound_frame *iframe = &session->iframe;
4960 return nghttp2_session_on_settings_received(session, frame, 0 /* ACK */);
4963 int nghttp2_session_on_push_promise_received(nghttp2_session *session,
4972 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0");
4974 if (session->server || session->local_settings.enable_push == 0) {
4976 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled");
4979 if (!nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4981 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id");
4984 if (!session_allow_incoming_new_stream(session)) {
4989 if (!session_is_new_peer_stream_id(session,
4995 session, frame, NGHTTP2_ERR_PROTO,
4999 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5001 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle");
5004 session->last_recv_stream_id = frame->push_promise.promised_stream_id;
5005 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5007 !session->pending_enable_push ||
5008 session->num_incoming_reserved_streams >=
5009 session->max_incoming_reserved_streams) {
5014 session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL);
5023 session, frame, NGHTTP2_ERR_STREAM_CLOSED,
5031 session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE,
5041 session->last_proc_stream_id = session->last_recv_stream_id;
5042 rv = session_call_on_begin_headers(session, frame);
5049 static int session_process_push_promise_frame(nghttp2_session *session) {
5050 nghttp2_inbound_frame *iframe = &session->iframe;
5056 return nghttp2_session_on_push_promise_received(session, frame);
5059 int nghttp2_session_on_ping_received(nghttp2_session *session,
5063 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5066 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_PING_ACK) == 0 &&
5068 !session_is_closing(session)) {
5070 rv = nghttp2_session_add_ping(session, NGHTTP2_FLAG_ACK,
5076 return session_call_on_frame_received(session, frame);
5079 static int session_process_ping_frame(nghttp2_session *session) {
5080 nghttp2_inbound_frame *iframe = &session->iframe;
5085 return nghttp2_session_on_ping_received(session, frame);
5088 int nghttp2_session_on_goaway_received(nghttp2_session *session,
5093 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5099 !nghttp2_session_is_my_stream_id(session,
5101 session->remote_last_stream_id < frame->goaway.last_stream_id) {
5102 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5106 session->goaway_flags |= NGHTTP2_GOAWAY_RECV;
5108 session->remote_last_stream_id = frame->goaway.last_stream_id;
5110 rv = session_call_on_frame_received(session, frame);
5116 return session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
5120 static int session_process_goaway_frame(nghttp2_session *session) {
5121 nghttp2_inbound_frame *iframe = &session->iframe;
5130 return nghttp2_session_on_goaway_received(session, frame);
5134 session_on_connection_window_update_received(nghttp2_session *session,
5139 session, frame, NGHTTP2_ERR_PROTO,
5144 session->remote_window_size) {
5145 return session_handle_invalid_connection(session, frame,
5148 session->remote_window_size += frame->window_update.window_size_increment;
5150 return session_call_on_frame_received(session, frame);
5153 static int session_on_stream_window_update_received(nghttp2_session *session,
5158 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5159 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5163 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5167 if (state_reserved_remote(session, stream)) {
5169 session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream");
5173 session, frame, NGHTTP2_ERR_PROTO,
5178 return session_handle_invalid_stream(session, frame,
5187 session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL);
5193 return session_call_on_frame_received(session, frame);
5196 int nghttp2_session_on_window_update_received(nghttp2_session *session,
5199 return session_on_connection_window_update_received(session, frame);
5201 return session_on_stream_window_update_received(session, frame);
5205 static int session_process_window_update_frame(nghttp2_session *session) {
5206 nghttp2_inbound_frame *iframe = &session->iframe;
5212 return nghttp2_session_on_window_update_received(session, frame);
5215 int nghttp2_session_on_altsvc_received(nghttp2_session *session,
5222 /* session->server case has been excluded */
5226 return session_call_on_invalid_frame_recv_callback(session, frame,
5231 return session_call_on_invalid_frame_recv_callback(session, frame,
5235 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5246 return session_call_on_invalid_frame_recv_callback(session, frame,
5250 return session_call_on_frame_received(session, frame);
5253 int nghttp2_session_on_origin_received(nghttp2_session *session,
5255 return session_call_on_frame_received(session, frame);
5258 int nghttp2_session_on_priority_update_received(nghttp2_session *session,
5266 assert(session->server);
5271 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5275 if (nghttp2_session_is_my_stream_id(session, priority_update->stream_id)) {
5276 if (session_detect_idle_stream(session, priority_update->stream_id)) {
5278 session, frame, NGHTTP2_ERR_PROTO,
5283 return session_call_on_frame_received(session, frame);
5286 stream = nghttp2_session_get_stream_raw(session, priority_update->stream_id);
5290 return session_call_on_frame_received(session, frame);
5292 } else if (session_detect_idle_stream(session, priority_update->stream_id)) {
5293 if (session->num_idle_streams + session->num_incoming_streams >=
5294 session->local_settings.max_concurrent_streams) {
5296 session, frame, NGHTTP2_ERR_PROTO,
5301 stream = nghttp2_session_open_stream(session, priority_update->stream_id,
5308 return session_call_on_frame_received(session, frame);
5318 return session_call_on_frame_received(session, frame);
5321 rv = session_update_stream_priority(session, stream,
5329 return session_call_on_frame_received(session, frame);
5332 static int session_process_altsvc_frame(nghttp2_session *session) {
5333 nghttp2_inbound_frame *iframe = &session->iframe;
5344 return nghttp2_session_on_altsvc_received(session, frame);
5347 static int session_process_origin_frame(nghttp2_session *session) {
5348 nghttp2_inbound_frame *iframe = &session->iframe;
5350 nghttp2_mem *mem = &session->mem;
5363 return nghttp2_session_on_origin_received(session, frame);
5366 static int session_process_priority_update_frame(nghttp2_session *session) {
5367 nghttp2_inbound_frame *iframe = &session->iframe;
5373 return nghttp2_session_on_priority_update_received(session, frame);
5376 static int session_process_extension_frame(nghttp2_session *session) {
5378 nghttp2_inbound_frame *iframe = &session->iframe;
5381 rv = session_call_unpack_extension_callback(session);
5391 return session_call_on_frame_received(session, frame);
5394 int nghttp2_session_on_data_received(nghttp2_session *session,
5401 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5409 if (session_enforce_http_messaging(session) &&
5412 rv = nghttp2_session_add_rst_stream(session, stream->stream_id,
5425 rv = session_call_on_frame_received(session, frame);
5432 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
5441 static int session_process_data_frame(nghttp2_session *session) {
5443 nghttp2_frame *public_data_frame = &session->iframe.frame;
5444 rv = nghttp2_session_on_data_received(session, public_data_frame);
5471 int nghttp2_session_update_recv_stream_window_size(nghttp2_session *session,
5479 return nghttp2_session_add_rst_stream(session, stream->stream_id,
5487 !(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) &&
5491 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE,
5503 int nghttp2_session_update_recv_connection_window_size(nghttp2_session *session,
5506 rv = adjust_recv_window_size(&session->recv_window_size, delta_size,
5507 session->local_window_size);
5509 return nghttp2_session_terminate_session(session,
5512 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) &&
5513 session->window_update_queued == 0 &&
5514 nghttp2_should_send_window_update(session->local_window_size,
5515 session->recv_window_size)) {
5518 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, 0,
5519 session->recv_window_size);
5524 session->recv_window_size = 0;
5529 static int session_update_consumed_size(nghttp2_session *session,
5539 return nghttp2_session_terminate_session(session,
5552 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE,
5567 static int session_update_stream_consumed_size(nghttp2_session *session,
5571 session, &stream->consumed_size, &stream->recv_window_size,
5576 static int session_update_connection_consumed_size(nghttp2_session *session,
5579 session, &session->consumed_size, &session->recv_window_size,
5580 session->window_update_queued, 0, delta_size, session->local_window_size);
5585 * indicated by |session->iframe.frame.hd.stream_id|. If it is a
5600 static int session_on_data_received_fail_fast(nghttp2_session *session) {
5608 iframe = &session->iframe;
5619 if (session_detect_idle_stream(session, stream_id)) {
5625 stream = nghttp2_session_get_stream(session, stream_id);
5627 stream = nghttp2_session_get_stream_raw(session, stream_id);
5642 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
5661 rv = nghttp2_session_terminate_session_with_reason(session, error_code,
5809 ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
5812 nghttp2_inbound_frame *iframe = &session->iframe;
5831 session->recv_window_size, session->local_window_size);
5833 mem = &session->mem;
5838 rv = nghttp2_session_adjust_idle_stream(session);
5843 if (!nghttp2_session_want_read(session)) {
5862 session_inbound_frame_reset(session);
5880 session, NGHTTP2_ERR_SETTINGS_EXPECTED,
5890 session, NGHTTP2_PROTOCOL_ERROR, "SETTINGS expected");
5921 if (iframe->frame.hd.length > session->local_settings.max_frame_size) {
5923 session->local_settings.max_frame_size);
5926 session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size");
5945 rv = session_on_data_received_fail_fast(session);
5963 session, NGHTTP2_PROTOCOL_ERROR,
5991 session, NGHTTP2_PROTOCOL_ERROR,
6023 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6031 rv = session_process_headers_frame(session);
6044 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6118 if (session->obq_flood_counter_ >= session->max_outbound_ack &&
6133 if (iframe->max_niv - 1 > session->max_settings) {
6135 session, NGHTTP2_ENHANCE_YOUR_CALM,
6173 session, NGHTTP2_PROTOCOL_ERROR,
6233 session, NGHTTP2_PROTOCOL_ERROR, "CONTINUATION: unexpected");
6242 if (check_ext_type_set(session->user_recv_ext_types,
6244 if (!session->callbacks.unpack_extension_callback) {
6262 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ALTSVC) ==
6274 if (session->server) {
6293 if (!(session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN)) {
6303 if (session->server || iframe->frame.hd.stream_id ||
6329 if ((session->builtin_recv_ext_types &
6342 if (!session->server) {
6344 session, NGHTTP2_PROTOCOL_ERROR,
6358 if (!session_no_rfc7540_pri_no_fallback(session) ||
6390 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6423 session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: invalid padding");
6446 rv = session_process_headers_frame(session);
6459 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6476 if (!session_no_rfc7540_pri_no_fallback(session) &&
6477 session->remote_settings.no_rfc7540_priorities != 1) {
6478 rv = session_process_priority_frame(session);
6488 session_inbound_frame_reset(session);
6492 rv = session_process_rst_stream_frame(session);
6501 session_inbound_frame_reset(session);
6511 session, NGHTTP2_PROTOCOL_ERROR,
6534 rv = session_process_push_promise_frame(session);
6547 session, iframe->frame.push_promise.promised_stream_id,
6565 rv = session_process_ping_frame(session);
6574 session_inbound_frame_reset(session);
6600 rv = session_process_window_update_frame(session);
6609 session_inbound_frame_reset(session);
6646 rv = session_process_priority_update_frame(session);
6651 session_inbound_frame_reset(session);
6657 session_inbound_frame_reset(session);
6699 inflate_header_block(session, &iframe->frame, &hd_proclen,
6727 session,
6746 session_inbound_frame_reset(session);
6775 rv = session_after_header_block_received(session);
6780 session_inbound_frame_reset(session);
6803 session->hd_inflater.ctx.bad = 1;
6809 session_inbound_frame_reset(session);
6815 rv = session_handle_frame_size_error(session);
6845 rv = session_process_settings_frame(session);
6855 session_inbound_frame_reset(session);
6879 rv = session_process_goaway_frame(session);
6889 session_inbound_frame_reset(session);
6922 session, NGHTTP2_PROTOCOL_ERROR,
6943 rv = session_call_on_begin_frame(session, &cont_hd);
6968 rv = nghttp2_session_update_recv_connection_window_size(session, readlen);
6979 nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen);
6989 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
6992 session, stream, readlen,
7005 session, NGHTTP2_PROTOCOL_ERROR, "DATA: invalid padding");
7018 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7038 rv = nghttp2_session_update_recv_connection_window_size(session,
7049 session, stream, readlen,
7068 rv = nghttp2_session_consume(session, iframe->frame.hd.stream_id,
7083 if (session_enforce_http_messaging(session)) {
7085 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
7088 session, (size_t)data_readlen);
7100 session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
7109 if (session->callbacks.on_data_chunk_recv_callback) {
7110 rv = session->callbacks.on_data_chunk_recv_callback(
7111 session, iframe->frame.hd.flags, iframe->frame.hd.stream_id,
7112 in - readlen, (size_t)data_readlen, session->user_data);
7128 rv = session_process_data_frame(session);
7133 session_inbound_frame_reset(session);
7149 rv = nghttp2_session_update_recv_connection_window_size(session,
7159 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
7162 rv = session_update_connection_consumed_size(session, readlen);
7178 session_inbound_frame_reset(session);
7195 session, in - readlen, readlen);
7213 rv = session_process_extension_frame(session);
7218 session_inbound_frame_reset(session);
7241 rv = session_process_altsvc_frame(session);
7246 session_inbound_frame_reset(session);
7270 rv = session_process_origin_frame(session);
7280 session_inbound_frame_reset(session);
7297 int nghttp2_session_recv(nghttp2_session *session) {
7301 readlen = session_recv(session, buf, sizeof(buf));
7303 ssize_t proclen = nghttp2_session_mem_recv(session, buf, (size_t)readlen);
7322 static size_t session_get_num_active_streams(nghttp2_session *session) {
7323 return nghttp2_map_size(&session->streams) - session->num_closed_streams -
7324 session->num_idle_streams;
7327 int nghttp2_session_want_read(nghttp2_session *session) {
7332 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) {
7336 num_active_streams = session_get_num_active_streams(session);
7346 received, we are done with this session. */
7347 return (session->goaway_flags &
7351 int nghttp2_session_want_write(nghttp2_session *session) {
7354 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) {
7364 return session->aob.item || nghttp2_outbound_queue_top(&session->ob_urgent) ||
7365 nghttp2_outbound_queue_top(&session->ob_reg) ||
7366 ((!nghttp2_pq_empty(&session->root.obq) ||
7367 !session_sched_empty(session)) &&
7368 session->remote_window_size > 0) ||
7369 (nghttp2_outbound_queue_top(&session->ob_syn) &&
7370 !session_is_outgoing_concurrent_streams_max(session));
7373 int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags,
7380 mem = &session->mem;
7383 session->obq_flood_counter_ >= session->max_outbound_ack) {
7398 rv = nghttp2_session_add_item(session, item);
7407 ++session->obq_flood_counter_;
7413 int nghttp2_session_add_goaway(nghttp2_session *session, int32_t last_stream_id,
7423 mem = &session->mem;
7425 if (nghttp2_session_is_my_stream_id(session, last_stream_id)) {
7452 last_stream_id = nghttp2_min(last_stream_id, session->local_last_stream_id);
7460 rv = nghttp2_session_add_item(session, item);
7467 session->goaway_flags |= NGHTTP2_GOAWAY_SUBMITTED;
7472 int nghttp2_session_add_window_update(nghttp2_session *session, uint8_t flags,
7480 mem = &session->mem;
7493 rv = nghttp2_session_add_item(session, item);
7504 session_append_inflight_settings(nghttp2_session *session,
7508 for (i = &session->inflight_settings_head; *i; i = &(*i)->next)
7514 int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags,
7523 uint8_t no_rfc7540_pri = session->pending_no_rfc7540_priorities;
7525 mem = &session->mem;
7532 if (session->obq_flood_counter_ >= session->max_outbound_ack) {
7586 rv = nghttp2_session_add_item(session, item);
7600 ++session->obq_flood_counter_;
7602 session_append_inflight_settings(session, inflight_settings);
7611 session->pending_local_max_concurrent_stream = iv[i - 1].value;
7618 session->pending_enable_push = (uint8_t)iv[i - 1].value;
7625 session->pending_enable_connect_protocol = (uint8_t)iv[i - 1].value;
7631 session->pending_no_rfc7540_priorities = 0;
7633 session->pending_no_rfc7540_priorities = no_rfc7540_pri;
7639 int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs,
7654 if (session->callbacks.read_length_callback) {
7656 payloadlen = session->callbacks.read_length_callback(
7657 session, frame->hd.type, stream->stream_id, session->remote_window_size,
7658 stream->remote_window_size, session->remote_settings.max_frame_size,
7659 session->user_data);
7663 payloadlen = nghttp2_session_enforce_flow_control_limits(session, stream,
7675 rv = nghttp2_bufs_realloc(&session->aob.framebufs,
7686 assert(&session->aob.framebufs == bufs);
7699 session, frame->hd.stream_id, buf->pos, datamax, &data_flags,
7700 &aux_data->data_prd.source, session->user_data);
7734 if (session->callbacks.send_data_callback == NULL) {
7748 session_call_select_padding(session, frame, max_payloadlen);
7761 session_reschedule_stream(session, stream);
7774 void *nghttp2_session_get_stream_user_data(nghttp2_session *session,
7777 stream = nghttp2_session_get_stream(session, stream_id);
7785 int nghttp2_session_set_stream_user_data(nghttp2_session *session,
7792 stream = nghttp2_session_get_stream(session, stream_id);
7798 if (session->server || !nghttp2_session_is_my_stream_id(session, stream_id) ||
7799 !nghttp2_outbound_queue_top(&session->ob_syn)) {
7803 frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
7807 (uint32_t)stream_id >= session->next_stream_id) {
7811 for (item = session->ob_syn.head; item; item = item->qnext) {
7827 int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) {
7830 stream = nghttp2_session_get_stream(session, stream_id);
7835 rv = session_resume_deferred_stream_item(session, stream,
7845 size_t nghttp2_session_get_outbound_queue_size(nghttp2_session *session) {
7846 return nghttp2_outbound_queue_size(&session->ob_urgent) +
7847 nghttp2_outbound_queue_size(&session->ob_reg) +
7848 nghttp2_outbound_queue_size(&session->ob_syn);
7853 nghttp2_session_get_stream_effective_recv_data_length(nghttp2_session *session,
7856 stream = nghttp2_session_get_stream(session, stream_id);
7864 nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session,
7867 stream = nghttp2_session_get_stream(session, stream_id);
7874 int32_t nghttp2_session_get_stream_local_window_size(nghttp2_session *session,
7878 stream = nghttp2_session_get_stream(session, stream_id);
7895 nghttp2_session_get_effective_recv_data_length(nghttp2_session *session) {
7896 return session->recv_window_size < 0 ? 0 : session->recv_window_size;
7900 nghttp2_session_get_effective_local_window_size(nghttp2_session *session) {
7901 return session->local_window_size;
7904 int32_t nghttp2_session_get_local_window_size(nghttp2_session *session) {
7905 return session->local_window_size - session->recv_window_size;
7908 int32_t nghttp2_session_get_stream_remote_window_size(nghttp2_session *session,
7912 stream = nghttp2_session_get_stream(session, stream_id);
7922 int32_t nghttp2_session_get_remote_window_size(nghttp2_session *session) {
7923 return session->remote_window_size;
7926 uint32_t nghttp2_session_get_remote_settings(nghttp2_session *session,
7930 return session->remote_settings.header_table_size;
7932 return session->remote_settings.enable_push;
7934 return session->remote_settings.max_concurrent_streams;
7936 return session->remote_settings.initial_window_size;
7938 return session->remote_settings.max_frame_size;
7940 return session->remote_settings.max_header_list_size;
7942 return session->remote_settings.enable_connect_protocol;
7944 return session->remote_settings.no_rfc7540_priorities;
7951 uint32_t nghttp2_session_get_local_settings(nghttp2_session *session,
7955 return session->local_settings.header_table_size;
7957 return session->local_settings.enable_push;
7959 return session->local_settings.max_concurrent_streams;
7961 return session->local_settings.initial_window_size;
7963 return session->local_settings.max_frame_size;
7965 return session->local_settings.max_header_list_size;
7967 return session->local_settings.enable_connect_protocol;
7969 return session->local_settings.no_rfc7540_priorities;
7976 static int nghttp2_session_upgrade_internal(nghttp2_session *session,
7988 mem = &session->mem;
7990 if ((!session->server && session->next_stream_id != 1) ||
7991 (session->server && session->last_recv_stream_id >= 1)) {
7999 session->max_settings) {
8008 if (session->server) {
8013 rv = nghttp2_session_on_settings_received(session, &frame, 1 /* No ACK */);
8015 rv = nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, niv);
8025 session, 1, NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_OPENING,
8026 session->server ? NULL : stream_user_data);
8034 if (session->server) {
8036 session->last_recv_stream_id = 1;
8037 session->last_proc_stream_id = 1;
8040 session->last_sent_stream_id = 1;
8041 session->next_stream_id += 2;
8046 int nghttp2_session_upgrade(nghttp2_session *session,
8053 rv = nghttp2_session_upgrade_internal(session, settings_payload,
8059 stream = nghttp2_session_get_stream(session, 1);
8075 int nghttp2_session_upgrade2(nghttp2_session *session,
8082 rv = nghttp2_session_upgrade_internal(session, settings_payload,
8088 stream = nghttp2_session_get_stream(session, 1);
8098 int nghttp2_session_get_stream_local_close(nghttp2_session *session,
8102 stream = nghttp2_session_get_stream(session, stream_id);
8111 int nghttp2_session_get_stream_remote_close(nghttp2_session *session,
8115 stream = nghttp2_session_get_stream(session, stream_id);
8124 int nghttp2_session_consume(nghttp2_session *session, int32_t stream_id,
8133 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8137 rv = session_update_connection_consumed_size(session, size);
8143 stream = nghttp2_session_get_stream(session, stream_id);
8149 rv = session_update_stream_consumed_size(session, stream, size);
8158 int nghttp2_session_consume_connection(nghttp2_session *session, size_t size) {
8161 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8165 rv = session_update_connection_consumed_size(session, size);
8174 int nghttp2_session_consume_stream(nghttp2_session *session, int32_t stream_id,
8183 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8187 stream = nghttp2_session_get_stream(session, stream_id);
8193 rv = session_update_stream_consumed_size(session, stream, size);
8202 int nghttp2_session_set_next_stream_id(nghttp2_session *session,
8205 session->next_stream_id > (uint32_t)next_stream_id) {
8209 if (session->server) {
8217 session->next_stream_id = (uint32_t)next_stream_id;
8221 uint32_t nghttp2_session_get_next_stream_id(nghttp2_session *session) {
8222 return session->next_stream_id;
8225 int32_t nghttp2_session_get_last_proc_stream_id(nghttp2_session *session) {
8226 return session->last_proc_stream_id;
8229 nghttp2_stream *nghttp2_session_find_stream(nghttp2_session *session,
8232 return &session->root;
8235 return nghttp2_session_get_stream_raw(session, stream_id);
8238 nghttp2_stream *nghttp2_session_get_root_stream(nghttp2_session *session) {
8239 return &session->root;
8242 int nghttp2_session_check_server_session(nghttp2_session *session) {
8243 return session->server;
8247 nghttp2_session *session, int32_t stream_id,
8253 if (session->pending_no_rfc7540_priorities == 1) {
8261 stream = nghttp2_session_get_stream_raw(session, stream_id);
8269 rv = nghttp2_session_reprioritize_stream(session, stream, &pri_spec_copy);
8283 int nghttp2_session_create_idle_stream(nghttp2_session *session,
8289 if (session->pending_no_rfc7540_priorities == 1) {
8294 !session_detect_idle_stream(session, stream_id)) {
8298 stream = nghttp2_session_get_stream_raw(session, stream_id);
8307 nghttp2_session_open_stream(session, stream_id, NGHTTP2_STREAM_FLAG_NONE,
8322 nghttp2_session_get_hd_inflate_dynamic_table_size(nghttp2_session *session) {
8323 return nghttp2_hd_inflate_get_dynamic_table_size(&session->hd_inflater);
8327 nghttp2_session_get_hd_deflate_dynamic_table_size(nghttp2_session *session) {
8328 return nghttp2_hd_deflate_get_dynamic_table_size(&session->hd_deflater);
8331 void nghttp2_session_set_user_data(nghttp2_session *session, void *user_data) {
8332 session->user_data = user_data;
8336 nghttp2_session *session, int32_t stream_id,
8341 if (!session->server) {
8345 if (session->pending_no_rfc7540_priorities != 1) {
8353 stream = nghttp2_session_get_stream_raw(session, stream_id);
8366 return session_update_stream_priority(session, stream,