Allow client sending :protocol optimistically

This commit is contained in:
Tatsuhiro Tsujikawa 2018-09-28 00:11:33 +09:00
parent a42faf1cc2
commit 651e147711
4 changed files with 16 additions and 6 deletions

View File

@ -457,9 +457,9 @@ int nghttp2_http_on_header(nghttp2_session *session, nghttp2_stream *stream,
}
if (session->server || frame->hd.type == NGHTTP2_PUSH_PROMISE) {
return http_request_on_header(
stream, nv, trailer,
session->server && session->local_settings.enable_connect_protocol);
return http_request_on_header(stream, nv, trailer,
session->server &&
session->pending_enable_connect_protocol);
}
return http_response_on_header(stream, nv, trailer);

View File

@ -3748,7 +3748,7 @@ static int session_after_header_block_received(nghttp2_session *session) {
if (subject_stream) {
rv = nghttp2_http_on_request_headers(
subject_stream, frame,
session->server && session->local_settings.enable_connect_protocol);
session->server && session->pending_enable_connect_protocol);
}
} else {
assert(frame->hd.type == NGHTTP2_HEADERS);
@ -3756,7 +3756,7 @@ static int session_after_header_block_received(nghttp2_session *session) {
case NGHTTP2_HCAT_REQUEST:
rv = nghttp2_http_on_request_headers(
stream, frame,
session->server && session->local_settings.enable_connect_protocol);
session->server && session->pending_enable_connect_protocol);
break;
case NGHTTP2_HCAT_RESPONSE:
case NGHTTP2_HCAT_PUSH_RESPONSE:
@ -7080,6 +7080,13 @@ int nghttp2_session_add_settings(nghttp2_session *session, uint8_t flags,
}
}
for (i = niv; i > 0; --i) {
if (iv[i - 1].settings_id == NGHTTP2_SETTINGS_ENABLE_CONNECT_PROTOCOL) {
session->pending_enable_connect_protocol = (uint8_t)iv[i - 1].value;
break;
}
}
return 0;
}

View File

@ -322,6 +322,9 @@ struct nghttp2_session {
/* Unacked local ENABLE_PUSH value. We use this to refuse
PUSH_PROMISE before SETTINGS ACK is received. */
uint8_t pending_enable_push;
/* Unacked local ENABLE_CONNECT_PROTOCOL value. We use this to
accept :protocol header field before SETTINGS_ACK is received. */
uint8_t pending_enable_connect_protocol;
/* Nonzero if the session is server side. */
uint8_t server;
/* Flags indicating GOAWAY is sent and/or received. The flags are

View File

@ -11082,7 +11082,7 @@ void test_nghttp2_http_mandatory_headers(void) {
/* enable SETTINGS_CONNECT_PROTOCOL */
nghttp2_session_server_new(&session, &callbacks, &ud);
session->local_settings.enable_connect_protocol = 1;
session->pending_enable_connect_protocol = 1;
nghttp2_hd_deflate_init(&deflater, mem);