Lines Matching refs:frame
92 * Returns nonzero if |frame| is trailer headers.
96 nghttp2_frame *frame) {
97 if (!stream || frame->hd.type != NGHTTP2_HEADERS) {
101 return frame->headers.cat == NGHTTP2_HCAT_HEADERS;
104 return frame->headers.cat == NGHTTP2_HCAT_HEADERS &&
310 iframe->frame.hd.type is 0, so that no free is performed. */
311 switch (iframe->frame.hd.type) {
315 nghttp2_frame_headers_free(&iframe->frame.headers, mem);
318 nghttp2_frame_priority_free(&iframe->frame.priority);
321 nghttp2_frame_rst_stream_free(&iframe->frame.rst_stream);
324 nghttp2_frame_settings_free(&iframe->frame.settings, mem);
334 nghttp2_frame_push_promise_free(&iframe->frame.push_promise, mem);
337 nghttp2_frame_ping_free(&iframe->frame.ping);
340 nghttp2_frame_goaway_free(&iframe->frame.goaway, mem);
343 nghttp2_frame_window_update_free(&iframe->frame.window_update);
346 /* extension frame */
348 iframe->frame.hd.type)) {
349 nghttp2_frame_extension_free(&iframe->frame.ext);
351 switch (iframe->frame.hd.type) {
356 nghttp2_frame_altsvc_free(&iframe->frame.ext, mem);
362 nghttp2_frame_origin_free(&iframe->frame.ext, mem);
378 memset(&iframe->frame, 0, sizeof(nghttp2_frame));
1111 /* TODO Return error if stream is not found for the frame requiring
1115 nghttp2_frame *frame;
1117 frame = &item->frame;
1118 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
1120 switch (frame->hd.type) {
1144 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST ||
1181 session, frame->push_promise.promised_stream_id,
1199 } else if (frame->hd.stream_id == 0) {
1216 nghttp2_frame *frame;
1245 headers_frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
1253 if (item->frame.hd.stream_id < stream_id) {
1259 if (item->frame.hd.stream_id > stream_id || aux_data->canceled) {
1278 frame = &item->frame;
1280 nghttp2_frame_rst_stream_init(&frame->rst_stream, stream_id, error_code);
1283 nghttp2_frame_rst_stream_free(&frame->rst_stream);
1377 stream created by PRIORITY frame was opened. Somehow we
1767 * Check that we can send a frame to the |stream|. This function
1768 * returns 0 if we can send a frame to the |frame|, or one of the
1799 * This function checks request HEADERS frame, which opens stream, can
1808 * frame->hd.stream_id.
1828 * This function checks HEADERS, which is the first frame from the
1838 * The transmission is not allowed for this stream (e.g., a frame
1932 * The transmission is not allowed for this stream (e.g., a frame
1964 * This function checks PUSH_PROMISE frame |frame| with the |stream|
1981 * The transmission is not allowed for this stream (e.g., a frame
2018 * frame does not affect the transmission of the WINDOW_UPDATE frame.
2109 /* Take into account settings max frame size and both connection-level
2130 * settings for max frame size is also taken into account.
2154 * The transmission is not allowed for this stream (e.g., a frame
2195 const nghttp2_frame *frame,
2199 if (frame->hd.length >= max_payloadlen) {
2200 return (ssize_t)frame->hd.length;
2207 nghttp2_min(frame->hd.length + NGHTTP2_MAX_PADLEN, max_payloadlen);
2210 session, frame, max_paddedlen, session->user_data);
2211 if (rv < (ssize_t)frame->hd.length || rv > (ssize_t)max_paddedlen) {
2216 return (ssize_t)frame->hd.length;
2220 frame->headers.padlen in this function to use the fact that
2221 frame->push_promise has also padlen in the same position. */
2223 nghttp2_frame *frame) {
2234 frame->hd.length + NGHTTP2_MAX_PADLEN);
2237 session_call_select_padding(session, frame, max_payloadlen);
2243 padlen = (size_t)padded_payloadlen - frame->hd.length;
2248 nghttp2_frame_add_pad(framebufs, &frame->hd, padlen, 0);
2250 frame->headers.padlen = padlen;
2264 nghttp2_frame *frame) {
2276 frame, session->user_data);
2287 frame->hd.length = framelen;
2293 nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
2299 * This function serializes frame for transmission.
2307 nghttp2_frame *frame;
2311 frame = &item->frame;
2313 switch (frame->hd.type) {
2318 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2329 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
2342 /* This must be true since we only pop DATA frame item from
2355 next_readmax, frame, &item->aux_data.data,
2371 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
2391 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
2396 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
2397 &frame->headers.pri_spec, NGHTTP2_STREAM_INITIAL,
2413 nghttp2_http_record_request_method(stream, frame);
2418 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2423 frame->headers.cat = NGHTTP2_HCAT_PUSH_RESPONSE;
2431 frame->headers.cat = NGHTTP2_HCAT_RESPONSE;
2434 frame->headers.cat = NGHTTP2_HCAT_HEADERS;
2445 session, frame->headers.nva, frame->headers.nvlen,
2452 rv = nghttp2_frame_pack_headers(&session->aob.framebufs, &frame->headers,
2462 rv = session_headers_add_pad(session, frame);
2471 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
2472 assert(session->last_sent_stream_id < frame->hd.stream_id);
2473 session->last_sent_stream_id = frame->hd.stream_id;
2482 /* PRIORITY frame can be sent at any time and to any stream
2484 nghttp2_frame_pack_priority(&session->aob.framebufs, &frame->priority);
2486 /* Peer can send PRIORITY frame against idle stream to create
2496 nghttp2_frame_pack_rst_stream(&session->aob.framebufs, &frame->rst_stream);
2499 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
2511 rv = nghttp2_frame_pack_settings(&session->aob.framebufs, &frame->settings);
2523 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2534 session, frame->push_promise.nva, frame->push_promise.nvlen, 0);
2541 &session->aob.framebufs, &frame->push_promise, &session->hd_deflater);
2545 rv = session_headers_add_pad(session, frame);
2551 frame->push_promise.promised_stream_id);
2552 session->last_sent_stream_id = frame->push_promise.promised_stream_id;
2557 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
2561 /* PING frame is allowed to be sent unless termination GOAWAY is
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);
2582 &frame->window_update);
2591 /* extension frame */
2600 return session_pack_extension(session, &session->aob.framebufs, frame);
2603 switch (frame->hd.type) {
2605 rv = session_predicate_altsvc_send(session, frame->hd.stream_id);
2610 nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
2619 rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext);
2626 nghttp2_ext_priority_update *priority_update = frame->ext.payload;
2633 nghttp2_frame_pack_priority_update(&session->aob.framebufs, &frame->ext);
2716 nghttp2_frame *frame) {
2719 rv = session->callbacks.before_frame_send_callback(session, frame,
2733 nghttp2_frame *frame) {
2736 rv = session->callbacks.on_frame_send_callback(session, frame,
2821 stream->last_writelen = stream->item->frame.hd.length;
2843 * Called after a frame is sent. This function runs
2861 nghttp2_frame *frame;
2864 frame = &item->frame;
2866 if (frame->hd.type == NGHTTP2_DATA) {
2871 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2872 /* We update flow control window after a frame was completely
2875 session->remote_window_size -= (int32_t)frame->hd.length;
2877 stream->remote_window_size -= (int32_t)frame->hd.length;
2887 rv = session_call_on_frame_send(session, frame);
2893 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2914 rv = session_call_on_frame_send(session, frame);
2923 /* non-DATA frame */
2925 if (frame->hd.type == NGHTTP2_HEADERS ||
2926 frame->hd.type == NGHTTP2_PUSH_PROMISE) {
2932 rv = session_call_on_frame_send(session, frame);
2936 switch (frame->hd.type) {
2940 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2945 switch (frame->headers.cat) {
2948 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2960 frame->hd.stream_id, &aux_data->data_prd);
2965 DATA frame item. We might have to handle it here. */
2977 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2988 frame->hd.stream_id, &aux_data->data_prd);
2993 DATA frame item. We might have to handle it here. */
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,
3016 &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL);
3022 &frame->priority.pri_spec);
3036 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
3037 frame->rst_stream.error_code);
3055 rv = session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
3066 if (frame->hd.stream_id == 0) {
3081 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3112 * Called after a frame is sent and session_after_frame_sent1. This
3119 nghttp2_frame *frame;
3125 frame = &item->frame;
3127 if (frame->hd.type != NGHTTP2_DATA) {
3129 if (frame->hd.type == NGHTTP2_HEADERS ||
3130 frame->hd.type == NGHTTP2_PUSH_PROMISE) {
3135 DEBUGF("send: next CONTINUATION frame, %zu bytes\n",
3147 /* DATA frame */
3164 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3190 nghttp2_frame *frame;
3194 frame = &item->frame;
3195 length = frame->hd.length - frame->data.padlen;
3198 rv = session->callbacks.send_data_callback(session, frame, buf->pos, length,
3248 DEBUGF("send: frame transmission deferred\n");
3256 DEBUGF("send: frame preparation failed with %s\n",
3260 if (item->frame.hd.type != NGHTTP2_DATA &&
3262 nghttp2_frame *frame = &item->frame;
3264 WINDOW_UPDATE frame, so we don't call error callback for
3266 if (frame->hd.type != NGHTTP2_WINDOW_UPDATE &&
3268 session, frame, rv, session->user_data) != 0) {
3278 switch (item->frame.hd.type) {
3280 if (item->frame.headers.cat == NGHTTP2_HCAT_REQUEST) {
3281 opened_stream_id = item->frame.hd.stream_id;
3292 opened_stream_id = item->frame.push_promise.promised_stream_id;
3325 if (item->frame.hd.type != NGHTTP2_DATA) {
3326 nghttp2_frame *frame;
3328 frame = &item->frame;
3330 DEBUGF("send: next frame: payloadlen=%zu, type=%u, flags=0x%02x, "
3332 frame->hd.length, frame->hd.type, frame->hd.flags,
3333 frame->hd.stream_id);
3335 rv = session_call_before_frame_send(session, frame);
3346 session, frame, rv, session->user_data) != 0) {
3353 switch (item->frame.hd.type) {
3355 if (item->frame.headers.cat == NGHTTP2_HCAT_REQUEST) {
3356 opened_stream_id = item->frame.hd.stream_id;
3366 opened_stream_id = item->frame.push_promise.promised_stream_id;
3385 DEBUGF("send: next frame: DATA\n");
3393 DEBUGF("send: start transmitting frame type=%u, length=%zd\n",
3408 DEBUGF("send: end transmission of a frame\n");
3437 nghttp2_frame *frame;
3442 frame = &aob->item->frame;
3444 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3461 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
3605 nghttp2_frame *frame) {
3608 rv = session->callbacks.on_frame_recv_callback(session, frame,
3618 nghttp2_frame *frame) {
3621 frame->hd.stream_id);
3623 rv = session->callbacks.on_begin_headers_callback(session, frame,
3636 const nghttp2_frame *frame,
3641 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3644 session, frame, nv->name->base, nv->name->len, nv->value->base,
3659 const nghttp2_frame *frame,
3664 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3667 session, frame, nv->name->base, nv->name->len, nv->value->base,
3688 nghttp2_frame *frame = &iframe->frame;
3692 session, &frame->hd, data, len, session->user_data);
3707 nghttp2_frame *frame = &iframe->frame;
3711 session, &payload, &frame->hd, session->user_data);
3719 frame->ext.payload = payload;
3725 * Handles frame size error.
3770 nghttp2_frame *frame,
3774 session, frame, lib_error_code, session->user_data) != 0) {
3783 nghttp2_frame *frame,
3793 session, frame, lib_error_code, session->user_data) != 0) {
3801 nghttp2_frame *frame,
3803 return session_handle_invalid_stream2(session, frame->hd.stream_id, frame,
3808 nghttp2_frame *frame,
3811 rv = session_handle_invalid_stream(session, frame, lib_error_code);
3819 * Handles invalid frame which causes connection error.
3822 nghttp2_frame *frame,
3827 session, frame, lib_error_code, session->user_data) != 0) {
3836 nghttp2_frame *frame,
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);
3889 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
3891 session, frame->push_promise.promised_stream_id);
3894 trailer = session_trailer_headers(session, stream, frame);
3937 rv = nghttp2_http_on_header(session, subject_stream, frame, &nv,
3944 rv2 = session_call_on_invalid_header(session, frame, &nv);
3954 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3959 "Ignoring received invalid HTTP header field: frame type: "
3961 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3972 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3977 "Invalid HTTP header field was received: frame type: "
3979 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3988 frame, NGHTTP2_ERR_HTTP_HEADER);
3996 rv = session_call_on_header(session, frame, &nv);
4017 * Call this function when HEADERS frame was completely received.
4028 nghttp2_frame *frame,
4032 assert(frame->hd.type == NGHTTP2_HEADERS);
4035 frame->headers.cat == NGHTTP2_HCAT_REQUEST &&
4046 if ((frame->hd.flags & NGHTTP2_FLAG_END_STREAM) == 0) {
4061 nghttp2_frame *frame = &session->iframe.frame;
4066 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4072 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
4076 session, frame->push_promise.promised_stream_id);
4078 rv = nghttp2_http_on_request_headers(subject_stream, frame);
4081 assert(frame->hd.type == NGHTTP2_HEADERS);
4082 switch (frame->headers.cat) {
4084 rv = nghttp2_http_on_request_headers(stream, frame);
4095 rv = nghttp2_http_on_trailer_headers(stream, frame);
4101 if (rv == 0 && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
4108 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
4109 stream_id = frame->push_promise.promised_stream_id;
4111 stream_id = frame->hd.stream_id;
4114 rv = session_handle_invalid_stream2(session, stream_id, frame,
4120 if (frame->hd.type == NGHTTP2_HEADERS &&
4121 (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
4130 rv = session_call_on_frame_received(session, frame);
4135 if (frame->hd.type != NGHTTP2_HEADERS) {
4139 return session_end_stream_headers_received(session, frame, stream);
4143 nghttp2_frame *frame) {
4146 if (frame->hd.stream_id == 0) {
4148 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0");
4155 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4157 session, frame, NGHTTP2_ERR_PROTO,
4166 if (!session_is_new_peer_stream_id(session, frame->hd.stream_id)) {
4167 if (frame->hd.stream_id == 0 ||
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;
4206 session, frame, NGHTTP2_ERR_PROTO,
4215 if (frame->headers.pri_spec.stream_id == frame->hd.stream_id) {
4217 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself");
4221 return session_inflate_handle_invalid_stream(session, frame,
4226 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4227 &frame->headers.pri_spec, NGHTTP2_STREAM_OPENING, NULL);
4239 rv = session_call_on_begin_headers(session, frame);
4247 nghttp2_frame *frame,
4253 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id));
4254 if (frame->hd.stream_id == 0) {
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);
4279 nghttp2_frame *frame,
4283 if (frame->hd.stream_id == 0) {
4285 session, frame, NGHTTP2_ERR_PROTO,
4291 session, frame, NGHTTP2_ERR_PROTO,
4297 session, frame, NGHTTP2_ERR_PROTO,
4307 return session_inflate_handle_invalid_stream(session, frame,
4316 rv = session_call_on_begin_headers(session, frame);
4324 nghttp2_frame *frame,
4327 if (frame->hd.stream_id == 0) {
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);
4355 has sent END_STREAM frame already. But if stream is in
4356 NGHTTP2_STREAM_CLOSING, we discard the frame. This is a race
4359 rv = session_call_on_begin_headers(session, frame);
4370 nghttp2_frame *frame = &iframe->frame;
4373 nghttp2_frame_unpack_headers_payload(&frame->headers, iframe->sbuf.pos);
4375 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4377 frame->headers.cat = NGHTTP2_HCAT_REQUEST;
4378 return nghttp2_session_on_request_headers_received(session, frame);
4382 frame->headers.cat = NGHTTP2_HCAT_PUSH_RESPONSE;
4383 return nghttp2_session_on_push_response_headers_received(session, frame,
4388 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4389 frame->headers.cat = NGHTTP2_HCAT_RESPONSE;
4390 return nghttp2_session_on_response_headers_received(session, frame, stream);
4393 frame->headers.cat = NGHTTP2_HCAT_HEADERS;
4394 return nghttp2_session_on_headers_received(session, frame, stream);
4398 nghttp2_frame *frame) {
4404 if (frame->hd.stream_id == 0) {
4405 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4409 if (frame->priority.pri_spec.stream_id == frame->hd.stream_id) {
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,
4430 &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL);
4442 &frame->priority.pri_spec);
4454 return session_call_on_frame_received(session, frame);
4459 nghttp2_frame *frame = &iframe->frame;
4463 nghttp2_frame_unpack_priority_payload(&frame->priority, iframe->sbuf.pos);
4465 return nghttp2_session_on_priority_received(session, frame);
4486 nghttp2_frame *frame) {
4489 if (frame->hd.stream_id == 0) {
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,
4510 frame->rst_stream.error_code);
4520 nghttp2_frame *frame = &iframe->frame;
4522 nghttp2_frame_unpack_rst_stream_payload(&frame->rst_stream, iframe->sbuf.pos);
4524 return nghttp2_session_on_rst_stream_received(session, frame);
4542 /* If window size gets positive, push deferred DATA frame to
4732 nghttp2_frame *frame, int noack) {
4740 if (frame->hd.stream_id != 0) {
4741 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4744 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
4745 if (frame->settings.niv != 0) {
4747 session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR,
4755 session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK");
4769 return session_handle_invalid_connection(session, frame, rv, NULL);
4771 return session_call_on_frame_received(session, frame);
4780 for (i = 0; i < frame->settings.niv; ++i) {
4781 nghttp2_settings_entry *entry = &frame->settings.iv[i];
4793 session, frame, NGHTTP2_ERR_HEADER_COMP, NULL);
4804 session, frame, NGHTTP2_ERR_PROTO,
4810 session, frame, NGHTTP2_ERR_PROTO,
4828 session, frame, NGHTTP2_ERR_FLOW_CONTROL,
4841 session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL);
4852 session, frame, NGHTTP2_ERR_PROTO,
4868 session, frame, NGHTTP2_ERR_PROTO,
4876 session, frame, NGHTTP2_ERR_PROTO,
4888 session, frame, NGHTTP2_ERR_PROTO,
4895 session, frame, NGHTTP2_ERR_PROTO,
4923 return session_handle_invalid_connection(session, frame,
4928 return session_call_on_frame_received(session, frame);
4933 nghttp2_frame *frame = &iframe->frame;
4958 nghttp2_frame_unpack_settings_payload(&frame->settings, iframe->iv,
4965 return nghttp2_session_on_settings_received(session, frame, 0 /* ACK */);
4969 nghttp2_frame *frame) {
4975 if (frame->hd.stream_id == 0) {
4977 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 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");
4995 frame->push_promise.promised_stream_id)) {
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);
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,
5047 rv = session_call_on_begin_headers(session, frame);
5056 nghttp2_frame *frame = &iframe->frame;
5058 nghttp2_frame_unpack_push_promise_payload(&frame->push_promise,
5061 return nghttp2_session_on_push_promise_received(session, frame);
5065 nghttp2_frame *frame) {
5067 if (frame->hd.stream_id != 0) {
5068 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5072 (frame->hd.flags & NGHTTP2_FLAG_ACK) == 0 &&
5076 frame->ping.opaque_data);
5081 return session_call_on_frame_received(session, frame);
5086 nghttp2_frame *frame = &iframe->frame;
5088 nghttp2_frame_unpack_ping_payload(&frame->ping, iframe->sbuf.pos);
5090 return nghttp2_session_on_ping_received(session, frame);
5094 nghttp2_frame *frame) {
5097 if (frame->hd.stream_id != 0) {
5098 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5103 if ((frame->goaway.last_stream_id > 0 &&
5105 frame->goaway.last_stream_id)) ||
5106 session->remote_last_stream_id < frame->goaway.last_stream_id) {
5107 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
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,
5127 nghttp2_frame *frame = &iframe->frame;
5129 nghttp2_frame_unpack_goaway_payload(&frame->goaway, iframe->sbuf.pos,
5135 return nghttp2_session_on_goaway_received(session, frame);
5140 nghttp2_frame *frame) {
5142 if (frame->window_update.window_size_increment == 0) {
5144 session, frame, NGHTTP2_ERR_PROTO,
5148 if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment <
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);
5159 nghttp2_frame *frame) {
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);
5174 session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream");
5176 if (frame->window_update.window_size_increment == 0) {
5178 session, frame, NGHTTP2_ERR_PROTO,
5181 if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment <
5183 return session_handle_invalid_stream(session, frame,
5186 stream->remote_window_size += frame->window_update.window_size_increment;
5198 return session_call_on_frame_received(session, frame);
5202 nghttp2_frame *frame) {
5203 if (frame->hd.stream_id == 0) {
5204 return session_on_connection_window_update_received(session, frame);
5206 return session_on_stream_window_update_received(session, frame);
5212 nghttp2_frame *frame = &iframe->frame;
5214 nghttp2_frame_unpack_window_update_payload(&frame->window_update,
5217 return nghttp2_session_on_window_update_received(session, frame);
5221 nghttp2_frame *frame) {
5225 altsvc = frame->ext.payload;
5229 if (frame->hd.stream_id == 0) {
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);
5259 nghttp2_frame *frame) {
5260 return session_call_on_frame_received(session, frame);
5264 nghttp2_frame *frame) {
5273 priority_update = frame->ext.payload;
5275 if (frame->hd.stream_id != 0) {
5276 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5283 session, frame, NGHTTP2_ERR_PROTO,
5288 return session_call_on_frame_received(session, frame);
5295 return session_call_on_frame_received(session, frame);
5301 session, frame, NGHTTP2_ERR_PROTO,
5313 return session_call_on_frame_received(session, frame);
5323 return session_call_on_frame_received(session, frame);
5334 return session_call_on_frame_received(session, frame);
5339 nghttp2_frame *frame = &iframe->frame;
5342 &frame->ext, nghttp2_get_uint16(iframe->sbuf.pos), iframe->lbuf.pos,
5349 return nghttp2_session_on_altsvc_received(session, frame);
5354 nghttp2_frame *frame = &iframe->frame;
5358 rv = nghttp2_frame_unpack_origin_payload(&frame->ext, iframe->lbuf.pos,
5364 /* Ignore ORIGIN frame which cannot be parsed. */
5368 return nghttp2_session_on_origin_received(session, frame);
5373 nghttp2_frame *frame = &iframe->frame;
5375 nghttp2_frame_unpack_priority_update_payload(&frame->ext, iframe->sbuf.pos,
5378 return nghttp2_session_on_priority_update_received(session, frame);
5384 nghttp2_frame *frame = &iframe->frame;
5396 return session_call_on_frame_received(session, frame);
5400 nghttp2_frame *frame) {
5406 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5409 of RST_STREAM. So just ignore frame against nonexistent stream
5415 (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
5430 rv = session_call_on_frame_received(session, frame);
5435 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
5448 nghttp2_frame *public_data_frame = &session->iframe.frame;
5458 * detected strictly. If DATA frame is received with length > 0 and
5589 * Checks that we can receive the DATA frame for stream, which is
5590 * indicated by |session->iframe.frame.hd.stream_id|. If it is a
5591 * connection error situation, GOAWAY frame will be issued by this
5594 * If the DATA frame is allowed, returns 0.
5600 * The reception of DATA frame is connection error; or should be
5614 stream_id = iframe->frame.hd.stream_id;
5617 /* The spec says that if a DATA frame is received whose stream ID
5779 /* We cannot use iframe->frame.hd.length because of CONTINUATION */
5799 nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen);
5887 "SETTINGS frame. Perhaps, peer does not support HTTP/2 "
5919 nghttp2_frame_unpack_frame_hd(&iframe->frame.hd, iframe->sbuf.pos);
5920 iframe->payloadleft = iframe->frame.hd.length;
5923 iframe->frame.hd.length, iframe->frame.hd.type,
5924 iframe->frame.hd.flags, iframe->frame.hd.stream_id);
5926 if (iframe->frame.hd.length > session->local_settings.max_frame_size) {
5927 DEBUGF("recv: length is too large %zu > %u\n", iframe->frame.hd.length,
5931 session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size");
5940 switch (iframe->frame.hd.type) {
5944 iframe->frame.hd.flags &=
5956 iframe->frame.hd.stream_id);
5965 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
5989 iframe->frame.hd.flags &=
5993 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
6009 pri_fieldlen = nghttp2_frame_priority_len(iframe->frame.hd.flags);
6028 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6049 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6068 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6086 switch (iframe->frame.hd.type) {
6096 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6112 iframe->frame.hd.flags &= NGHTTP2_FLAG_ACK;
6114 if ((iframe->frame.hd.length % NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH) ||
6115 ((iframe->frame.hd.flags & NGHTTP2_FLAG_ACK) &&
6124 !(iframe->frame.hd.flags & NGHTTP2_FLAG_ACK)) {
6136 iframe->frame.hd.length / NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH + 1;
6172 iframe->frame.hd.flags &=
6175 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
6205 iframe->frame.hd.flags &= NGHTTP2_FLAG_ACK;
6220 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6245 DEBUGF("recv: extension frame\n");
6248 iframe->frame.hd.type)) {
6250 /* Silently ignore unknown frame type. */
6265 switch (iframe->frame.hd.type) {
6276 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6277 iframe->frame.ext.payload = &iframe->ext_frame_payload.altsvc;
6306 iframe->frame.ext.payload = &iframe->ext_frame_payload.origin;
6308 if (session->server || iframe->frame.hd.stream_id ||
6309 (iframe->frame.hd.flags & 0xf0)) {
6315 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6343 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6344 iframe->frame.ext.payload =
6395 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6419 switch (iframe->frame.hd.type) {
6422 (iframe->frame.hd.flags & NGHTTP2_FLAG_PADDED)) {
6423 pri_fieldlen = nghttp2_frame_priority_len(iframe->frame.hd.flags);
6434 iframe->frame.headers.padlen = (size_t)padlen;
6464 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6511 (iframe->frame.hd.flags & NGHTTP2_FLAG_PADDED)) {
6524 iframe->frame.push_promise.padlen = (size_t)padlen;
6552 session, iframe->frame.push_promise.promised_stream_id,
6586 debuglen = iframe->frame.hd.length - 8;
6630 if (iframe->frame.hd.length > 2) {
6632 nghttp2_mem_malloc(mem, iframe->frame.hd.length - 2);
6639 iframe->frame.hd.length);
6661 /* This is unknown frame */
6693 trail_padlen = nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen);
6695 final = (iframe->frame.hd.flags & NGHTTP2_FLAG_END_HEADERS) &&
6704 inflate_header_block(session, &iframe->frame, &hd_proclen,
6733 iframe->frame.hd.type == NGHTTP2_PUSH_PROMISE
6734 ? iframe->frame.push_promise.promised_stream_id
6735 : iframe->frame.hd.stream_id,
6767 if ((iframe->frame.hd.flags & NGHTTP2_FLAG_END_HEADERS) == 0) {
6805 switch (iframe->frame.hd.type) {
6927 cont_hd.stream_id != iframe->frame.hd.stream_id) {
6930 iframe->frame.hd.stream_id, NGHTTP2_CONTINUATION,
6934 "unexpected non-CONTINUATION frame or stream_id is invalid");
6944 iframe->frame.hd.flags =
6945 (uint8_t)(iframe->frame.hd.flags |
6947 iframe->frame.hd.length += cont_hd.length;
6990 nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen);
7000 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7005 (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0);
7023 iframe->frame.data.padlen = (size_t)padlen;
7029 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7062 (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0);
7079 rv = nghttp2_session_consume(session, iframe->frame.hd.stream_id,
7111 session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
7122 session, iframe->frame.hd.flags, iframe->frame.hd.stream_id,
7159 DATA frame too */
7371 * frames if there is pending ones. If pending frame is request/push
7388 nghttp2_frame *frame;
7405 frame = &item->frame;
7407 nghttp2_frame_ping_init(&frame->ping, flags, opaque_data);
7412 nghttp2_frame_ping_free(&frame->ping);
7429 nghttp2_frame *frame;
7459 frame = &item->frame;
7465 nghttp2_frame_goaway_init(&frame->goaway, last_stream_id, error_code,
7473 nghttp2_frame_goaway_free(&frame->goaway, mem);
7488 nghttp2_frame *frame;
7499 frame = &item->frame;
7501 nghttp2_frame_window_update_init(&frame->window_update, flags, stream_id,
7507 nghttp2_frame_window_update_free(&frame->window_update);
7528 nghttp2_frame *frame;
7594 frame = &item->frame;
7596 nghttp2_frame_settings_init(&frame->settings, flags, iv_copy, niv);
7604 nghttp2_frame_settings_free(&frame->settings, mem);
7651 size_t datamax, nghttp2_frame *frame,
7668 session, frame->hd.type, stream->stream_id, session->remote_window_size,
7710 session, frame->hd.stream_id, buf->pos, datamax, &data_flags,
7732 frame->hd.flags = NGHTTP2_FLAG_NONE;
7740 frame->hd.flags |= NGHTTP2_FLAG_END_STREAM;
7753 frame->hd.length = (size_t)payloadlen;
7754 frame->data.padlen = 0;
7756 max_payloadlen = nghttp2_min(datamax, frame->hd.length + NGHTTP2_MAX_PADLEN);
7759 session_call_select_padding(session, frame, max_payloadlen);
7765 frame->data.padlen = (size_t)(padded_payloadlen - payloadlen);
7767 nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
7769 nghttp2_frame_add_pad(bufs, &frame->hd, frame->data.padlen,
7774 if (frame->hd.length == 0 && (data_flags & NGHTTP2_DATA_FLAG_EOF) &&
7776 /* DATA payload length is 0, and DATA frame does not bear
7778 DATA frame. */
7800 nghttp2_frame *frame;
7814 frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
7815 assert(frame->hd.type == NGHTTP2_HEADERS);
7817 if (frame->hd.stream_id > stream_id ||
7823 if (item->frame.hd.stream_id < stream_id) {
7827 if (item->frame.hd.stream_id > stream_id) {
7992 nghttp2_frame frame;
8008 /* SETTINGS frame contains too many settings */
8020 nghttp2_frame_hd_init(&frame.hd, settings_payloadlen, NGHTTP2_SETTINGS,
8022 frame.settings.iv = iv;
8023 frame.settings.niv = niv;
8024 rv = nghttp2_session_on_settings_received(session, &frame, 1 /* No ACK */);