src: Handle PUSH_PROMISE from client and request HEADERS from server
They are just RST_STREAMed for now
This commit is contained in:
parent
a85a11c1d9
commit
88d31ada75
|
@ -368,10 +368,12 @@ int Http2Handler::on_connect()
|
||||||
if(r != 0) {
|
if(r != 0) {
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
nghttp2_settings_entry entry[3];
|
nghttp2_settings_entry entry[4];
|
||||||
size_t niv = 1;
|
size_t niv = 2;
|
||||||
entry[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
|
entry[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
|
||||||
entry[0].value = 100;
|
entry[0].value = 100;
|
||||||
|
entry[1].settings_id = NGHTTP2_SETTINGS_ENABLE_PUSH;
|
||||||
|
entry[1].value = 0;
|
||||||
if(sessions_->get_config()->no_flow_control) {
|
if(sessions_->get_config()->no_flow_control) {
|
||||||
entry[niv].settings_id = NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS;
|
entry[niv].settings_id = NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS;
|
||||||
entry[niv].value = 1;
|
entry[niv].value = 1;
|
||||||
|
@ -820,6 +822,11 @@ int hd_on_frame_recv_callback
|
||||||
hd->remove_settings_timer();
|
hd->remove_settings_timer();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case NGHTTP2_PUSH_PROMISE:
|
||||||
|
nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
|
||||||
|
frame->push_promise.promised_stream_id,
|
||||||
|
NGHTTP2_REFUSED_STREAM);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -808,6 +808,12 @@ int on_frame_recv_callback
|
||||||
auto http2session = reinterpret_cast<Http2Session*>(user_data);
|
auto http2session = reinterpret_cast<Http2Session*>(user_data);
|
||||||
switch(frame->hd.type) {
|
switch(frame->hd.type) {
|
||||||
case NGHTTP2_HEADERS: {
|
case NGHTTP2_HEADERS: {
|
||||||
|
if(frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
|
||||||
|
// server sends request HEADERS
|
||||||
|
http2session->submit_rst_stream(frame->hd.stream_id,
|
||||||
|
NGHTTP2_REFUSED_STREAM);
|
||||||
|
break;
|
||||||
|
}
|
||||||
if(frame->headers.cat != NGHTTP2_HCAT_RESPONSE) {
|
if(frame->headers.cat != NGHTTP2_HCAT_RESPONSE) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -965,11 +971,11 @@ int on_frame_recv_callback
|
||||||
case NGHTTP2_PUSH_PROMISE:
|
case NGHTTP2_PUSH_PROMISE:
|
||||||
if(LOG_ENABLED(INFO)) {
|
if(LOG_ENABLED(INFO)) {
|
||||||
SSLOG(INFO, http2session)
|
SSLOG(INFO, http2session)
|
||||||
<< "Received downstream PUSH_PROMISE stream_id="
|
<< "Received downstream PUSH_PROMISE stream_id=" << frame->hd.stream_id
|
||||||
<< frame->hd.stream_id;
|
<< ", promised_stream_id=" << frame->push_promise.promised_stream_id;
|
||||||
}
|
}
|
||||||
// We just respond with RST_STREAM.
|
// We just respond with RST_STREAM.
|
||||||
http2session->submit_rst_stream(frame->hd.stream_id,
|
http2session->submit_rst_stream(frame->push_promise.promised_stream_id,
|
||||||
NGHTTP2_REFUSED_STREAM);
|
NGHTTP2_REFUSED_STREAM);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -221,6 +221,7 @@ namespace {
|
||||||
int on_frame_recv_callback
|
int on_frame_recv_callback
|
||||||
(nghttp2_session *session, const nghttp2_frame *frame, void *user_data)
|
(nghttp2_session *session, const nghttp2_frame *frame, void *user_data)
|
||||||
{
|
{
|
||||||
|
int rv;
|
||||||
auto upstream = reinterpret_cast<Http2Upstream*>(user_data);
|
auto upstream = reinterpret_cast<Http2Upstream*>(user_data);
|
||||||
switch(frame->hd.type) {
|
switch(frame->hd.type) {
|
||||||
case NGHTTP2_HEADERS: {
|
case NGHTTP2_HEADERS: {
|
||||||
|
@ -318,7 +319,7 @@ int on_frame_recv_callback
|
||||||
downstream->check_upgrade_request();
|
downstream->check_upgrade_request();
|
||||||
|
|
||||||
auto dconn = upstream->get_client_handler()->get_downstream_connection();
|
auto dconn = upstream->get_client_handler()->get_downstream_connection();
|
||||||
int rv = dconn->attach_downstream(downstream);
|
rv = dconn->attach_downstream(downstream);
|
||||||
if(rv != 0) {
|
if(rv != 0) {
|
||||||
// If downstream connection fails, issue RST_STREAM.
|
// If downstream connection fails, issue RST_STREAM.
|
||||||
upstream->rst_stream(downstream, NGHTTP2_INTERNAL_ERROR);
|
upstream->rst_stream(downstream, NGHTTP2_INTERNAL_ERROR);
|
||||||
|
@ -342,6 +343,14 @@ int on_frame_recv_callback
|
||||||
}
|
}
|
||||||
upstream->stop_settings_timer();
|
upstream->stop_settings_timer();
|
||||||
break;
|
break;
|
||||||
|
case NGHTTP2_PUSH_PROMISE:
|
||||||
|
rv = nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE,
|
||||||
|
frame->push_promise.promised_stream_id,
|
||||||
|
NGHTTP2_REFUSED_STREAM);
|
||||||
|
if(rv != 0) {
|
||||||
|
return NGHTTP2_ERR_CALLBACK_FAILURE;
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -502,13 +511,16 @@ Http2Upstream::Http2Upstream(ClientHandler *handler)
|
||||||
flow_control_ = true;
|
flow_control_ = true;
|
||||||
|
|
||||||
// TODO Maybe call from outside?
|
// TODO Maybe call from outside?
|
||||||
nghttp2_settings_entry entry[2];
|
nghttp2_settings_entry entry[3];
|
||||||
entry[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
|
entry[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
|
||||||
entry[0].value = get_config()->http2_max_concurrent_streams;
|
entry[0].value = get_config()->http2_max_concurrent_streams;
|
||||||
|
|
||||||
entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
|
entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
|
||||||
entry[1].value = (1 << get_config()->http2_upstream_window_bits) - 1;
|
entry[1].value = (1 << get_config()->http2_upstream_window_bits) - 1;
|
||||||
|
|
||||||
|
entry[2].settings_id = NGHTTP2_SETTINGS_ENABLE_PUSH;
|
||||||
|
entry[2].value = 0;
|
||||||
|
|
||||||
rv = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE,
|
rv = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE,
|
||||||
entry,
|
entry,
|
||||||
sizeof(entry)/sizeof(nghttp2_settings_entry));
|
sizeof(entry)/sizeof(nghttp2_settings_entry));
|
||||||
|
|
Loading…
Reference in New Issue