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));
1106 /* TODO Return error if stream is not found for the frame requiring
1110 nghttp2_frame *frame;
1112 frame = &item->frame;
1113 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
1115 switch (frame->hd.type) {
1139 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST ||
1176 session, frame->push_promise.promised_stream_id,
1194 } else if (frame->hd.stream_id == 0) {
1211 nghttp2_frame *frame;
1240 headers_frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
1248 if (item->frame.hd.stream_id < stream_id) {
1254 if (item->frame.hd.stream_id > stream_id || aux_data->canceled) {
1273 frame = &item->frame;
1275 nghttp2_frame_rst_stream_init(&frame->rst_stream, stream_id, error_code);
1278 nghttp2_frame_rst_stream_free(&frame->rst_stream);
1372 stream created by PRIORITY frame was opened. Somehow we
1762 * Check that we can send a frame to the |stream|. This function
1763 * returns 0 if we can send a frame to the |frame|, or one of the
1794 * This function checks request HEADERS frame, which opens stream, can
1803 * frame->hd.stream_id.
1823 * This function checks HEADERS, which is the first frame from the
1833 * The transmission is not allowed for this stream (e.g., a frame
1927 * The transmission is not allowed for this stream (e.g., a frame
1959 * This function checks PUSH_PROMISE frame |frame| with the |stream|
1976 * The transmission is not allowed for this stream (e.g., a frame
2013 * frame does not affect the transmission of the WINDOW_UPDATE frame.
2104 /* Take into account settings max frame size and both connection-level
2125 * settings for max frame size is also taken into account.
2149 * The transmission is not allowed for this stream (e.g., a frame
2190 const nghttp2_frame *frame,
2194 if (frame->hd.length >= max_payloadlen) {
2195 return (ssize_t)frame->hd.length;
2202 nghttp2_min(frame->hd.length + NGHTTP2_MAX_PADLEN, max_payloadlen);
2205 session, frame, max_paddedlen, session->user_data);
2206 if (rv < (ssize_t)frame->hd.length || rv > (ssize_t)max_paddedlen) {
2211 return (ssize_t)frame->hd.length;
2215 frame->headers.padlen in this function to use the fact that
2216 frame->push_promise has also padlen in the same position. */
2218 nghttp2_frame *frame) {
2229 frame->hd.length + NGHTTP2_MAX_PADLEN);
2232 session_call_select_padding(session, frame, max_payloadlen);
2238 padlen = (size_t)padded_payloadlen - frame->hd.length;
2243 nghttp2_frame_add_pad(framebufs, &frame->hd, padlen, 0);
2245 frame->headers.padlen = padlen;
2259 nghttp2_frame *frame) {
2271 frame, session->user_data);
2282 frame->hd.length = framelen;
2288 nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
2294 * This function serializes frame for transmission.
2302 nghttp2_frame *frame;
2306 frame = &item->frame;
2308 switch (frame->hd.type) {
2313 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2324 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
2337 /* This must be true since we only pop DATA frame item from
2350 next_readmax, frame, &item->aux_data.data,
2366 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
2386 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
2391 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
2392 &frame->headers.pri_spec, NGHTTP2_STREAM_INITIAL,
2408 nghttp2_http_record_request_method(stream, frame);
2413 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2418 frame->headers.cat = NGHTTP2_HCAT_PUSH_RESPONSE;
2426 frame->headers.cat = NGHTTP2_HCAT_RESPONSE;
2429 frame->headers.cat = NGHTTP2_HCAT_HEADERS;
2440 session, frame->headers.nva, frame->headers.nvlen,
2447 rv = nghttp2_frame_pack_headers(&session->aob.framebufs, &frame->headers,
2457 rv = session_headers_add_pad(session, frame);
2466 if (frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
2467 assert(session->last_sent_stream_id < frame->hd.stream_id);
2468 session->last_sent_stream_id = frame->hd.stream_id;
2477 /* PRIORITY frame can be sent at any time and to any stream
2479 nghttp2_frame_pack_priority(&session->aob.framebufs, &frame->priority);
2481 /* Peer can send PRIORITY frame against idle stream to create
2491 nghttp2_frame_pack_rst_stream(&session->aob.framebufs, &frame->rst_stream);
2494 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
2506 rv = nghttp2_frame_pack_settings(&session->aob.framebufs, &frame->settings);
2518 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2529 session, frame->push_promise.nva, frame->push_promise.nvlen, 0);
2536 &session->aob.framebufs, &frame->push_promise, &session->hd_deflater);
2540 rv = session_headers_add_pad(session, frame);
2546 frame->push_promise.promised_stream_id);
2547 session->last_sent_stream_id = frame->push_promise.promised_stream_id;
2552 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
2556 /* PING frame is allowed to be sent unless termination GOAWAY is
2561 nghttp2_frame_pack_ping(&session->aob.framebufs, &frame->ping);
2564 rv = nghttp2_frame_pack_goaway(&session->aob.framebufs, &frame->goaway);
2568 session->local_last_stream_id = frame->goaway.last_stream_id;
2572 rv = session_predicate_window_update_send(session, frame->hd.stream_id);
2577 &frame->window_update);
2586 /* extension frame */
2595 return session_pack_extension(session, &session->aob.framebufs, frame);
2598 switch (frame->hd.type) {
2600 rv = session_predicate_altsvc_send(session, frame->hd.stream_id);
2605 nghttp2_frame_pack_altsvc(&session->aob.framebufs, &frame->ext);
2614 rv = nghttp2_frame_pack_origin(&session->aob.framebufs, &frame->ext);
2621 nghttp2_ext_priority_update *priority_update = frame->ext.payload;
2628 nghttp2_frame_pack_priority_update(&session->aob.framebufs, &frame->ext);
2711 nghttp2_frame *frame) {
2714 rv = session->callbacks.before_frame_send_callback(session, frame,
2728 nghttp2_frame *frame) {
2731 rv = session->callbacks.on_frame_send_callback(session, frame,
2816 stream->last_writelen = stream->item->frame.hd.length;
2838 * Called after a frame is sent. This function runs
2856 nghttp2_frame *frame;
2859 frame = &item->frame;
2861 if (frame->hd.type == NGHTTP2_DATA) {
2866 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2867 /* We update flow control window after a frame was completely
2870 session->remote_window_size -= (int32_t)frame->hd.length;
2872 stream->remote_window_size -= (int32_t)frame->hd.length;
2882 rv = session_call_on_frame_send(session, frame);
2888 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2909 rv = session_call_on_frame_send(session, frame);
2918 /* non-DATA frame */
2920 if (frame->hd.type == NGHTTP2_HEADERS ||
2921 frame->hd.type == NGHTTP2_PUSH_PROMISE) {
2927 rv = session_call_on_frame_send(session, frame);
2931 switch (frame->hd.type) {
2935 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
2940 switch (frame->headers.cat) {
2943 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2955 frame->hd.stream_id, &aux_data->data_prd);
2960 DATA frame item. We might have to handle it here. */
2972 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
2983 frame->hd.stream_id, &aux_data->data_prd);
2988 DATA frame item. We might have to handle it here. */
3002 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
3005 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
3010 session, frame->hd.stream_id, NGHTTP2_FLAG_NONE,
3011 &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL);
3017 &frame->priority.pri_spec);
3031 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
3032 frame->rst_stream.error_code);
3050 rv = session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
3061 if (frame->hd.stream_id == 0) {
3076 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3107 * Called after a frame is sent and session_after_frame_sent1. This
3114 nghttp2_frame *frame;
3120 frame = &item->frame;
3122 if (frame->hd.type != NGHTTP2_DATA) {
3124 if (frame->hd.type == NGHTTP2_HEADERS ||
3125 frame->hd.type == NGHTTP2_PUSH_PROMISE) {
3130 DEBUGF("send: next CONTINUATION frame, %zu bytes\n",
3142 /* DATA frame */
3159 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3185 nghttp2_frame *frame;
3189 frame = &item->frame;
3190 length = frame->hd.length - frame->data.padlen;
3193 rv = session->callbacks.send_data_callback(session, frame, buf->pos, length,
3243 DEBUGF("send: frame transmission deferred\n");
3251 DEBUGF("send: frame preparation failed with %s\n",
3255 if (item->frame.hd.type != NGHTTP2_DATA &&
3257 nghttp2_frame *frame = &item->frame;
3259 WINDOW_UPDATE frame, so we don't call error callback for
3261 if (frame->hd.type != NGHTTP2_WINDOW_UPDATE &&
3263 session, frame, rv, session->user_data) != 0) {
3273 switch (item->frame.hd.type) {
3275 if (item->frame.headers.cat == NGHTTP2_HCAT_REQUEST) {
3276 opened_stream_id = item->frame.hd.stream_id;
3287 opened_stream_id = item->frame.push_promise.promised_stream_id;
3320 if (item->frame.hd.type != NGHTTP2_DATA) {
3321 nghttp2_frame *frame;
3323 frame = &item->frame;
3325 DEBUGF("send: next frame: payloadlen=%zu, type=%u, flags=0x%02x, "
3327 frame->hd.length, frame->hd.type, frame->hd.flags,
3328 frame->hd.stream_id);
3330 rv = session_call_before_frame_send(session, frame);
3341 session, frame, rv, session->user_data) != 0) {
3348 switch (item->frame.hd.type) {
3350 if (item->frame.headers.cat == NGHTTP2_HCAT_REQUEST) {
3351 opened_stream_id = item->frame.hd.stream_id;
3361 opened_stream_id = item->frame.push_promise.promised_stream_id;
3380 DEBUGF("send: next frame: DATA\n");
3388 DEBUGF("send: start transmitting frame type=%u, length=%zd\n",
3403 DEBUGF("send: end transmission of a frame\n");
3432 nghttp2_frame *frame;
3437 frame = &aob->item->frame;
3439 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3456 rv = nghttp2_session_add_rst_stream(session, frame->hd.stream_id,
3600 nghttp2_frame *frame) {
3603 rv = session->callbacks.on_frame_recv_callback(session, frame,
3613 nghttp2_frame *frame) {
3616 frame->hd.stream_id);
3618 rv = session->callbacks.on_begin_headers_callback(session, frame,
3631 const nghttp2_frame *frame,
3636 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3639 session, frame, nv->name->base, nv->name->len, nv->value->base,
3654 const nghttp2_frame *frame,
3659 session, frame, nv->name, nv->value, nv->flags, session->user_data);
3662 session, frame, nv->name->base, nv->name->len, nv->value->base,
3683 nghttp2_frame *frame = &iframe->frame;
3687 session, &frame->hd, data, len, session->user_data);
3702 nghttp2_frame *frame = &iframe->frame;
3706 session, &payload, &frame->hd, session->user_data);
3714 frame->ext.payload = payload;
3720 * Handles frame size error.
3765 nghttp2_frame *frame,
3769 session, frame, lib_error_code, session->user_data) != 0) {
3778 nghttp2_frame *frame,
3788 session, frame, lib_error_code, session->user_data) != 0) {
3796 nghttp2_frame *frame,
3798 return session_handle_invalid_stream2(session, frame->hd.stream_id, frame,
3803 nghttp2_frame *frame,
3806 rv = session_handle_invalid_stream(session, frame, lib_error_code);
3814 * Handles invalid frame which causes connection error.
3817 nghttp2_frame *frame,
3822 session, frame, lib_error_code, session->user_data) != 0) {
3831 nghttp2_frame *frame,
3836 session_handle_invalid_connection(session, frame, lib_error_code, reason);
3870 static int inflate_header_block(nghttp2_session *session, nghttp2_frame *frame,
3882 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
3884 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
3886 session, frame->push_promise.promised_stream_id);
3889 trailer = session_trailer_headers(session, stream, frame);
3932 rv = nghttp2_http_on_header(session, subject_stream, frame, &nv,
3939 rv2 = session_call_on_invalid_header(session, frame, &nv);
3949 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3954 "Ignoring received invalid HTTP header field: frame type: "
3956 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3967 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3972 "Invalid HTTP header field was received: frame type: "
3974 frame->hd.type, frame->hd.stream_id, (int)nv.name->len,
3983 frame, NGHTTP2_ERR_HTTP_HEADER);
3991 rv = session_call_on_header(session, frame, &nv);
4012 * Call this function when HEADERS frame was completely received.
4023 nghttp2_frame *frame,
4027 assert(frame->hd.type == NGHTTP2_HEADERS);
4030 frame->headers.cat == NGHTTP2_HCAT_REQUEST &&
4041 if ((frame->hd.flags & NGHTTP2_FLAG_END_STREAM) == 0) {
4056 nghttp2_frame *frame = &session->iframe.frame;
4061 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4067 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
4071 session, frame->push_promise.promised_stream_id);
4073 rv = nghttp2_http_on_request_headers(subject_stream, frame);
4076 assert(frame->hd.type == NGHTTP2_HEADERS);
4077 switch (frame->headers.cat) {
4079 rv = nghttp2_http_on_request_headers(stream, frame);
4090 rv = nghttp2_http_on_trailer_headers(stream, frame);
4096 if (rv == 0 && (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
4103 if (frame->hd.type == NGHTTP2_PUSH_PROMISE) {
4104 stream_id = frame->push_promise.promised_stream_id;
4106 stream_id = frame->hd.stream_id;
4109 rv = session_handle_invalid_stream2(session, stream_id, frame,
4115 if (frame->hd.type == NGHTTP2_HEADERS &&
4116 (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
4125 rv = session_call_on_frame_received(session, frame);
4130 if (frame->hd.type != NGHTTP2_HEADERS) {
4134 return session_end_stream_headers_received(session, frame, stream);
4138 nghttp2_frame *frame) {
4141 if (frame->hd.stream_id == 0) {
4143 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: stream_id == 0");
4150 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4152 session, frame, NGHTTP2_ERR_PROTO,
4161 if (!session_is_new_peer_stream_id(session, frame->hd.stream_id)) {
4162 if (frame->hd.stream_id == 0 ||
4163 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4165 session, frame, NGHTTP2_ERR_PROTO,
4189 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4192 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4197 session->last_recv_stream_id = frame->hd.stream_id;
4201 session, frame, NGHTTP2_ERR_PROTO,
4210 if (frame->headers.pri_spec.stream_id == frame->hd.stream_id) {
4212 session, frame, NGHTTP2_ERR_PROTO, "request HEADERS: depend on itself");
4216 return session_inflate_handle_invalid_stream(session, frame,
4221 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4222 &frame->headers.pri_spec, NGHTTP2_STREAM_OPENING, NULL);
4234 rv = session_call_on_begin_headers(session, frame);
4242 nghttp2_frame *frame,
4248 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id));
4249 if (frame->hd.stream_id == 0) {
4251 session, frame, NGHTTP2_ERR_PROTO, "response HEADERS: stream_id == 0");
4263 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4266 rv = session_call_on_begin_headers(session, frame);
4274 nghttp2_frame *frame,
4278 if (frame->hd.stream_id == 0) {
4280 session, frame, NGHTTP2_ERR_PROTO,
4286 session, frame, NGHTTP2_ERR_PROTO,
4292 session, frame, NGHTTP2_ERR_PROTO,
4302 return session_inflate_handle_invalid_stream(session, frame,
4311 rv = session_call_on_begin_headers(session, frame);
4319 nghttp2_frame *frame,
4322 if (frame->hd.stream_id == 0) {
4324 session, frame, NGHTTP2_ERR_PROTO, "HEADERS: stream_id == 0");
4336 session, frame, NGHTTP2_ERR_STREAM_CLOSED, "HEADERS: stream closed");
4338 if (nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4340 rv = session_call_on_begin_headers(session, frame);
4350 has sent END_STREAM frame already. But if stream is in
4351 NGHTTP2_STREAM_CLOSING, we discard the frame. This is a race
4354 rv = session_call_on_begin_headers(session, frame);
4365 nghttp2_frame *frame = &iframe->frame;
4368 nghttp2_frame_unpack_headers_payload(&frame->headers, iframe->sbuf.pos);
4370 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4372 frame->headers.cat = NGHTTP2_HCAT_REQUEST;
4373 return nghttp2_session_on_request_headers_received(session, frame);
4377 frame->headers.cat = NGHTTP2_HCAT_PUSH_RESPONSE;
4378 return nghttp2_session_on_push_response_headers_received(session, frame,
4383 nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4384 frame->headers.cat = NGHTTP2_HCAT_RESPONSE;
4385 return nghttp2_session_on_response_headers_received(session, frame, stream);
4388 frame->headers.cat = NGHTTP2_HCAT_HEADERS;
4389 return nghttp2_session_on_headers_received(session, frame, stream);
4393 nghttp2_frame *frame) {
4399 if (frame->hd.stream_id == 0) {
4400 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4404 if (frame->priority.pri_spec.stream_id == frame->hd.stream_id) {
4411 return session_call_on_frame_received(session, frame);
4414 stream = nghttp2_session_get_stream_raw(session, frame->hd.stream_id);
4419 if (!session_detect_idle_stream(session, frame->hd.stream_id)) {
4424 session, frame->hd.stream_id, NGHTTP2_STREAM_FLAG_NONE,
4425 &frame->priority.pri_spec, NGHTTP2_STREAM_IDLE, NULL);
4437 &frame->priority.pri_spec);
4449 return session_call_on_frame_received(session, frame);
4454 nghttp2_frame *frame = &iframe->frame;
4458 nghttp2_frame_unpack_priority_payload(&frame->priority, iframe->sbuf.pos);
4460 return nghttp2_session_on_priority_received(session, frame);
4481 nghttp2_frame *frame) {
4484 if (frame->hd.stream_id == 0) {
4485 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4489 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
4490 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4494 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
4500 rv = session_call_on_frame_received(session, frame);
4504 rv = nghttp2_session_close_stream(session, frame->hd.stream_id,
4505 frame->rst_stream.error_code);
4515 nghttp2_frame *frame = &iframe->frame;
4517 nghttp2_frame_unpack_rst_stream_payload(&frame->rst_stream, iframe->sbuf.pos);
4519 return nghttp2_session_on_rst_stream_received(session, frame);
4537 /* If window size gets positive, push deferred DATA frame to
4727 nghttp2_frame *frame, int noack) {
4735 if (frame->hd.stream_id != 0) {
4736 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
4739 if (frame->hd.flags & NGHTTP2_FLAG_ACK) {
4740 if (frame->settings.niv != 0) {
4742 session, frame, NGHTTP2_ERR_FRAME_SIZE_ERROR,
4750 session, frame, NGHTTP2_ERR_PROTO, "SETTINGS: unexpected ACK");
4764 return session_handle_invalid_connection(session, frame, rv, NULL);
4766 return session_call_on_frame_received(session, frame);
4775 for (i = 0; i < frame->settings.niv; ++i) {
4776 nghttp2_settings_entry *entry = &frame->settings.iv[i];
4788 session, frame, NGHTTP2_ERR_HEADER_COMP, NULL);
4799 session, frame, NGHTTP2_ERR_PROTO,
4805 session, frame, NGHTTP2_ERR_PROTO,
4823 session, frame, NGHTTP2_ERR_FLOW_CONTROL,
4836 session, frame, NGHTTP2_ERR_FLOW_CONTROL, NULL);
4847 session, frame, NGHTTP2_ERR_PROTO,
4863 session, frame, NGHTTP2_ERR_PROTO,
4871 session, frame, NGHTTP2_ERR_PROTO,
4883 session, frame, NGHTTP2_ERR_PROTO,
4890 session, frame, NGHTTP2_ERR_PROTO,
4918 return session_handle_invalid_connection(session, frame,
4923 return session_call_on_frame_received(session, frame);
4928 nghttp2_frame *frame = &iframe->frame;
4953 nghttp2_frame_unpack_settings_payload(&frame->settings, iframe->iv,
4960 return nghttp2_session_on_settings_received(session, frame, 0 /* ACK */);
4964 nghttp2_frame *frame) {
4970 if (frame->hd.stream_id == 0) {
4972 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream_id == 0");
4976 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: push disabled");
4979 if (!nghttp2_session_is_my_stream_id(session, frame->hd.stream_id)) {
4981 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: invalid stream_id");
4990 frame->push_promise.promised_stream_id)) {
4995 session, frame, NGHTTP2_ERR_PROTO,
4999 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5001 session, frame, NGHTTP2_ERR_PROTO, "PUSH_PROMISE: stream in idle");
5004 session->last_recv_stream_id = frame->push_promise.promised_stream_id;
5005 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5014 session, frame->push_promise.promised_stream_id, NGHTTP2_CANCEL);
5023 session, frame, NGHTTP2_ERR_STREAM_CLOSED,
5031 session, frame->push_promise.promised_stream_id, NGHTTP2_STREAM_FLAG_NONE,
5042 rv = session_call_on_begin_headers(session, frame);
5051 nghttp2_frame *frame = &iframe->frame;
5053 nghttp2_frame_unpack_push_promise_payload(&frame->push_promise,
5056 return nghttp2_session_on_push_promise_received(session, frame);
5060 nghttp2_frame *frame) {
5062 if (frame->hd.stream_id != 0) {
5063 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5067 (frame->hd.flags & NGHTTP2_FLAG_ACK) == 0 &&
5071 frame->ping.opaque_data);
5076 return session_call_on_frame_received(session, frame);
5081 nghttp2_frame *frame = &iframe->frame;
5083 nghttp2_frame_unpack_ping_payload(&frame->ping, iframe->sbuf.pos);
5085 return nghttp2_session_on_ping_received(session, frame);
5089 nghttp2_frame *frame) {
5092 if (frame->hd.stream_id != 0) {
5093 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5098 if ((frame->goaway.last_stream_id > 0 &&
5100 frame->goaway.last_stream_id)) ||
5101 session->remote_last_stream_id < frame->goaway.last_stream_id) {
5102 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5108 session->remote_last_stream_id = frame->goaway.last_stream_id;
5110 rv = session_call_on_frame_received(session, frame);
5116 return session_close_stream_on_goaway(session, frame->goaway.last_stream_id,
5122 nghttp2_frame *frame = &iframe->frame;
5124 nghttp2_frame_unpack_goaway_payload(&frame->goaway, iframe->sbuf.pos,
5130 return nghttp2_session_on_goaway_received(session, frame);
5135 nghttp2_frame *frame) {
5137 if (frame->window_update.window_size_increment == 0) {
5139 session, frame, NGHTTP2_ERR_PROTO,
5143 if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment <
5145 return session_handle_invalid_connection(session, frame,
5148 session->remote_window_size += frame->window_update.window_size_increment;
5150 return session_call_on_frame_received(session, frame);
5154 nghttp2_frame *frame) {
5158 if (session_detect_idle_stream(session, frame->hd.stream_id)) {
5159 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5163 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5169 session, frame, NGHTTP2_ERR_PROTO, "WINDOW_UPADATE to reserved stream");
5171 if (frame->window_update.window_size_increment == 0) {
5173 session, frame, NGHTTP2_ERR_PROTO,
5176 if (NGHTTP2_MAX_WINDOW_SIZE - frame->window_update.window_size_increment <
5178 return session_handle_invalid_stream(session, frame,
5181 stream->remote_window_size += frame->window_update.window_size_increment;
5193 return session_call_on_frame_received(session, frame);
5197 nghttp2_frame *frame) {
5198 if (frame->hd.stream_id == 0) {
5199 return session_on_connection_window_update_received(session, frame);
5201 return session_on_stream_window_update_received(session, frame);
5207 nghttp2_frame *frame = &iframe->frame;
5209 nghttp2_frame_unpack_window_update_payload(&frame->window_update,
5212 return nghttp2_session_on_window_update_received(session, frame);
5216 nghttp2_frame *frame) {
5220 altsvc = frame->ext.payload;
5224 if (frame->hd.stream_id == 0) {
5226 return session_call_on_invalid_frame_recv_callback(session, frame,
5231 return session_call_on_invalid_frame_recv_callback(session, frame,
5235 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5246 return session_call_on_invalid_frame_recv_callback(session, frame,
5250 return session_call_on_frame_received(session, frame);
5254 nghttp2_frame *frame) {
5255 return session_call_on_frame_received(session, frame);
5259 nghttp2_frame *frame) {
5268 priority_update = frame->ext.payload;
5270 if (frame->hd.stream_id != 0) {
5271 return session_handle_invalid_connection(session, frame, NGHTTP2_ERR_PROTO,
5278 session, frame, NGHTTP2_ERR_PROTO,
5283 return session_call_on_frame_received(session, frame);
5290 return session_call_on_frame_received(session, frame);
5296 session, frame, NGHTTP2_ERR_PROTO,
5308 return session_call_on_frame_received(session, frame);
5318 return session_call_on_frame_received(session, frame);
5329 return session_call_on_frame_received(session, frame);
5334 nghttp2_frame *frame = &iframe->frame;
5337 &frame->ext, nghttp2_get_uint16(iframe->sbuf.pos), iframe->lbuf.pos,
5344 return nghttp2_session_on_altsvc_received(session, frame);
5349 nghttp2_frame *frame = &iframe->frame;
5353 rv = nghttp2_frame_unpack_origin_payload(&frame->ext, iframe->lbuf.pos,
5359 /* Ignore ORIGIN frame which cannot be parsed. */
5363 return nghttp2_session_on_origin_received(session, frame);
5368 nghttp2_frame *frame = &iframe->frame;
5370 nghttp2_frame_unpack_priority_update_payload(&frame->ext, iframe->sbuf.pos,
5373 return nghttp2_session_on_priority_update_received(session, frame);
5379 nghttp2_frame *frame = &iframe->frame;
5391 return session_call_on_frame_received(session, frame);
5395 nghttp2_frame *frame) {
5401 stream = nghttp2_session_get_stream(session, frame->hd.stream_id);
5404 of RST_STREAM. So just ignore frame against nonexistent stream
5410 (frame->hd.flags & NGHTTP2_FLAG_END_STREAM)) {
5425 rv = session_call_on_frame_received(session, frame);
5430 if (frame->hd.flags & NGHTTP2_FLAG_END_STREAM) {
5443 nghttp2_frame *public_data_frame = &session->iframe.frame;
5453 * detected strictly. If DATA frame is received with length > 0 and
5584 * Checks that we can receive the DATA frame for stream, which is
5585 * indicated by |session->iframe.frame.hd.stream_id|. If it is a
5586 * connection error situation, GOAWAY frame will be issued by this
5589 * If the DATA frame is allowed, returns 0.
5595 * The reception of DATA frame is connection error; or should be
5609 stream_id = iframe->frame.hd.stream_id;
5612 /* The spec says that if a DATA frame is received whose stream ID
5774 /* We cannot use iframe->frame.hd.length because of CONTINUATION */
5794 nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen);
5882 "SETTINGS frame. Perhaps, peer does not support HTTP/2 "
5914 nghttp2_frame_unpack_frame_hd(&iframe->frame.hd, iframe->sbuf.pos);
5915 iframe->payloadleft = iframe->frame.hd.length;
5918 iframe->frame.hd.length, iframe->frame.hd.type,
5919 iframe->frame.hd.flags, iframe->frame.hd.stream_id);
5921 if (iframe->frame.hd.length > session->local_settings.max_frame_size) {
5922 DEBUGF("recv: length is too large %zu > %u\n", iframe->frame.hd.length,
5926 session, NGHTTP2_FRAME_SIZE_ERROR, "too large frame size");
5935 switch (iframe->frame.hd.type) {
5939 iframe->frame.hd.flags &=
5951 iframe->frame.hd.stream_id);
5960 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
5984 iframe->frame.hd.flags &=
5988 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
6004 pri_fieldlen = nghttp2_frame_priority_len(iframe->frame.hd.flags);
6023 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6044 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6063 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6081 switch (iframe->frame.hd.type) {
6091 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6107 iframe->frame.hd.flags &= NGHTTP2_FLAG_ACK;
6109 if ((iframe->frame.hd.length % NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH) ||
6110 ((iframe->frame.hd.flags & NGHTTP2_FLAG_ACK) &&
6119 !(iframe->frame.hd.flags & NGHTTP2_FLAG_ACK)) {
6131 iframe->frame.hd.length / NGHTTP2_FRAME_SETTINGS_ENTRY_LENGTH + 1;
6167 iframe->frame.hd.flags &=
6170 rv = inbound_frame_handle_pad(iframe, &iframe->frame.hd);
6200 iframe->frame.hd.flags &= NGHTTP2_FLAG_ACK;
6215 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6240 DEBUGF("recv: extension frame\n");
6243 iframe->frame.hd.type)) {
6245 /* Silently ignore unknown frame type. */
6260 switch (iframe->frame.hd.type) {
6271 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6272 iframe->frame.ext.payload = &iframe->ext_frame_payload.altsvc;
6301 iframe->frame.ext.payload = &iframe->ext_frame_payload.origin;
6303 if (session->server || iframe->frame.hd.stream_id ||
6304 (iframe->frame.hd.flags & 0xf0)) {
6310 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6338 iframe->frame.hd.flags = NGHTTP2_FLAG_NONE;
6339 iframe->frame.ext.payload =
6390 rv = session_call_on_begin_frame(session, &iframe->frame.hd);
6414 switch (iframe->frame.hd.type) {
6417 (iframe->frame.hd.flags & NGHTTP2_FLAG_PADDED)) {
6418 pri_fieldlen = nghttp2_frame_priority_len(iframe->frame.hd.flags);
6429 iframe->frame.headers.padlen = (size_t)padlen;
6459 session, iframe->frame.hd.stream_id, NGHTTP2_INTERNAL_ERROR);
6506 (iframe->frame.hd.flags & NGHTTP2_FLAG_PADDED)) {
6519 iframe->frame.push_promise.padlen = (size_t)padlen;
6547 session, iframe->frame.push_promise.promised_stream_id,
6581 debuglen = iframe->frame.hd.length - 8;
6625 if (iframe->frame.hd.length > 2) {
6627 nghttp2_mem_malloc(mem, iframe->frame.hd.length - 2);
6634 iframe->frame.hd.length);
6656 /* This is unknown frame */
6688 trail_padlen = nghttp2_frame_trail_padlen(&iframe->frame, iframe->padlen);
6690 final = (iframe->frame.hd.flags & NGHTTP2_FLAG_END_HEADERS) &&
6699 inflate_header_block(session, &iframe->frame, &hd_proclen,
6728 iframe->frame.hd.type == NGHTTP2_PUSH_PROMISE
6729 ? iframe->frame.push_promise.promised_stream_id
6730 : iframe->frame.hd.stream_id,
6762 if ((iframe->frame.hd.flags & NGHTTP2_FLAG_END_HEADERS) == 0) {
6798 switch (iframe->frame.hd.type) {
6916 cont_hd.stream_id != iframe->frame.hd.stream_id) {
6919 iframe->frame.hd.stream_id, NGHTTP2_CONTINUATION,
6923 "unexpected non-CONTINUATION frame or stream_id is invalid");
6933 iframe->frame.hd.flags =
6934 (uint8_t)(iframe->frame.hd.flags |
6936 iframe->frame.hd.length += cont_hd.length;
6979 nghttp2_session_consume(session, iframe->frame.hd.stream_id, readlen);
6989 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
6994 (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0);
7012 iframe->frame.data.padlen = (size_t)padlen;
7018 stream = nghttp2_session_get_stream(session, iframe->frame.hd.stream_id);
7051 (iframe->frame.hd.flags & NGHTTP2_FLAG_END_STREAM) == 0);
7068 rv = nghttp2_session_consume(session, iframe->frame.hd.stream_id,
7100 session, iframe->frame.hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
7111 session, iframe->frame.hd.flags, iframe->frame.hd.stream_id,
7148 DATA frame too */
7360 * frames if there is pending ones. If pending frame is request/push
7377 nghttp2_frame *frame;
7394 frame = &item->frame;
7396 nghttp2_frame_ping_init(&frame->ping, flags, opaque_data);
7401 nghttp2_frame_ping_free(&frame->ping);
7418 nghttp2_frame *frame;
7448 frame = &item->frame;
7454 nghttp2_frame_goaway_init(&frame->goaway, last_stream_id, error_code,
7462 nghttp2_frame_goaway_free(&frame->goaway, mem);
7477 nghttp2_frame *frame;
7488 frame = &item->frame;
7490 nghttp2_frame_window_update_init(&frame->window_update, flags, stream_id,
7496 nghttp2_frame_window_update_free(&frame->window_update);
7517 nghttp2_frame *frame;
7583 frame = &item->frame;
7585 nghttp2_frame_settings_init(&frame->settings, flags, iv_copy, niv);
7593 nghttp2_frame_settings_free(&frame->settings, mem);
7640 size_t datamax, nghttp2_frame *frame,
7657 session, frame->hd.type, stream->stream_id, session->remote_window_size,
7699 session, frame->hd.stream_id, buf->pos, datamax, &data_flags,
7721 frame->hd.flags = NGHTTP2_FLAG_NONE;
7729 frame->hd.flags |= NGHTTP2_FLAG_END_STREAM;
7742 frame->hd.length = (size_t)payloadlen;
7743 frame->data.padlen = 0;
7745 max_payloadlen = nghttp2_min(datamax, frame->hd.length + NGHTTP2_MAX_PADLEN);
7748 session_call_select_padding(session, frame, max_payloadlen);
7754 frame->data.padlen = (size_t)(padded_payloadlen - payloadlen);
7756 nghttp2_frame_pack_frame_hd(buf->pos, &frame->hd);
7758 nghttp2_frame_add_pad(bufs, &frame->hd, frame->data.padlen,
7763 if (frame->hd.length == 0 && (data_flags & NGHTTP2_DATA_FLAG_EOF) &&
7765 /* DATA payload length is 0, and DATA frame does not bear
7767 DATA frame. */
7789 nghttp2_frame *frame;
7803 frame = &nghttp2_outbound_queue_top(&session->ob_syn)->frame;
7804 assert(frame->hd.type == NGHTTP2_HEADERS);
7806 if (frame->hd.stream_id > stream_id ||
7812 if (item->frame.hd.stream_id < stream_id) {
7816 if (item->frame.hd.stream_id > stream_id) {
7981 nghttp2_frame frame;
7997 /* SETTINGS frame contains too many settings */
8009 nghttp2_frame_hd_init(&frame.hd, settings_payloadlen, NGHTTP2_SETTINGS,
8011 frame.settings.iv = iv;
8012 frame.settings.niv = niv;
8013 rv = nghttp2_session_on_settings_received(session, &frame, 1 /* No ACK */);