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 &
682 nghttp2_session *session;
684 rv = session_new(&session, callbacks, user_data, 0, option, mem);
690 session->next_stream_id = 1;
692 *session_ptr = session;
716 nghttp2_session *session;
718 rv = session_new(&session, callbacks, user_data, 1, option, mem);
724 session->next_stream_id = 2;
726 *session_ptr = session;
732 nghttp2_session *session;
737 session = (nghttp2_session *)ptr;
738 mem = &session->mem;
742 if (item && !item->queued && item != session->aob.item) {
797 void nghttp2_session_del(nghttp2_session *session) {
802 if (session == NULL) {
806 mem = &session->mem;
808 for (settings = session->inflight_settings_head; settings;) {
815 nghttp2_pq_free(&session->sched[i].ob_data);
817 nghttp2_stream_free(&session->root);
821 nghttp2_map_each_free(&session->streams, free_streams, session);
822 nghttp2_map_free(&session->streams);
824 ob_q_free(&session->ob_urgent, mem);
825 ob_q_free(&session->ob_reg, mem);
826 ob_q_free(&session->ob_syn, mem);
828 active_outbound_item_reset(&session->aob, mem);
829 session_inbound_frame_reset(session);
830 nghttp2_hd_deflate_free(&session->hd_deflater);
831 nghttp2_hd_inflate_free(&session->hd_inflater);
832 nghttp2_bufs_free(&session->aob.framebufs);
833 nghttp2_mem_free(mem, session);
837 nghttp2_session *session, nghttp2_stream *stream,
844 assert((!session->server && session->pending_no_rfc7540_priorities != 1) ||
845 (session->server && !session_no_rfc7540_pri_no_fallback(session)));
853 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id);
856 session_detect_idle_stream(session, pri_spec->stream_id)) {
861 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default,
874 dep_stream = &session->root;
924 static int session_ob_data_push(nghttp2_session *session,
939 pq = &session->sched[urgency].ob_data;
956 static void session_ob_data_remove(nghttp2_session *session,
967 nghttp2_pq_remove(&session->sched[urgency].ob_data, &stream->pq_entry);
972 static int session_attach_stream_item(nghttp2_session *session,
986 return session_ob_data_push(session, stream);
989 static void session_detach_stream_item(nghttp2_session *session,
998 session_ob_data_remove(session, stream);
1001 static void session_defer_stream_item(nghttp2_session *session,
1010 session_ob_data_remove(session, stream);
1013 static int session_resume_deferred_stream_item(nghttp2_session *session,
1028 return session_ob_data_push(session, stream);
1032 session_sched_get_next_outbound_item(nghttp2_session *session) {
1038 ent = nghttp2_pq_top(&session->sched[i].ob_data);
1050 static int session_sched_empty(nghttp2_session *session) {
1054 if (!nghttp2_pq_empty(&session->sched[i].ob_data)) {
1062 static void session_sched_reschedule_stream(nghttp2_session *session,
1074 pq = &session->sched[urgency].ob_data;
1089 static int session_update_stream_priority(nghttp2_session *session,
1097 session_ob_data_remove(session, stream);
1101 return session_ob_data_push(session, stream);
1109 int nghttp2_session_add_item(nghttp2_session *session,
1118 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
1130 rv = session_attach_stream_item(session, stream, item);
1146 nghttp2_outbound_queue_push(&session->ob_syn, item);
1152 nghttp2_outbound_queue_push(&session->ob_reg, item);
1157 nghttp2_outbound_queue_push(&session->ob_urgent, item);
1164 nghttp2_outbound_queue_push(&session->ob_reg, item);
1181 session, frame->push_promise.promised_stream_id,
1191 nghttp2_outbound_queue_push(&session->ob_reg, item);
1200 session->window_update_queued = 1;
1202 nghttp2_outbound_queue_push(&session->ob_reg, item);
1206 nghttp2_outbound_queue_push(&session->ob_reg, item);
1212 int nghttp2_session_add_rst_stream(nghttp2_session *session, int32_t stream_id,
1220 mem = &session->mem;
1221 stream = nghttp2_session_get_stream(session, stream_id);
1230 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1231 if ((uint32_t)stream_id >= session->next_stream_id) {
1234 } else if (session->last_recv_stream_id < stream_id) {
1240 if (!session->server && nghttp2_session_is_my_stream_id(session, stream_id) &&
1241 nghttp2_outbound_queue_top(&session->ob_syn)) {
1245 headers_frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
1250 for (item = session->ob_syn.head; item; item = item->qnext) {
1281 rv = nghttp2_session_add_item(session, item);
1290 nghttp2_stream *nghttp2_session_open_stream(nghttp2_session *session,
1303 mem = &session->mem;
1304 stream = nghttp2_session_get_stream_raw(session, stream_id);
1306 if (session->opt_flags &
1318 nghttp2_session_detach_idle_stream(session, stream);
1324 if (session_no_rfc7540_pri_no_fallback(session)) {
1337 if (session_no_rfc7540_pri_no_fallback(session) ||
1338 session->remote_settings.no_rfc7540_priorities == 1) {
1342 if (session->server ||
1343 session->remote_settings.no_rfc7540_priorities == 1) {
1348 if (session->pending_no_rfc7540_priorities == 1) {
1352 dep_stream = nghttp2_session_get_stream_raw(session, pri_spec->stream_id);
1355 session_detect_idle_stream(session, pri_spec->stream_id)) {
1361 session, pri_spec->stream_id, NGHTTP2_FLAG_NONE, &pri_spec_default,
1393 (int32_t)session->remote_settings.initial_window_size,
1394 (int32_t)session->local_settings.initial_window_size,
1397 if (session_no_rfc7540_pri_no_fallback(session)) {
1398 stream->seq = session->stream_seq++;
1401 rv = nghttp2_map_insert(&session->streams, stream_id, stream);
1416 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1422 ++session->num_incoming_reserved_streams;
1430 nghttp2_session_keep_idle_stream(session, stream);
1433 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
1434 ++session->num_outgoing_streams;
1436 ++session->num_incoming_streams;
1445 dep_stream = &session->root;
1462 int nghttp2_session_close_stream(nghttp2_session *session, int32_t stream_id,
1469 mem = &session->mem;
1470 stream = nghttp2_session_get_stream(session, stream_id);
1483 session_detach_stream_item(session, stream);
1486 (nghttp2_session_prep_frame() will fail). If session->aob.item
1489 if (!item->queued && item != session->aob.item) {
1502 if (session->callbacks.on_stream_close_callback) {
1503 if (session->callbacks.on_stream_close_callback(
1504 session, stream_id, error_code, session->user_data) != 0) {
1510 is_my_stream_id = nghttp2_session_is_my_stream_id(session, stream_id);
1516 --session->num_incoming_reserved_streams;
1520 --session->num_outgoing_streams;
1522 --session->num_incoming_streams;
1529 if (session->pending_no_rfc7540_priorities == 1) {
1530 return nghttp2_session_destroy_stream(session, stream);
1533 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_CLOSED_STREAMS) == 0 &&
1534 session->server && !is_my_stream_id &&
1539 nghttp2_session_keep_closed_stream(session, stream);
1541 rv = nghttp2_session_destroy_stream(session, stream);
1550 int nghttp2_session_destroy_stream(nghttp2_session *session,
1557 mem = &session->mem;
1566 nghttp2_map_remove(&session->streams, stream->stream_id);
1573 void nghttp2_session_keep_closed_stream(nghttp2_session *session,
1578 if (session->closed_stream_tail) {
1579 session->closed_stream_tail->closed_next = stream;
1580 stream->closed_prev = session->closed_stream_tail;
1582 session->closed_stream_head = stream;
1584 session->closed_stream_tail = stream;
1586 ++session->num_closed_streams;
1589 void nghttp2_session_keep_idle_stream(nghttp2_session *session,
1594 if (session->idle_stream_tail) {
1595 session->idle_stream_tail->closed_next = stream;
1596 stream->closed_prev = session->idle_stream_tail;
1598 session->idle_stream_head = stream;
1600 session->idle_stream_tail = stream;
1602 ++session->num_idle_streams;
1605 void nghttp2_session_detach_idle_stream(nghttp2_session *session,
1618 session->idle_stream_head = next_stream;
1624 session->idle_stream_tail = prev_stream;
1630 --session->num_idle_streams;
1633 int nghttp2_session_adjust_closed_stream(nghttp2_session *session) {
1637 if (session->local_settings.max_concurrent_streams ==
1639 num_stream_max = session->pending_local_max_concurrent_stream;
1641 num_stream_max = session->local_settings.max_concurrent_streams;
1646 session->num_closed_streams, session->num_incoming_streams,
1649 while (session->num_closed_streams > 0 &&
1650 session->num_closed_streams + session->num_incoming_streams >
1655 head_stream = session->closed_stream_head;
1661 rv = nghttp2_session_destroy_stream(session, head_stream);
1668 session->closed_stream_head = next;
1670 if (session->closed_stream_head) {
1671 session->closed_stream_head->closed_prev = NULL;
1673 session->closed_stream_tail = NULL;
1676 --session->num_closed_streams;
1682 int nghttp2_session_adjust_idle_stream(nghttp2_session *session) {
1690 16, nghttp2_min(session->local_settings.max_concurrent_streams,
1691 session->pending_local_max_concurrent_stream)));
1694 session->num_idle_streams, max);
1696 while (session->num_idle_streams > max) {
1700 head = session->idle_stream_head;
1705 rv = nghttp2_session_destroy_stream(session, head);
1712 session->idle_stream_head = next;
1714 if (session->idle_stream_head) {
1715 session->idle_stream_head->closed_prev = NULL;
1717 session->idle_stream_tail = NULL;
1720 --session->num_idle_streams;
1739 int nghttp2_session_close_stream_if_shut_rdwr(nghttp2_session *session,
1742 return nghttp2_session_close_stream(session, stream->stream_id,
1752 static int session_allow_incoming_new_stream(nghttp2_session *session) {
1753 return (session->goaway_flags &
1758 * This function returns nonzero if session is closing.
1760 static int session_is_closing(nghttp2_session *session) {
1761 return (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) != 0 ||
1762 (nghttp2_session_want_read(session) == 0 &&
1763 nghttp2_session_want_write(session) == 0);
1776 * This session is closing.
1778 static int session_predicate_for_stream_send(nghttp2_session *session,
1783 if (session_is_closing(session)) {
1792 int nghttp2_session_check_request_allowed(nghttp2_session *session) {
1793 return !session->server && session->next_stream_id <= INT32_MAX &&
1794 (session->goaway_flags & NGHTTP2_GOAWAY_RECV) == 0 &&
1795 !session_is_closing(session);
1806 * New stream cannot be created because of GOAWAY: session is
1812 static int session_predicate_request_headers_send(nghttp2_session *session,
1817 /* If we are terminating session (NGHTTP2_GOAWAY_TERM_ON_SEND),
1818 GOAWAY was received from peer, or session is about to close, new
1820 if ((session->goaway_flags & NGHTTP2_GOAWAY_RECV) ||
1821 session_is_closing(session)) {
1847 * This session is closing.
1851 static int session_predicate_response_headers_send(nghttp2_session *session,
1854 rv = session_predicate_for_stream_send(session, stream);
1859 if (!session->server) {
1862 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
1877 * |stream| must be reserved state and the |session| is server side.
1892 * This session is closing.
1900 session_predicate_push_response_headers_send(nghttp2_session *session,
1904 rv = session_predicate_for_stream_send(session, stream);
1909 if (!session->server) {
1915 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) {
1939 * This session is closing.
1941 static int session_predicate_headers_send(nghttp2_session *session,
1944 rv = session_predicate_for_stream_send(session, stream);
1956 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
1986 * This session is closing.
1988 static int session_predicate_push_promise_send(nghttp2_session *session,
1992 if (!session->server) {
1996 rv = session_predicate_for_stream_send(session, stream);
2003 if (session->remote_settings.enable_push == 0) {
2009 if (session->goaway_flags & NGHTTP2_GOAWAY_RECV) {
2030 * This session is closing.
2032 static int session_predicate_window_update_send(nghttp2_session *session,
2036 if (session_is_closing(session)) {
2044 stream = nghttp2_session_get_stream(session, stream_id);
2051 if (state_reserved_local(session, stream)) {
2057 static int session_predicate_altsvc_send(nghttp2_session *session,
2061 if (session_is_closing(session)) {
2069 stream = nghttp2_session_get_stream(session, stream_id);
2080 static int session_predicate_origin_send(nghttp2_session *session) {
2081 if (session_is_closing(session)) {
2087 static int session_predicate_priority_update_send(nghttp2_session *session,
2091 if (session_is_closing(session)) {
2095 stream = nghttp2_session_get_stream(session, stream_id);
2112 nghttp2_session_enforce_flow_control_limits(nghttp2_session *session,
2117 session->remote_window_size, session->remote_settings.max_frame_size,
2122 session->remote_window_size),
2123 (int32_t)session->remote_settings.max_frame_size);
2132 static size_t nghttp2_session_next_data_read(nghttp2_session *session,
2137 session, stream, NGHTTP2_DATA_PAYLOADLEN);
2161 * This session is closing.
2163 static int nghttp2_session_predicate_data_send(nghttp2_session *session,
2166 rv = session_predicate_for_stream_send(session, stream);
2171 if (nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
2194 static ssize_t session_call_select_padding(nghttp2_session *session,
2203 if (session->callbacks.select_padding_callback) {
2209 rv = session->callbacks.select_padding_callback(
2210 session, frame, max_paddedlen, session->user_data);
2222 static int session_headers_add_pad(nghttp2_session *session,
2230 aob = &session->aob;
2237 session_call_select_padding(session, frame, max_payloadlen);
2255 static size_t session_estimate_headers_payload(nghttp2_session *session,
2259 return nghttp2_hd_deflate_bound(&session->hd_deflater, nva, nvlen) +
2263 static int session_pack_extension(nghttp2_session *session, nghttp2_bufs *bufs,
2270 assert(session->callbacks.pack_extension_callback);
2275 rv = session->callbacks.pack_extension_callback(session, buf->last, buflen,
2276 frame, session->user_data);
2304 static int session_prep_frame(nghttp2_session *session,
2310 mem = &session->mem;
2318 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2324 rv = nghttp2_session_predicate_data_send(session, stream);
2329 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
2331 session_detach_stream_item(session, stream);
2338 next_readmax = nghttp2_session_next_data_read(session, stream);
2343 queue when session->remote_window_size > 0 */
2344 assert(session->remote_window_size > 0);
2346 session_defer_stream_item(session, stream,
2349 session->aob.item = NULL;
2350 active_outbound_item_reset(&session->aob, mem);
2354 rv = nghttp2_session_pack_data(session, &session->aob.framebufs,
2361 session_defer_stream_item(session, stream,
2364 session->aob.item = NULL;
2365 active_outbound_item_reset(&session->aob, mem);
2369 session_detach_stream_item(session, stream);
2371 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
2379 session_detach_stream_item(session, stream);
2396 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
2407 rv = session_predicate_request_headers_send(session, item);
2412 if (session_enforce_http_messaging(session)) {
2418 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2421 rv = session_predicate_push_response_headers_send(session, stream);
2429 } else if (session_predicate_response_headers_send(session, stream) ==
2436 rv = session_predicate_headers_send(session, stream);
2445 session, frame->headers.nva, frame->headers.nvlen,
2448 if (estimated_payloadlen > session->max_send_header_block_length) {
2452 rv = nghttp2_frame_pack_headers(&session->aob.framebufs, &frame->headers,
2453 &session->hd_deflater);
2460 nghttp2_bufs_len(&session->aob.framebufs));
2462 rv = session_headers_add_pad(session, frame);
2469 nghttp2_bufs_len(&session->aob.framebufs));
2472 assert(session->last_sent_stream_id < frame->hd.stream_id);
2473 session->last_sent_stream_id = frame->hd.stream_id;
2479 if (session_is_closing(session)) {
2484 nghttp2_frame_pack_priority(&session->aob.framebufs, &frame->priority);
2493 if (session_is_closing(session)) {
2496 nghttp2_frame_pack_rst_stream(&session->aob.framebufs, &frame->rst_stream);
2500 assert(session->obq_flood_counter_ > 0);
2501 --session->obq_flood_counter_;
2502 /* When session is about to close, don't send SETTINGS ACK.
2506 if (session_is_closing(session)) {
2511 rv = nghttp2_frame_pack_settings(&session->aob.framebufs, &frame->settings);
2523 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2526 rv = session_predicate_push_promise_send(session, stream);
2534 session, frame->push_promise.nva, frame->push_promise.nvlen, 0);
2536 if (estimated_payloadlen > session->max_send_header_block_length) {
2541 &session->aob.framebufs, &frame->push_promise, &session->hd_deflater);
2545 rv = session_headers_add_pad(session, frame);
2550 assert(session->last_sent_stream_id + 2 <=
2552 session->last_sent_stream_id = frame->push_promise.promised_stream_id;
2558 assert(session->obq_flood_counter_ > 0);
2559 --session->obq_flood_counter_;
2563 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_ON_SEND) {
2566 nghttp2_frame_pack_ping(&session->aob.framebufs, &frame->ping);
2569 rv = nghttp2_frame_pack_goaway(&session->aob.framebufs, &frame->goaway);
2573 session->local_last_stream_id = frame->goaway.last_stream_id;
2577 rv = session_predicate_window_update_send(session, frame->hd.stream_id);
2581 nghttp2_frame_pack_window_update(&session->aob.framebufs,
2596 if (session_is_closing(session)) {
2600 return session_pack_extension(session, &session->aob.framebufs, frame);
2605 rv = session_predicate_altsvc_send(session, frame->hd.stream_id);
2610 nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
2614 rv = session_predicate_origin_send(session);
2619 rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext);
2627 rv = session_predicate_priority_update_send(session,
2633 nghttp2_frame_pack_priority_update(&session->aob.framebufs, &frame->ext);
2647 nghttp2_session_get_next_ob_item(nghttp2_session *session) {
2650 if (nghttp2_outbound_queue_top(&session->ob_urgent)) {
2651 return nghttp2_outbound_queue_top(&session->ob_urgent);
2654 if (nghttp2_outbound_queue_top(&session->ob_reg)) {
2655 return nghttp2_outbound_queue_top(&session->ob_reg);
2658 if (!session_is_outgoing_concurrent_streams_max(session)) {
2659 if (nghttp2_outbound_queue_top(&session->ob_syn)) {
2660 return nghttp2_outbound_queue_top(&session->ob_syn);
2664 if (session->remote_window_size > 0) {
2665 item = nghttp2_stream_next_outbound_item(&session->root);
2670 return session_sched_get_next_outbound_item(session);
2677 nghttp2_session_pop_next_ob_item(nghttp2_session *session) {
2680 item = nghttp2_outbound_queue_top(&session->ob_urgent);
2682 nghttp2_outbound_queue_pop(&session->ob_urgent);
2687 item = nghttp2_outbound_queue_top(&session->ob_reg);
2689 nghttp2_outbound_queue_pop(&session->ob_reg);
2694 if (!session_is_outgoing_concurrent_streams_max(session)) {
2695 item = nghttp2_outbound_queue_top(&session->ob_syn);
2697 nghttp2_outbound_queue_pop(&session->ob_syn);
2703 if (session->remote_window_size > 0) {
2704 item = nghttp2_stream_next_outbound_item(&session->root);
2709 return session_sched_get_next_outbound_item(session);
2715 static int session_call_before_frame_send(nghttp2_session *session,
2718 if (session->callbacks.before_frame_send_callback) {
2719 rv = session->callbacks.before_frame_send_callback(session, frame,
2720 session->user_data);
2732 static int session_call_on_frame_send(nghttp2_session *session,
2735 if (session->callbacks.on_frame_send_callback) {
2736 rv = session->callbacks.on_frame_send_callback(session, frame,
2737 session->user_data);
2752 if (nghttp2_session_is_my_stream_id(arg->session, stream->stream_id)) {
2783 static int session_close_stream_on_goaway(nghttp2_session *session,
2788 nghttp2_close_stream_on_goaway_arg arg = {session, NULL, last_stream_id,
2791 rv = nghttp2_map_each(&session->streams, find_stream_on_goaway_func, &arg);
2798 rv = nghttp2_session_close_stream(session, stream->stream_id,
2819 static void session_reschedule_stream(nghttp2_session *session,
2828 if (!session->server) {
2832 session_sched_reschedule_stream(session, stream);
2835 static int session_update_stream_consumed_size(nghttp2_session *session,
2839 static int session_update_connection_consumed_size(nghttp2_session *session,
2845 * or RST_STREAM. This function does not reset session->aob. It is a
2856 static int session_after_frame_sent1(nghttp2_session *session) {
2858 nghttp2_active_outbound_item *aob = &session->aob;
2871 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2875 session->remote_window_size -= (int32_t)frame->hd.length;
2881 session_detach_stream_item(session, stream);
2886 if (session->callbacks.on_frame_send_callback) {
2887 rv = session_call_on_frame_send(session, frame);
2901 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2913 if (session->callbacks.on_frame_send_callback) {
2914 rv = session_call_on_frame_send(session, frame);
2932 rv = session_call_on_frame_send(session, frame);
2940 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2951 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2959 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM,
2971 ++session->num_outgoing_streams;
2980 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
2987 rv = nghttp2_submit_data(session, NGHTTP2_FLAG_END_STREAM,
3003 if (session->server || session->pending_no_rfc7540_priorities == 1) {
3007 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
3010 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
3015 session, frame->hd.stream_id, NGHTTP2_FLAG_NONE,
3021 rv = nghttp2_session_reprioritize_stream(session, stream,
3028 rv = nghttp2_session_adjust_idle_stream(session);
3036 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
3050 session->goaway_flags |= NGHTTP2_GOAWAY_TERM_SENT;
3053 session->goaway_flags |= NGHTTP2_GOAWAY_SENT;
3055 rv = session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
3067 session->window_update_queued = 0;
3068 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
3069 rv = session_update_connection_consumed_size(session, 0);
3071 rv = nghttp2_session_update_recv_connection_window_size(session, 0);
3081 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3094 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
3095 rv = session_update_stream_consumed_size(session, stream, 0);
3098 nghttp2_session_update_recv_stream_window_size(session, stream, 0, 1);
3113 * function is responsible to reset session->aob.
3115 static void session_after_frame_sent2(nghttp2_session *session) {
3116 nghttp2_active_outbound_item *aob = &session->aob;
3124 mem = &session->mem;
3142 active_outbound_item_reset(&session->aob, mem);
3164 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3166 /* If session is closed or RST_STREAM was queued, we won't send
3168 if (nghttp2_session_predicate_data_send(session, stream) != 0) {
3170 session_detach_stream_item(session, stream);
3179 active_outbound_item_reset(&session->aob, mem);
3184 static int session_call_send_data(nghttp2_session *session,
3198 rv = session->callbacks.send_data_callback(session, frame, buf->pos, length,
3200 session->user_data);
3213 static ssize_t nghttp2_session_mem_send_internal(nghttp2_session *session,
3221 mem = &session->mem;
3222 aob = &session->aob;
3228 rv = nghttp2_session_adjust_idle_stream(session);
3238 item = nghttp2_session_pop_next_ob_item(session);
3243 rv = session_prep_frame(session, item);
3261 session->callbacks.on_frame_not_send_callback && is_non_fatal(rv)) {
3267 session->callbacks.on_frame_not_send_callback(
3268 session, frame, rv, session->user_data) != 0) {
3297 rv2 = nghttp2_session_close_stream(session, opened_stream_id,
3312 rv = nghttp2_session_terminate_session(session,
3335 rv = session_call_before_frame_send(session, frame);
3344 if (session->callbacks.on_frame_not_send_callback) {
3345 if (session->callbacks.on_frame_not_send_callback(
3346 session, frame, rv, session->user_data) != 0) {
3372 rv2 = nghttp2_session_close_stream(session, opened_stream_id,
3412 session_after_frame_sent2(session);
3414 rv = session_after_frame_sent1(session);
3420 session_after_frame_sent2(session);
3444 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3453 rv = session_call_send_data(session, aob->item, framebufs);
3459 session_detach_stream_item(session, stream);
3461 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
3478 rv = session_after_frame_sent1(session);
3483 session_after_frame_sent2(session);
3516 ssize_t nghttp2_session_mem_send(nghttp2_session *session,
3523 len = nghttp2_session_mem_send_internal(session, data_ptr, 1);
3528 if (session->aob.item) {
3533 rv = session_after_frame_sent1(session);
3543 int nghttp2_session_send(nghttp2_session *session) {
3549 framebufs = &session->aob.framebufs;
3552 datalen = nghttp2_session_mem_send_internal(session, &data, 0);
3556 sentlen = session->callbacks.send_callback(session, data, (size_t)datalen,
3557 0, session->user_data);
3572 static ssize_t session_recv(nghttp2_session *session, uint8_t *buf,
3575 rv = session->callbacks.recv_callback(session, buf, len, 0,
3576 session->user_data);
3587 static int session_call_on_begin_frame(nghttp2_session *session,
3591 if (session->callbacks.on_begin_frame_callback) {
3593 rv = session->callbacks.on_begin_frame_callback(session, hd,
3594 session->user_data);
3604 static int session_call_on_frame_received(nghttp2_session *session,
3607 if (session->callbacks.on_frame_recv_callback) {
3608 rv = session->callbacks.on_frame_recv_callback(session, frame,
3609 session->user_data);
3617 static int session_call_on_begin_headers(nghttp2_session *session,
3622 if (session->callbacks.on_begin_headers_callback) {
3623 rv = session->callbacks.on_begin_headers_callback(session, frame,
3624 session->user_data);
3635 static int session_call_on_header(nghttp2_session *session,
3639 if (session->callbacks.on_header_callback2) {
3640 rv = session->callbacks.on_header_callback2(
3641 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3642 } else if (session->callbacks.on_header_callback) {
3643 rv = session->callbacks.on_header_callback(
3644 session, frame, nv->name->base, nv->name->len, nv->value->base,
3645 nv->value->len, nv->flags, session->user_data);
3658 static int session_call_on_invalid_header(nghttp2_session *session,
3662 if (session->callbacks.on_invalid_header_callback2) {
3663 rv = session->callbacks.on_invalid_header_callback2(
3664 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3665 } else if (session->callbacks.on_invalid_header_callback) {
3666 rv = session->callbacks.on_invalid_header_callback(
3667 session, frame, nv->name->base, nv->name->len, nv->value->base,
3668 nv->value->len, nv->flags, session->user_data);
3684 session_call_on_extension_chunk_recv_callback(nghttp2_session *session,
3687 nghttp2_inbound_frame *iframe = &session->iframe;
3690 if (session->callbacks.on_extension_chunk_recv_callback) {
3691 rv = session->callbacks.on_extension_chunk_recv_callback(
3692 session, &frame->hd, data, len, session->user_data);
3704 static int session_call_unpack_extension_callback(nghttp2_session *session) {
3706 nghttp2_inbound_frame *iframe = &session->iframe;
3710 rv = session->callbacks.unpack_extension_callback(
3711 session, &payload, &frame->hd, session->user_data);
3733 static int session_handle_frame_size_error(nghttp2_session *session) {
3736 return nghttp2_session_terminate_session(session, NGHTTP2_FRAME_SIZE_ERROR);
3761 * Calls on_invalid_frame_recv_callback if it is set to |session|.
3769 static int session_call_on_invalid_frame_recv_callback(nghttp2_session *session,
3772 if (session->callbacks.on_invalid_frame_recv_callback) {
3773 if (session->callbacks.on_invalid_frame_recv_callback(
3774 session, frame, lib_error_code, session->user_data) != 0) {
3781 static int session_handle_invalid_stream2(nghttp2_session *session,
3787 session, stream_id, get_error_code_from_lib_error_code(lib_error_code));
3791 if (session->callbacks.on_invalid_frame_recv_callback) {
3792 if (session->callbacks.on_invalid_frame_recv_callback(
3793 session, frame, lib_error_code, session->user_data) != 0) {
3800 static int session_handle_invalid_stream(nghttp2_session *session,
3803 return session_handle_invalid_stream2(session, frame->hd.stream_id, frame,
3807 static int session_inflate_handle_invalid_stream(nghttp2_session *session,
3811 rv = session_handle_invalid_stream(session, frame, lib_error_code);
3821 static int session_handle_invalid_connection(nghttp2_session *session,
3825 if (session->callbacks.on_invalid_frame_recv_callback) {
3826 if (session->callbacks.on_invalid_frame_recv_callback(
3827 session, frame, lib_error_code, session->user_data) != 0) {
3832 session, get_error_code_from_lib_error_code(lib_error_code), reason);
3835 static int session_inflate_handle_invalid_connection(nghttp2_session *session,
3841 session_handle_invalid_connection(session, frame, lib_error_code, reason);
3875 static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame,
3887 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3891 session, frame->push_promise.promised_stream_id);
3894 trailer = session_trailer_headers(session, stream, frame);
3900 proclen = nghttp2_hd_inflate_hd_nv(&session->hd_inflater, &nv,
3906 if (session->iframe.state == NGHTTP2_IB_READ_HEADER_BLOCK) {
3912 session, subject_stream->stream_id, NGHTTP2_COMPRESSION_ERROR);
3920 nghttp2_session_terminate_session(session, NGHTTP2_COMPRESSION_ERROR);
3936 if (session_enforce_http_messaging(session)) {
3937 rv = nghttp2_http_on_header(session, subject_stream, frame, &nv,
3944 rv2 = session_call_on_invalid_header(session, frame, &nv);
3958 session, NGHTTP2_ERR_HTTP_HEADER,
3976 session, NGHTTP2_ERR_HTTP_HEADER,
3986 rv = session_handle_invalid_stream2(session,
3996 rv = session_call_on_header(session, frame, &nv);
4006 nghttp2_hd_inflate_end_headers(&session->hd_inflater);
4027 static int session_end_stream_headers_received(nghttp2_session *session,
4034 if (session->server && session_enforce_http_messaging(session) &&
4039 rv = session_update_stream_priority(session, stream, stream->http_extpri);
4051 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
4059 static int session_after_header_block_received(nghttp2_session *session) {
4061 nghttp2_frame *frame = &session->iframe.frame;
4066 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4071 if (session_enforce_http_messaging(session)) {
4076 session, frame->push_promise.promised_stream_id);
4092 assert(!session->server);
4114 rv = session_handle_invalid_stream2(session, stream_id, frame,
4130 rv = session_call_on_frame_received(session, frame);
4139 return session_end_stream_headers_received(session, frame, stream);
4142 int nghttp2_session_on_request_headers_received(nghttp2_session *session,
4148 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0");
4154 if (!session->server) {
4155 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4157 session, frame, NGHTTP2_ERR_PROTO,
4164 assert(session->server);
4166 if (!session_is_new_peer_stream_id(session, frame->hd.stream_id)) {
4168 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4170 session, frame, NGHTTP2_ERR_PROTO,
4194 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4197 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4202 session->last_recv_stream_id = frame->hd.stream_id;
4204 if (session_is_incoming_concurrent_streams_max(session)) {
4206 session, frame, NGHTTP2_ERR_PROTO,
4210 if (!session_allow_incoming_new_stream(session)) {
4217 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself");
4220 if (session_is_incoming_concurrent_streams_pending_max(session)) {
4221 return session_inflate_handle_invalid_stream(session, frame,
4226 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4232 rv = nghttp2_session_adjust_closed_stream(session);
4237 session->last_proc_stream_id = session->last_recv_stream_id;
4239 rv = session_call_on_begin_headers(session, frame);
4246 int nghttp2_session_on_response_headers_received(nghttp2_session *session,
4253 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id));
4256 session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0");
4268 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4271 rv = session_call_on_begin_headers(session, frame);
4278 int nghttp2_session_on_push_response_headers_received(nghttp2_session *session,
4285 session, frame, NGHTTP2_ERR_PROTO,
4289 if (session->server) {
4291 session, frame, NGHTTP2_ERR_PROTO,
4295 if (session_is_incoming_concurrent_streams_max(session)) {
4297 session, frame, NGHTTP2_ERR_PROTO,
4301 if (!session_allow_incoming_new_stream(session)) {
4306 if (session_is_incoming_concurrent_streams_pending_max(session)) {
4307 return session_inflate_handle_invalid_stream(session, frame,
4312 if (!nghttp2_session_is_my_stream_id(session, stream->stream_id)) {
4313 --session->num_incoming_reserved_streams;
4315 ++session->num_incoming_streams;
4316 rv = session_call_on_begin_headers(session, frame);
4323 int nghttp2_session_on_headers_received(nghttp2_session *session,
4329 session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0");
4341 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4343 if (nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4345 rv = session_call_on_begin_headers(session, frame);
4359 rv = session_call_on_begin_headers(session, frame);
4368 static int session_process_headers_frame(nghttp2_session *session) {
4369 nghttp2_inbound_frame *iframe = &session->iframe;
4375 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4378 return nghttp2_session_on_request_headers_received(session, frame);
4383 return nghttp2_session_on_push_response_headers_received(session, frame,
4388 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4390 return nghttp2_session_on_response_headers_received(session, frame, stream);
4394 return nghttp2_session_on_headers_received(session, frame, stream);
4397 int nghttp2_session_on_priority_received(nghttp2_session *session,
4402 assert(!session_no_rfc7540_pri_no_fallback(session));
4405 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4411 session, NGHTTP2_PROTOCOL_ERROR, "depend on itself");
4414 if (!session->server) {
4416 return session_call_on_frame_received(session, frame);
4419 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4424 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
4429 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4436 rv = nghttp2_session_adjust_idle_stream(session);
4441 rv = nghttp2_session_reprioritize_stream(session, stream,
4448 rv = nghttp2_session_adjust_idle_stream(session);
4454 return session_call_on_frame_received(session, frame);
4457 static int session_process_priority_frame(nghttp2_session *session) {
4458 nghttp2_inbound_frame *iframe = &session->iframe;
4461 assert(!session_no_rfc7540_pri_no_fallback(session));
4465 return nghttp2_session_on_priority_received(session, frame);
4468 static int session_update_stream_reset_ratelim(nghttp2_session *session) {
4469 if (!session->server || (session->goaway_flags & NGHTTP2_GOAWAY_SUBMITTED)) {
4473 nghttp2_ratelim_update(&session->stream_reset_ratelim,
4476 if (nghttp2_ratelim_drain(&session->stream_reset_ratelim, 1) == 0) {
4480 return nghttp2_session_add_goaway(session, session->last_recv_stream_id,
4485 int nghttp2_session_on_rst_stream_received(nghttp2_session *session,
4490 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4494 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4495 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4499 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4505 rv = session_call_on_frame_received(session, frame);
4509 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
4515 return session_update_stream_reset_ratelim(session);
4518 static int session_process_rst_stream_frame(nghttp2_session *session) {
4519 nghttp2_inbound_frame *iframe = &session->iframe;
4524 return nghttp2_session_on_rst_stream_received(session, frame);
4538 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id,
4548 arg->session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL);
4568 session_update_remote_initial_window_size(nghttp2_session *session,
4572 arg.session = session;
4574 arg.old_window_size = (int32_t)session->remote_settings.initial_window_size;
4576 return nghttp2_map_each(&session->streams,
4589 return nghttp2_session_add_rst_stream(arg->session, stream->stream_id,
4597 if (arg->session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
4598 return session_update_stream_consumed_size(arg->session, stream, 0);
4604 rv = nghttp2_session_add_window_update(arg->session, NGHTTP2_FLAG_NONE,
4627 session_update_local_initial_window_size(nghttp2_session *session,
4631 arg.session = session;
4634 return nghttp2_map_each(&session->streams,
4651 int nghttp2_session_update_local_settings(nghttp2_session *session,
4677 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater,
4684 rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater,
4692 session, new_initial_window_size,
4693 (int32_t)session->local_settings.initial_window_size);
4702 session->local_settings.header_table_size = iv[i].value;
4705 session->local_settings.enable_push = iv[i].value;
4708 session->local_settings.max_concurrent_streams = iv[i].value;
4711 session->local_settings.initial_window_size = iv[i].value;
4714 session->local_settings.max_frame_size = iv[i].value;
4717 session->local_settings.max_header_list_size = iv[i].value;
4720 session->local_settings.enable_connect_protocol = iv[i].value;
4723 session->local_settings.no_rfc7540_priorities = iv[i].value;
4731 int nghttp2_session_on_settings_received(nghttp2_session *session,
4738 mem = &session->mem;
4741 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4747 session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR,
4751 settings = session->inflight_settings_head;
4755 session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK");
4758 rv = nghttp2_session_update_local_settings(session, settings->iv,
4761 session->inflight_settings_head = settings->next;
4769 return session_handle_invalid_connection(session, frame, rv, NULL);
4771 return session_call_on_frame_received(session, frame);
4774 if (!session->remote_settings_received) {
4775 session->remote_settings.max_concurrent_streams =
4777 session->remote_settings_received = 1;
4786 rv = nghttp2_hd_deflate_change_table_size(&session->hd_deflater,
4793 session, frame, NGHTTP2_ERR_HEADER_COMP, NULL);
4797 session->remote_settings.header_table_size = entry->value;
4804 session, frame, NGHTTP2_ERR_PROTO,
4808 if (!session->server && entry->value != 0) {
4810 session, frame, NGHTTP2_ERR_PROTO,
4814 session->remote_settings.enable_push = entry->value;
4819 session->remote_settings.max_concurrent_streams = entry->value;
4828 session, frame, NGHTTP2_ERR_FLOW_CONTROL,
4832 rv = session_update_remote_initial_window_size(session,
4841 session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL);
4844 session->remote_settings.initial_window_size = entry->value;
4852 session, frame, NGHTTP2_ERR_PROTO,
4856 session->remote_settings.max_frame_size = entry->value;
4861 session->remote_settings.max_header_list_size = entry->value;
4868 session, frame, NGHTTP2_ERR_PROTO,
4872 if (!session->server &&
4873 session->remote_settings.enable_connect_protocol &&
4876 session, frame, NGHTTP2_ERR_PROTO,
4881 session->remote_settings.enable_connect_protocol = entry->value;
4888 session, frame, NGHTTP2_ERR_PROTO,
4892 if (session->remote_settings.no_rfc7540_priorities != UINT32_MAX &&
4893 session->remote_settings.no_rfc7540_priorities != entry->value) {
4895 session, frame, NGHTTP2_ERR_PROTO,
4899 session->remote_settings.no_rfc7540_priorities = entry->value;
4905 if (session->remote_settings.no_rfc7540_priorities == UINT32_MAX) {
4906 session->remote_settings.no_rfc7540_priorities = 0;
4908 if (session->server && session->pending_no_rfc7540_priorities &&
4909 (session->opt_flags &
4911 session->fallback_rfc7540_priorities = 1;
4915 if (!noack && !session_is_closing(session)) {
4916 rv = nghttp2_session_add_settings(session, NGHTTP2_FLAG_ACK, NULL, 0);
4923 return session_handle_invalid_connection(session, frame,
4928 return session_call_on_frame_received(session, frame);
4931 static int session_process_settings_frame(nghttp2_session *session) {
4932 nghttp2_inbound_frame *iframe = &session->iframe;
4965 return nghttp2_session_on_settings_received(session, frame, 0 /* ACK */);
4968 int nghttp2_session_on_push_promise_received(nghttp2_session *session,
4977 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0");
4979 if (session->server || session->local_settings.enable_push == 0) {
4981 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled");
4984 if (!nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4986 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id");
4989 if (!session_allow_incoming_new_stream(session)) {
4994 if (!session_is_new_peer_stream_id(session,
5000 session, frame, NGHTTP2_ERR_PROTO,
5004 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5006 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle");
5009 session->last_recv_stream_id = frame->push_promise.promised_stream_id;
5010 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5012 !session->pending_enable_push ||
5013 session->num_incoming_reserved_streams >=
5014 session->max_incoming_reserved_streams) {
5019 session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL);
5028 session, frame, NGHTTP2_ERR_STREAM_CLOSED,
5036 session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE,
5046 session->last_proc_stream_id = session->last_recv_stream_id;
5047 rv = session_call_on_begin_headers(session, frame);
5054 static int session_process_push_promise_frame(nghttp2_session *session) {
5055 nghttp2_inbound_frame *iframe = &session->iframe;
5061 return nghttp2_session_on_push_promise_received(session, frame);
5064 int nghttp2_session_on_ping_received(nghttp2_session *session,
5068 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5071 if ((session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_PING_ACK) == 0 &&
5073 !session_is_closing(session)) {
5075 rv = nghttp2_session_add_ping(session, NGHTTP2_FLAG_ACK,
5081 return session_call_on_frame_received(session, frame);
5084 static int session_process_ping_frame(nghttp2_session *session) {
5085 nghttp2_inbound_frame *iframe = &session->iframe;
5090 return nghttp2_session_on_ping_received(session, frame);
5093 int nghttp2_session_on_goaway_received(nghttp2_session *session,
5098 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5104 !nghttp2_session_is_my_stream_id(session,
5106 session->remote_last_stream_id < frame->goaway.last_stream_id) {
5107 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5111 session->goaway_flags |= NGHTTP2_GOAWAY_RECV;
5113 session->remote_last_stream_id = frame->goaway.last_stream_id;
5115 rv = session_call_on_frame_received(session, frame);
5121 return session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
5125 static int session_process_goaway_frame(nghttp2_session *session) {
5126 nghttp2_inbound_frame *iframe = &session->iframe;
5135 return nghttp2_session_on_goaway_received(session, frame);
5139 session_on_connection_window_update_received(nghttp2_session *session,
5144 session, frame, NGHTTP2_ERR_PROTO,
5149 session->remote_window_size) {
5150 return session_handle_invalid_connection(session, frame,
5153 session->remote_window_size += frame->window_update.window_size_increment;
5155 return session_call_on_frame_received(session, frame);
5158 static int session_on_stream_window_update_received(nghttp2_session *session,
5163 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5164 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5168 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5172 if (state_reserved_remote(session, stream)) {
5174 session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream");
5178 session, frame, NGHTTP2_ERR_PROTO,
5183 return session_handle_invalid_stream(session, frame,
5192 session, stream, NGHTTP2_STREAM_FLAG_DEFERRED_FLOW_CONTROL);
5198 return session_call_on_frame_received(session, frame);
5201 int nghttp2_session_on_window_update_received(nghttp2_session *session,
5204 return session_on_connection_window_update_received(session, frame);
5206 return session_on_stream_window_update_received(session, frame);
5210 static int session_process_window_update_frame(nghttp2_session *session) {
5211 nghttp2_inbound_frame *iframe = &session->iframe;
5217 return nghttp2_session_on_window_update_received(session, frame);
5220 int nghttp2_session_on_altsvc_received(nghttp2_session *session,
5227 /* session->server case has been excluded */
5231 return session_call_on_invalid_frame_recv_callback(session, frame,
5236 return session_call_on_invalid_frame_recv_callback(session, frame,
5240 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5251 return session_call_on_invalid_frame_recv_callback(session, frame,
5255 return session_call_on_frame_received(session, frame);
5258 int nghttp2_session_on_origin_received(nghttp2_session *session,
5260 return session_call_on_frame_received(session, frame);
5263 int nghttp2_session_on_priority_update_received(nghttp2_session *session,
5271 assert(session->server);
5276 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5280 if (nghttp2_session_is_my_stream_id(session, priority_update->stream_id)) {
5281 if (session_detect_idle_stream(session, priority_update->stream_id)) {
5283 session, frame, NGHTTP2_ERR_PROTO,
5288 return session_call_on_frame_received(session, frame);
5291 stream = nghttp2_session_get_stream_raw(session, priority_update->stream_id);
5295 return session_call_on_frame_received(session, frame);
5297 } else if (session_detect_idle_stream(session, priority_update->stream_id)) {
5298 if (session->num_idle_streams + session->num_incoming_streams >=
5299 session->local_settings.max_concurrent_streams) {
5301 session, frame, NGHTTP2_ERR_PROTO,
5306 stream = nghttp2_session_open_stream(session, priority_update->stream_id,
5313 return session_call_on_frame_received(session, frame);
5323 return session_call_on_frame_received(session, frame);
5326 rv = session_update_stream_priority(session, stream,
5334 return session_call_on_frame_received(session, frame);
5337 static int session_process_altsvc_frame(nghttp2_session *session) {
5338 nghttp2_inbound_frame *iframe = &session->iframe;
5349 return nghttp2_session_on_altsvc_received(session, frame);
5352 static int session_process_origin_frame(nghttp2_session *session) {
5353 nghttp2_inbound_frame *iframe = &session->iframe;
5355 nghttp2_mem *mem = &session->mem;
5368 return nghttp2_session_on_origin_received(session, frame);
5371 static int session_process_priority_update_frame(nghttp2_session *session) {
5372 nghttp2_inbound_frame *iframe = &session->iframe;
5378 return nghttp2_session_on_priority_update_received(session, frame);
5381 static int session_process_extension_frame(nghttp2_session *session) {
5383 nghttp2_inbound_frame *iframe = &session->iframe;
5386 rv = session_call_unpack_extension_callback(session);
5396 return session_call_on_frame_received(session, frame);
5399 int nghttp2_session_on_data_received(nghttp2_session *session,
5406 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5414 if (session_enforce_http_messaging(session) &&
5417 rv = nghttp2_session_add_rst_stream(session, stream->stream_id,
5430 rv = session_call_on_frame_received(session, frame);
5437 rv = nghttp2_session_close_stream_if_shut_rdwr(session, stream);
5446 static int session_process_data_frame(nghttp2_session *session) {
5448 nghttp2_frame *public_data_frame = &session->iframe.frame;
5449 rv = nghttp2_session_on_data_received(session, public_data_frame);
5476 int nghttp2_session_update_recv_stream_window_size(nghttp2_session *session,
5484 return nghttp2_session_add_rst_stream(session, stream->stream_id,
5492 !(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) &&
5496 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE,
5508 int nghttp2_session_update_recv_connection_window_size(nghttp2_session *session,
5511 rv = adjust_recv_window_size(&session->recv_window_size, delta_size,
5512 session->local_window_size);
5514 return nghttp2_session_terminate_session(session,
5517 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) &&
5518 session->window_update_queued == 0 &&
5519 nghttp2_should_send_window_update(session->local_window_size,
5520 session->recv_window_size)) {
5523 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE, 0,
5524 session->recv_window_size);
5529 session->recv_window_size = 0;
5534 static int session_update_consumed_size(nghttp2_session *session,
5544 return nghttp2_session_terminate_session(session,
5557 rv = nghttp2_session_add_window_update(session, NGHTTP2_FLAG_NONE,
5572 static int session_update_stream_consumed_size(nghttp2_session *session,
5576 session, &stream->consumed_size, &stream->recv_window_size,
5581 static int session_update_connection_consumed_size(nghttp2_session *session,
5584 session, &session->consumed_size, &session->recv_window_size,
5585 session->window_update_queued, 0, delta_size, session->local_window_size);
5590 * indicated by |session->iframe.frame.hd.stream_id|. If it is a
5605 static int session_on_data_received_fail_fast(nghttp2_session *session) {
5613 iframe = &session->iframe;
5624 if (session_detect_idle_stream(session, stream_id)) {
5630 stream = nghttp2_session_get_stream(session, stream_id);
5632 stream = nghttp2_session_get_stream_raw(session, stream_id);
5647 if (nghttp2_session_is_my_stream_id(session, stream_id)) {
5666 rv = nghttp2_session_terminate_session_with_reason(session, error_code,
5814 ssize_t nghttp2_session_mem_recv(nghttp2_session *session, const uint8_t *in,
5817 nghttp2_inbound_frame *iframe = &session->iframe;
5836 session->recv_window_size, session->local_window_size);
5838 mem = &session->mem;
5843 rv = nghttp2_session_adjust_idle_stream(session);
5848 if (!nghttp2_session_want_read(session)) {
5867 session_inbound_frame_reset(session);
5885 session, NGHTTP2_ERR_SETTINGS_EXPECTED,
5895 session, NGHTTP2_PROTOCOL_ERROR, "SETTINGS expected");
5926 if (iframe->frame.hd.length > session->local_settings.max_frame_size) {
5928 session->local_settings.max_frame_size);
5931 session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size");
5950 rv = session_on_data_received_fail_fast(session);
5968 session, NGHTTP2_PROTOCOL_ERROR,
5996 session, NGHTTP2_PROTOCOL_ERROR,
6028 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6036 rv = session_process_headers_frame(session);
6049 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6123 if (session->obq_flood_counter_ >= session->max_outbound_ack &&
6138 if (iframe->max_niv - 1 > session->max_settings) {
6140 session, NGHTTP2_ENHANCE_YOUR_CALM,
6178 session, NGHTTP2_PROTOCOL_ERROR,
6238 session, NGHTTP2_PROTOCOL_ERROR, "CONTINUATION: unexpected");
6247 if (check_ext_type_set(session->user_recv_ext_types,
6249 if (!session->callbacks.unpack_extension_callback) {
6267 if ((session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ALTSVC) ==
6279 if (session->server) {
6298 if (!(session->builtin_recv_ext_types & NGHTTP2_TYPEMASK_ORIGIN)) {
6308 if (session->server || iframe->frame.hd.stream_id ||
6334 if ((session->builtin_recv_ext_types &
6347 if (!session->server) {
6349 session, NGHTTP2_PROTOCOL_ERROR,
6363 if (!session_no_rfc7540_pri_no_fallback(session) ||
6395 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6428 session, NGHTTP2_PROTOCOL_ERROR, "HEADERS: invalid padding");
6451 rv = session_process_headers_frame(session);
6464 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6481 if (!session_no_rfc7540_pri_no_fallback(session) &&
6482 session->remote_settings.no_rfc7540_priorities != 1) {
6483 rv = session_process_priority_frame(session);
6493 session_inbound_frame_reset(session);
6497 rv = session_process_rst_stream_frame(session);
6506 session_inbound_frame_reset(session);
6516 session, NGHTTP2_PROTOCOL_ERROR,
6539 rv = session_process_push_promise_frame(session);
6552 session, iframe->frame.push_promise.promised_stream_id,
6570 rv = session_process_ping_frame(session);
6579 session_inbound_frame_reset(session);
6605 rv = session_process_window_update_frame(session);
6614 session_inbound_frame_reset(session);
6651 rv = session_process_priority_update_frame(session);
6656 session_inbound_frame_reset(session);
6662 session_inbound_frame_reset(session);
6704 inflate_header_block(session, &iframe->frame, &hd_proclen,
6732 session,
6751 session_inbound_frame_reset(session);
6780 rv = session_after_header_block_received(session);
6785 session_inbound_frame_reset(session);
6787 session->num_continuations = 0;
6810 session->hd_inflater.ctx.bad = 1;
6816 session_inbound_frame_reset(session);
6822 rv = session_handle_frame_size_error(session);
6852 rv = session_process_settings_frame(session);
6862 session_inbound_frame_reset(session);
6886 rv = session_process_goaway_frame(session);
6896 session_inbound_frame_reset(session);
6909 if (++session->num_continuations > session->max_continuations) {
6933 session, NGHTTP2_PROTOCOL_ERROR,
6954 rv = session_call_on_begin_frame(session, &cont_hd);
6979 rv = nghttp2_session_update_recv_connection_window_size(session, readlen);
6990 nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen);
7000 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7003 session, stream, readlen,
7016 session, NGHTTP2_PROTOCOL_ERROR, "DATA: invalid padding");
7029 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7049 rv = nghttp2_session_update_recv_connection_window_size(session,
7060 session, stream, readlen,
7079 rv = nghttp2_session_consume(session, iframe->frame.hd.stream_id,
7094 if (session_enforce_http_messaging(session)) {
7096 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
7099 session, (size_t)data_readlen);
7111 session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
7120 if (session->callbacks.on_data_chunk_recv_callback) {
7121 rv = session->callbacks.on_data_chunk_recv_callback(
7122 session, iframe->frame.hd.flags, iframe->frame.hd.stream_id,
7123 in - readlen, (size_t)data_readlen, session->user_data);
7139 rv = session_process_data_frame(session);
7144 session_inbound_frame_reset(session);
7160 rv = nghttp2_session_update_recv_connection_window_size(session,
7170 if (session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE) {
7173 rv = session_update_connection_consumed_size(session, readlen);
7189 session_inbound_frame_reset(session);
7206 session, in - readlen, readlen);
7224 rv = session_process_extension_frame(session);
7229 session_inbound_frame_reset(session);
7252 rv = session_process_altsvc_frame(session);
7257 session_inbound_frame_reset(session);
7281 rv = session_process_origin_frame(session);
7291 session_inbound_frame_reset(session);
7308 int nghttp2_session_recv(nghttp2_session *session) {
7312 readlen = session_recv(session, buf, sizeof(buf));
7314 ssize_t proclen = nghttp2_session_mem_recv(session, buf, (size_t)readlen);
7333 static size_t session_get_num_active_streams(nghttp2_session *session) {
7334 return nghttp2_map_size(&session->streams) - session->num_closed_streams -
7335 session->num_idle_streams;
7338 int nghttp2_session_want_read(nghttp2_session *session) {
7343 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) {
7347 num_active_streams = session_get_num_active_streams(session);
7357 received, we are done with this session. */
7358 return (session->goaway_flags &
7362 int nghttp2_session_want_write(nghttp2_session *session) {
7365 if (session->goaway_flags & NGHTTP2_GOAWAY_TERM_SENT) {
7375 return session->aob.item || nghttp2_outbound_queue_top(&session->ob_urgent) ||
7376 nghttp2_outbound_queue_top(&session->ob_reg) ||
7377 ((!nghttp2_pq_empty(&session->root.obq) ||
7378 !session_sched_empty(session)) &&
7379 session->remote_window_size > 0) ||
7380 (nghttp2_outbound_queue_top(&session->ob_syn) &&
7381 !session_is_outgoing_concurrent_streams_max(session));
7384 int nghttp2_session_add_ping(nghttp2_session *session, uint8_t flags,
7391 mem = &session->mem;
7394 session->obq_flood_counter_ >= session->max_outbound_ack) {
7409 rv = nghttp2_session_add_item(session, item);
7418 ++session->obq_flood_counter_;
7424 int nghttp2_session_add_goaway(nghttp2_session *session, int32_t last_stream_id,
7434 mem = &session->mem;
7436 if (nghttp2_session_is_my_stream_id(session, last_stream_id)) {
7463 last_stream_id = nghttp2_min(last_stream_id, session->local_last_stream_id);
7471 rv = nghttp2_session_add_item(session, item);
7478 session->goaway_flags |= NGHTTP2_GOAWAY_SUBMITTED;
7483 int nghttp2_session_add_window_update(nghttp2_session *session, uint8_t flags,
7491 mem = &session->mem;
7504 rv = nghttp2_session_add_item(session, item);
7515 session_append_inflight_settings(nghttp2_session *session,
7519 for (i = &session->inflight_settings_head; *i; i = &(*i)->next)
7525 int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags,
7534 uint8_t no_rfc7540_pri = session->pending_no_rfc7540_priorities;
7536 mem = &session->mem;
7543 if (session->obq_flood_counter_ >= session->max_outbound_ack) {
7597 rv = nghttp2_session_add_item(session, item);
7611 ++session->obq_flood_counter_;
7613 session_append_inflight_settings(session, inflight_settings);
7622 session->pending_local_max_concurrent_stream = iv[i - 1].value;
7629 session->pending_enable_push = (uint8_t)iv[i - 1].value;
7636 session->pending_enable_connect_protocol = (uint8_t)iv[i - 1].value;
7642 session->pending_no_rfc7540_priorities = 0;
7644 session->pending_no_rfc7540_priorities = no_rfc7540_pri;
7650 int nghttp2_session_pack_data(nghttp2_session *session, nghttp2_bufs *bufs,
7665 if (session->callbacks.read_length_callback) {
7667 payloadlen = session->callbacks.read_length_callback(
7668 session, frame->hd.type, stream->stream_id, session->remote_window_size,
7669 stream->remote_window_size, session->remote_settings.max_frame_size,
7670 session->user_data);
7674 payloadlen = nghttp2_session_enforce_flow_control_limits(session, stream,
7686 rv = nghttp2_bufs_realloc(&session->aob.framebufs,
7697 assert(&session->aob.framebufs == bufs);
7710 session, frame->hd.stream_id, buf->pos, datamax, &data_flags,
7711 &aux_data->data_prd.source, session->user_data);
7745 if (session->callbacks.send_data_callback == NULL) {
7759 session_call_select_padding(session, frame, max_payloadlen);
7772 session_reschedule_stream(session, stream);
7785 void *nghttp2_session_get_stream_user_data(nghttp2_session *session,
7788 stream = nghttp2_session_get_stream(session, stream_id);
7796 int nghttp2_session_set_stream_user_data(nghttp2_session *session,
7803 stream = nghttp2_session_get_stream(session, stream_id);
7809 if (session->server || !nghttp2_session_is_my_stream_id(session, stream_id) ||
7810 !nghttp2_outbound_queue_top(&session->ob_syn)) {
7814 frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
7818 (uint32_t)stream_id >= session->next_stream_id) {
7822 for (item = session->ob_syn.head; item; item = item->qnext) {
7838 int nghttp2_session_resume_data(nghttp2_session *session, int32_t stream_id) {
7841 stream = nghttp2_session_get_stream(session, stream_id);
7846 rv = session_resume_deferred_stream_item(session, stream,
7856 size_t nghttp2_session_get_outbound_queue_size(nghttp2_session *session) {
7857 return nghttp2_outbound_queue_size(&session->ob_urgent) +
7858 nghttp2_outbound_queue_size(&session->ob_reg) +
7859 nghttp2_outbound_queue_size(&session->ob_syn);
7864 nghttp2_session_get_stream_effective_recv_data_length(nghttp2_session *session,
7867 stream = nghttp2_session_get_stream(session, stream_id);
7875 nghttp2_session_get_stream_effective_local_window_size(nghttp2_session *session,
7878 stream = nghttp2_session_get_stream(session, stream_id);
7885 int32_t nghttp2_session_get_stream_local_window_size(nghttp2_session *session,
7889 stream = nghttp2_session_get_stream(session, stream_id);
7906 nghttp2_session_get_effective_recv_data_length(nghttp2_session *session) {
7907 return session->recv_window_size < 0 ? 0 : session->recv_window_size;
7911 nghttp2_session_get_effective_local_window_size(nghttp2_session *session) {
7912 return session->local_window_size;
7915 int32_t nghttp2_session_get_local_window_size(nghttp2_session *session) {
7916 return session->local_window_size - session->recv_window_size;
7919 int32_t nghttp2_session_get_stream_remote_window_size(nghttp2_session *session,
7923 stream = nghttp2_session_get_stream(session, stream_id);
7933 int32_t nghttp2_session_get_remote_window_size(nghttp2_session *session) {
7934 return session->remote_window_size;
7937 uint32_t nghttp2_session_get_remote_settings(nghttp2_session *session,
7941 return session->remote_settings.header_table_size;
7943 return session->remote_settings.enable_push;
7945 return session->remote_settings.max_concurrent_streams;
7947 return session->remote_settings.initial_window_size;
7949 return session->remote_settings.max_frame_size;
7951 return session->remote_settings.max_header_list_size;
7953 return session->remote_settings.enable_connect_protocol;
7955 return session->remote_settings.no_rfc7540_priorities;
7962 uint32_t nghttp2_session_get_local_settings(nghttp2_session *session,
7966 return session->local_settings.header_table_size;
7968 return session->local_settings.enable_push;
7970 return session->local_settings.max_concurrent_streams;
7972 return session->local_settings.initial_window_size;
7974 return session->local_settings.max_frame_size;
7976 return session->local_settings.max_header_list_size;
7978 return session->local_settings.enable_connect_protocol;
7980 return session->local_settings.no_rfc7540_priorities;
7987 static int nghttp2_session_upgrade_internal(nghttp2_session *session,
7999 mem = &session->mem;
8001 if ((!session->server && session->next_stream_id != 1) ||
8002 (session->server && session->last_recv_stream_id >= 1)) {
8010 session->max_settings) {
8019 if (session->server) {
8024 rv = nghttp2_session_on_settings_received(session, &frame, 1 /* No ACK */);
8026 rv = nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, niv);
8036 session, 1, NGHTTP2_STREAM_FLAG_NONE, &pri_spec, NGHTTP2_STREAM_OPENING,
8037 session->server ? NULL : stream_user_data);
8045 if (session->server) {
8047 session->last_recv_stream_id = 1;
8048 session->last_proc_stream_id = 1;
8051 session->last_sent_stream_id = 1;
8052 session->next_stream_id += 2;
8057 int nghttp2_session_upgrade(nghttp2_session *session,
8064 rv = nghttp2_session_upgrade_internal(session, settings_payload,
8070 stream = nghttp2_session_get_stream(session, 1);
8086 int nghttp2_session_upgrade2(nghttp2_session *session,
8093 rv = nghttp2_session_upgrade_internal(session, settings_payload,
8099 stream = nghttp2_session_get_stream(session, 1);
8109 int nghttp2_session_get_stream_local_close(nghttp2_session *session,
8113 stream = nghttp2_session_get_stream(session, stream_id);
8122 int nghttp2_session_get_stream_remote_close(nghttp2_session *session,
8126 stream = nghttp2_session_get_stream(session, stream_id);
8135 int nghttp2_session_consume(nghttp2_session *session, int32_t stream_id,
8144 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8148 rv = session_update_connection_consumed_size(session, size);
8154 stream = nghttp2_session_get_stream(session, stream_id);
8160 rv = session_update_stream_consumed_size(session, stream, size);
8169 int nghttp2_session_consume_connection(nghttp2_session *session, size_t size) {
8172 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8176 rv = session_update_connection_consumed_size(session, size);
8185 int nghttp2_session_consume_stream(nghttp2_session *session, int32_t stream_id,
8194 if (!(session->opt_flags & NGHTTP2_OPTMASK_NO_AUTO_WINDOW_UPDATE)) {
8198 stream = nghttp2_session_get_stream(session, stream_id);
8204 rv = session_update_stream_consumed_size(session, stream, size);
8213 int nghttp2_session_set_next_stream_id(nghttp2_session *session,
8216 session->next_stream_id > (uint32_t)next_stream_id) {
8220 if (session->server) {
8228 session->next_stream_id = (uint32_t)next_stream_id;
8232 uint32_t nghttp2_session_get_next_stream_id(nghttp2_session *session) {
8233 return session->next_stream_id;
8236 int32_t nghttp2_session_get_last_proc_stream_id(nghttp2_session *session) {
8237 return session->last_proc_stream_id;
8240 nghttp2_stream *nghttp2_session_find_stream(nghttp2_session *session,
8243 return &session->root;
8246 return nghttp2_session_get_stream_raw(session, stream_id);
8249 nghttp2_stream *nghttp2_session_get_root_stream(nghttp2_session *session) {
8250 return &session->root;
8253 int nghttp2_session_check_server_session(nghttp2_session *session) {
8254 return session->server;
8258 nghttp2_session *session, int32_t stream_id,
8264 if (session->pending_no_rfc7540_priorities == 1) {
8272 stream = nghttp2_session_get_stream_raw(session, stream_id);
8280 rv = nghttp2_session_reprioritize_stream(session, stream, &pri_spec_copy);
8294 int nghttp2_session_create_idle_stream(nghttp2_session *session,
8300 if (session->pending_no_rfc7540_priorities == 1) {
8305 !session_detect_idle_stream(session, stream_id)) {
8309 stream = nghttp2_session_get_stream_raw(session, stream_id);
8318 nghttp2_session_open_stream(session, stream_id, NGHTTP2_STREAM_FLAG_NONE,
8333 nghttp2_session_get_hd_inflate_dynamic_table_size(nghttp2_session *session) {
8334 return nghttp2_hd_inflate_get_dynamic_table_size(&session->hd_inflater);
8338 nghttp2_session_get_hd_deflate_dynamic_table_size(nghttp2_session *session) {
8339 return nghttp2_hd_deflate_get_dynamic_table_size(&session->hd_deflater);
8342 void nghttp2_session_set_user_data(nghttp2_session *session, void *user_data) {
8343 session->user_data = user_data;
8347 nghttp2_session *session, int32_t stream_id,
8352 if (!session->server) {
8356 if (session->pending_no_rfc7540_priorities != 1) {
8364 stream = nghttp2_session_get_stream_raw(session, stream_id);
8377 return session_update_stream_priority(session, stream,