Merge branch 'master' into hpack-exp

This commit is contained in:
Tatsuhiro Tsujikawa 2013-10-25 22:51:51 +09:00
commit 8f8c841df0
11 changed files with 97 additions and 74 deletions

View File

@ -318,7 +318,8 @@ static int on_stream_close_callback(nghttp2_session *session,
req = nghttp2_session_get_stream_user_data(session, stream_id); req = nghttp2_session_get_stream_user_data(session, stream_id);
if(req) { if(req) {
int rv; int rv;
rv = nghttp2_submit_goaway(session, NGHTTP2_NO_ERROR, NULL, 0); rv = nghttp2_submit_goaway(session, NGHTTP2_FLAG_NONE, NGHTTP2_NO_ERROR,
NULL, 0);
if(rv != 0) { if(rv != 0) {
diec("nghttp2_submit_goaway", rv); diec("nghttp2_submit_goaway", rv);
} }
@ -350,7 +351,8 @@ static int on_data_chunk_recv_callback(nghttp2_session *session, uint8_t flags,
int rv; int rv;
rv = nghttp2_gzip_inflate(req->inflater, out, &outlen, data, &tlen); rv = nghttp2_gzip_inflate(req->inflater, out, &outlen, data, &tlen);
if(rv == -1) { if(rv == -1) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_INTERNAL_ERROR); nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, stream_id,
NGHTTP2_INTERNAL_ERROR);
break; break;
} }
fwrite(out, 1, outlen, stdout); fwrite(out, 1, outlen, stdout);

View File

@ -1831,6 +1831,9 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
* Submits PRIORITY frame to change the priority of stream |stream_id| * Submits PRIORITY frame to change the priority of stream |stream_id|
* to the priority value |pri|. * to the priority value |pri|.
* *
* The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
*
* This function returns 0 if it succeeds, or one of the following * This function returns 0 if it succeeds, or one of the following
* negative error codes: * negative error codes:
* *
@ -1841,8 +1844,8 @@ int nghttp2_submit_data(nghttp2_session *session, uint8_t flags,
* :enum:`NGHTTP2_ERR_STREAM_CLOSED` * :enum:`NGHTTP2_ERR_STREAM_CLOSED`
* The stream is already closed or does not exist. * The stream is already closed or does not exist.
*/ */
int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id, int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
int32_t pri); int32_t stream_id, int32_t pri);
/** /**
* @function * @function
@ -1850,13 +1853,17 @@ int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
* Submits RST_STREAM frame to cancel/reject the stream |stream_id| * Submits RST_STREAM frame to cancel/reject the stream |stream_id|
* with the error code |error_code|. * with the error code |error_code|.
* *
* The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
*
* This function returns 0 if it succeeds, or one of the following * This function returns 0 if it succeeds, or one of the following
* negative error codes: * negative error codes:
* *
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
*/ */
int nghttp2_submit_rst_stream(nghttp2_session *session, int32_t stream_id, int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
nghttp2_error_code error_code); nghttp2_error_code error_code);
/** /**
@ -1866,6 +1873,9 @@ int nghttp2_submit_rst_stream(nghttp2_session *session, int32_t stream_id,
* pointer to the array of :type:`nghttp2_settings_entry`. The |niv| * pointer to the array of :type:`nghttp2_settings_entry`. The |niv|
* indicates the number of :type:`nghttp2_settings_entry`. * indicates the number of :type:`nghttp2_settings_entry`.
* *
* The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
*
* This function does not take ownership of the |iv|. This function * This function does not take ownership of the |iv|. This function
* copies all the elements in the |iv|. * copies all the elements in the |iv|.
* *
@ -1882,7 +1892,7 @@ int nghttp2_submit_rst_stream(nghttp2_session *session, int32_t stream_id,
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
*/ */
int nghttp2_submit_settings(nghttp2_session *session, int nghttp2_submit_settings(nghttp2_session *session, uint8_t flags,
const nghttp2_settings_entry *iv, size_t niv); const nghttp2_settings_entry *iv, size_t niv);
@ -1934,6 +1944,9 @@ int nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
* received PING frame. The library automatically submits PING frame * received PING frame. The library automatically submits PING frame
* in this case. * in this case.
* *
* The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
*
* If the |opaque_data| is non ``NULL``, then it should point to the 8 * If the |opaque_data| is non ``NULL``, then it should point to the 8
* bytes array of memory to specify opaque data to send with PING * bytes array of memory to specify opaque data to send with PING
* frame. If the |opaque_data| is ``NULL``, zero-cleared 8 bytes will * frame. If the |opaque_data| is ``NULL``, zero-cleared 8 bytes will
@ -1945,13 +1958,17 @@ int nghttp2_submit_push_promise(nghttp2_session *session, uint8_t flags,
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
*/ */
int nghttp2_submit_ping(nghttp2_session *session, uint8_t *opaque_data); int nghttp2_submit_ping(nghttp2_session *session, uint8_t flags,
uint8_t *opaque_data);
/** /**
* @function * @function
* *
* Submits GOAWAY frame with the error code |error_code|. * Submits GOAWAY frame with the error code |error_code|.
* *
* The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
*
* If the |opaque_data| is not ``NULL`` and |opaque_data_len| is not * If the |opaque_data| is not ``NULL`` and |opaque_data_len| is not
* zero, those data will be sent as additional debug data. The * zero, those data will be sent as additional debug data. The
* library makes a copy of the memory region pointed by |opaque_data| * library makes a copy of the memory region pointed by |opaque_data|
@ -1965,7 +1982,7 @@ int nghttp2_submit_ping(nghttp2_session *session, uint8_t *opaque_data);
* :enum:`NGHTTP2_ERR_NOMEM` * :enum:`NGHTTP2_ERR_NOMEM`
* Out of memory. * Out of memory.
*/ */
int nghttp2_submit_goaway(nghttp2_session *session, int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags,
nghttp2_error_code error_code, nghttp2_error_code error_code,
uint8_t *opaque_data, size_t opaque_data_len); uint8_t *opaque_data, size_t opaque_data_len);
@ -1974,7 +1991,8 @@ int nghttp2_submit_goaway(nghttp2_session *session,
* *
* Submits WINDOW_UPDATE frame. * Submits WINDOW_UPDATE frame.
* *
* The |flags| is currently ignored. * The |flags| is currently ignored and should be
* :enum:`NGHTTP2_FLAG_NONE`.
* *
* If the |window_size_increment| is positive, the WINDOW_UPDATE with * If the |window_size_increment| is positive, the WINDOW_UPDATE with
* that value as window_size_increment is queued. If the * that value as window_size_increment is queued. If the

View File

@ -90,7 +90,8 @@ int nghttp2_session_fail_session(nghttp2_session *session,
if(session->goaway_flags & NGHTTP2_GOAWAY_SEND) { if(session->goaway_flags & NGHTTP2_GOAWAY_SEND) {
return 0; return 0;
} }
return nghttp2_submit_goaway(session, error_code, NULL, 0); return nghttp2_submit_goaway(session, NGHTTP2_FLAG_NONE, error_code,
NULL, 0);
} }
int nghttp2_session_is_my_stream_id(nghttp2_session *session, int nghttp2_session_is_my_stream_id(nghttp2_session *session,
@ -3482,7 +3483,7 @@ int nghttp2_session_upgrade(nghttp2_session *session,
frame.settings.niv = niv; frame.settings.niv = niv;
rv = nghttp2_session_on_settings_received(session, &frame); rv = nghttp2_session_on_settings_received(session, &frame);
} else { } else {
rv = nghttp2_submit_settings(session, iv, niv); rv = nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, niv);
} }
free(iv); free(iv);
if(rv != 0) { if(rv != 0) {

View File

@ -154,13 +154,14 @@ int nghttp2_submit_headers(nghttp2_session *session, uint8_t flags,
} }
int nghttp2_submit_ping(nghttp2_session *session, uint8_t *opaque_data) int nghttp2_submit_ping(nghttp2_session *session, uint8_t flags,
uint8_t *opaque_data)
{ {
return nghttp2_session_add_ping(session, NGHTTP2_FLAG_NONE, opaque_data); return nghttp2_session_add_ping(session, NGHTTP2_FLAG_NONE, opaque_data);
} }
int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id, int nghttp2_submit_priority(nghttp2_session *session, uint8_t flags,
int32_t pri) int32_t stream_id, int32_t pri)
{ {
int r; int r;
nghttp2_frame *frame; nghttp2_frame *frame;
@ -190,13 +191,14 @@ int nghttp2_submit_priority(nghttp2_session *session, int32_t stream_id,
return 0; return 0;
} }
int nghttp2_submit_rst_stream(nghttp2_session *session, int32_t stream_id, int nghttp2_submit_rst_stream(nghttp2_session *session, uint8_t flags,
int32_t stream_id,
nghttp2_error_code error_code) nghttp2_error_code error_code)
{ {
return nghttp2_session_add_rst_stream(session, stream_id, error_code); return nghttp2_session_add_rst_stream(session, stream_id, error_code);
} }
int nghttp2_submit_goaway(nghttp2_session *session, int nghttp2_submit_goaway(nghttp2_session *session, uint8_t flags,
nghttp2_error_code error_code, nghttp2_error_code error_code,
uint8_t *opaque_data, size_t opaque_data_len) uint8_t *opaque_data, size_t opaque_data_len)
{ {
@ -204,7 +206,7 @@ int nghttp2_submit_goaway(nghttp2_session *session,
error_code, opaque_data, opaque_data_len); error_code, opaque_data, opaque_data_len);
} }
int nghttp2_submit_settings(nghttp2_session *session, int nghttp2_submit_settings(nghttp2_session *session, uint8_t flags,
const nghttp2_settings_entry *iv, size_t niv) const nghttp2_settings_entry *iv, size_t niv)
{ {
nghttp2_frame *frame; nghttp2_frame *frame;

View File

@ -358,7 +358,7 @@ int Http2Handler::on_connect()
entry[niv].value = 1; entry[niv].value = 1;
++niv; ++niv;
} }
r = nghttp2_submit_settings(session_, entry, niv); r = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE, entry, niv);
if(r != 0) { if(r != 0) {
return r; return r;
} }
@ -701,14 +701,15 @@ int hd_on_frame_recv_callback
int32_t stream_id = frame->hd.stream_id; int32_t stream_id = frame->hd.stream_id;
if(!http2::check_http2_headers(frame->headers.nva, if(!http2::check_http2_headers(frame->headers.nva,
frame->headers.nvlen)) { frame->headers.nvlen)) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_PROTOCOL_ERROR); nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, stream_id,
NGHTTP2_PROTOCOL_ERROR);
return 0; return 0;
} }
for(size_t i = 0; REQUIRED_HEADERS[i]; ++i) { for(size_t i = 0; REQUIRED_HEADERS[i]; ++i) {
if(!http2::get_unique_header(frame->headers.nva, if(!http2::get_unique_header(frame->headers.nva,
frame->headers.nvlen, frame->headers.nvlen,
REQUIRED_HEADERS[i])) { REQUIRED_HEADERS[i])) {
nghttp2_submit_rst_stream(session, stream_id, nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, stream_id,
NGHTTP2_PROTOCOL_ERROR); NGHTTP2_PROTOCOL_ERROR);
return 0; return 0;
} }

View File

@ -685,7 +685,7 @@ struct HttpClient {
if(!need_upgrade()) { if(!need_upgrade()) {
nghttp2_settings_entry iv[16]; nghttp2_settings_entry iv[16];
auto niv = populate_settings(iv); auto niv = populate_settings(iv);
rv = nghttp2_submit_settings(session, iv, niv); rv = nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, niv);
if(rv != 0) { if(rv != 0) {
return -1; return -1;
} }
@ -1012,7 +1012,8 @@ int on_data_chunk_recv_callback
size_t tlen = len; size_t tlen = len;
int rv = nghttp2_gzip_inflate(req->inflater, out, &outlen, data, &tlen); int rv = nghttp2_gzip_inflate(req->inflater, out, &outlen, data, &tlen);
if(rv != 0) { if(rv != 0) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_INTERNAL_ERROR); nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, stream_id,
NGHTTP2_INTERNAL_ERROR);
break; break;
} }
if(!config.null_out) { if(!config.null_out) {
@ -1140,7 +1141,8 @@ int on_stream_close_callback
(*itr).second->record_complete_time(); (*itr).second->record_complete_time();
++client->complete; ++client->complete;
if(client->all_requests_processed()) { if(client->all_requests_processed()) {
nghttp2_submit_goaway(session, NGHTTP2_NO_ERROR, nullptr, 0); nghttp2_submit_goaway(session, NGHTTP2_FLAG_NONE, NGHTTP2_NO_ERROR,
nullptr, 0);
} }
} }
return 0; return 0;

View File

@ -443,8 +443,9 @@ Http2Upstream::Http2Upstream(ClientHandler *handler)
entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE; entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
entry[1].value = initial_window_size_; entry[1].value = initial_window_size_;
rv = nghttp2_submit_settings rv = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE,
(session_, entry, sizeof(entry)/sizeof(nghttp2_settings_entry)); entry,
sizeof(entry)/sizeof(nghttp2_settings_entry));
assert(rv == 0); assert(rv == 0);
// Set large connection-level window size to effectively disable // Set large connection-level window size to effectively disable
// connection-level flow control. // connection-level flow control.
@ -715,8 +716,8 @@ int Http2Upstream::rst_stream(Downstream *downstream,
<< error_code; << error_code;
} }
int rv; int rv;
rv = nghttp2_submit_rst_stream(session_, downstream->get_stream_id(), rv = nghttp2_submit_rst_stream(session_, NGHTTP2_FLAG_NONE,
error_code); downstream->get_stream_id(), error_code);
if(rv < NGHTTP2_ERR_FATAL) { if(rv < NGHTTP2_ERR_FATAL) {
ULOG(FATAL, this) << "nghttp2_submit_rst_stream() failed: " ULOG(FATAL, this) << "nghttp2_submit_rst_stream() failed: "
<< nghttp2_strerror(rv); << nghttp2_strerror(rv);

View File

@ -145,8 +145,7 @@ int SpdyDownstreamConnection::submit_rst_stream(Downstream *downstream)
<< downstream << ", stream_id=" << downstream << ", stream_id="
<< downstream->get_downstream_stream_id(); << downstream->get_downstream_stream_id();
} }
rv = spdy_->submit_rst_stream(this, rv = spdy_->submit_rst_stream(downstream->get_downstream_stream_id(),
downstream->get_downstream_stream_id(),
NGHTTP2_INTERNAL_ERROR); NGHTTP2_INTERNAL_ERROR);
} }
} }

View File

@ -577,8 +577,7 @@ int SpdySession::submit_request(SpdyDownstreamConnection *dconn,
return 0; return 0;
} }
int SpdySession::submit_rst_stream(SpdyDownstreamConnection *dconn, int SpdySession::submit_rst_stream(int32_t stream_id,
int32_t stream_id,
nghttp2_error_code error_code) nghttp2_error_code error_code)
{ {
assert(state_ == CONNECTED); assert(state_ == CONNECTED);
@ -588,7 +587,8 @@ int SpdySession::submit_rst_stream(SpdyDownstreamConnection *dconn,
<< " with error_code=" << " with error_code="
<< error_code; << error_code;
} }
int rv = nghttp2_submit_rst_stream(session_, stream_id, error_code); int rv = nghttp2_submit_rst_stream(session_, NGHTTP2_FLAG_NONE,
stream_id, error_code);
if(rv != 0) { if(rv != 0) {
SSLOG(FATAL, this) << "nghttp2_submit_rst_stream() failed: " SSLOG(FATAL, this) << "nghttp2_submit_rst_stream() failed: "
<< nghttp2_strerror(rv); << nghttp2_strerror(rv);
@ -750,15 +750,13 @@ int on_frame_recv_callback
auto sd = reinterpret_cast<StreamData*> auto sd = reinterpret_cast<StreamData*>
(nghttp2_session_get_stream_user_data(session, frame->hd.stream_id)); (nghttp2_session_get_stream_user_data(session, frame->hd.stream_id));
if(!sd || !sd->dconn) { if(!sd || !sd->dconn) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_INTERNAL_ERROR);
NGHTTP2_INTERNAL_ERROR);
break; break;
} }
auto downstream = sd->dconn->get_downstream(); auto downstream = sd->dconn->get_downstream();
if(!downstream || if(!downstream ||
downstream->get_downstream_stream_id() != frame->hd.stream_id) { downstream->get_downstream_stream_id() != frame->hd.stream_id) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_INTERNAL_ERROR);
NGHTTP2_INTERNAL_ERROR);
break; break;
} }
auto nva = frame->headers.nva; auto nva = frame->headers.nva;
@ -766,8 +764,7 @@ int on_frame_recv_callback
// Assuming that nva is sorted by name. // Assuming that nva is sorted by name.
if(!http2::check_http2_headers(nva, nvlen)) { if(!http2::check_http2_headers(nva, nvlen)) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
NGHTTP2_PROTOCOL_ERROR);
downstream->set_response_state(Downstream::MSG_RESET); downstream->set_response_state(Downstream::MSG_RESET);
call_downstream_readcb(spdy, downstream); call_downstream_readcb(spdy, downstream);
return 0; return 0;
@ -782,8 +779,7 @@ int on_frame_recv_callback
auto status = http2::get_unique_header(nva, nvlen, ":status"); auto status = http2::get_unique_header(nva, nvlen, ":status");
if(!status || http2::value_lws(status)) { if(!status || http2::value_lws(status)) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
NGHTTP2_PROTOCOL_ERROR);
downstream->set_response_state(Downstream::MSG_RESET); downstream->set_response_state(Downstream::MSG_RESET);
call_downstream_readcb(spdy, downstream); call_downstream_readcb(spdy, downstream);
return 0; return 0;
@ -855,8 +851,7 @@ int on_frame_recv_callback
} }
rv = upstream->on_downstream_header_complete(downstream); rv = upstream->on_downstream_header_complete(downstream);
if(rv != 0) { if(rv != 0) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_PROTOCOL_ERROR);
NGHTTP2_PROTOCOL_ERROR);
downstream->set_response_state(Downstream::MSG_RESET); downstream->set_response_state(Downstream::MSG_RESET);
} }
call_downstream_readcb(spdy, downstream); call_downstream_readcb(spdy, downstream);
@ -899,8 +894,7 @@ int on_frame_recv_callback
<< frame->hd.stream_id; << frame->hd.stream_id;
} }
// We just respond with RST_STREAM. // We just respond with RST_STREAM.
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_REFUSED_STREAM);
NGHTTP2_REFUSED_STREAM);
break; break;
default: default:
break; break;
@ -920,12 +914,12 @@ int on_data_chunk_recv_callback(nghttp2_session *session,
auto sd = reinterpret_cast<StreamData*> auto sd = reinterpret_cast<StreamData*>
(nghttp2_session_get_stream_user_data(session, stream_id)); (nghttp2_session_get_stream_user_data(session, stream_id));
if(!sd || !sd->dconn) { if(!sd || !sd->dconn) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_INTERNAL_ERROR); spdy->submit_rst_stream(stream_id, NGHTTP2_INTERNAL_ERROR);
return 0; return 0;
} }
auto downstream = sd->dconn->get_downstream(); auto downstream = sd->dconn->get_downstream();
if(!downstream || downstream->get_downstream_stream_id() != stream_id) { if(!downstream || downstream->get_downstream_stream_id() != stream_id) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_INTERNAL_ERROR); spdy->submit_rst_stream(stream_id, NGHTTP2_INTERNAL_ERROR);
return 0; return 0;
} }
@ -940,8 +934,7 @@ int on_data_chunk_recv_callback(nghttp2_session *session,
<< ", initial_window_size=" << ", initial_window_size="
<< spdy->get_initial_window_size(); << spdy->get_initial_window_size();
} }
nghttp2_submit_rst_stream(session, stream_id, spdy->submit_rst_stream(stream_id, NGHTTP2_FLOW_CONTROL_ERROR);
NGHTTP2_FLOW_CONTROL_ERROR);
downstream->set_response_state(Downstream::MSG_RESET); downstream->set_response_state(Downstream::MSG_RESET);
call_downstream_readcb(spdy, downstream); call_downstream_readcb(spdy, downstream);
return 0; return 0;
@ -951,7 +944,7 @@ int on_data_chunk_recv_callback(nghttp2_session *session,
auto upstream = downstream->get_upstream(); auto upstream = downstream->get_upstream();
rv = upstream->on_downstream_body(downstream, data, len); rv = upstream->on_downstream_body(downstream, data, len);
if(rv != 0) { if(rv != 0) {
nghttp2_submit_rst_stream(session, stream_id, NGHTTP2_INTERNAL_ERROR); spdy->submit_rst_stream(stream_id, NGHTTP2_INTERNAL_ERROR);
downstream->set_response_state(Downstream::MSG_RESET); downstream->set_response_state(Downstream::MSG_RESET);
} }
call_downstream_readcb(spdy, downstream); call_downstream_readcb(spdy, downstream);
@ -964,20 +957,20 @@ int before_frame_send_callback(nghttp2_session *session,
const nghttp2_frame *frame, const nghttp2_frame *frame,
void *user_data) void *user_data)
{ {
auto spdy = reinterpret_cast<SpdySession*>(user_data);
if(frame->hd.type == NGHTTP2_HEADERS && if(frame->hd.type == NGHTTP2_HEADERS &&
frame->headers.cat == NGHTTP2_HCAT_REQUEST) { frame->headers.cat == NGHTTP2_HCAT_REQUEST) {
auto sd = reinterpret_cast<StreamData*> auto sd = reinterpret_cast<StreamData*>
(nghttp2_session_get_stream_user_data(session, frame->hd.stream_id)); (nghttp2_session_get_stream_user_data(session, frame->hd.stream_id));
if(!sd || !sd->dconn) { if(!sd || !sd->dconn) {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_CANCEL);
NGHTTP2_CANCEL);
return 0; return 0;
} }
auto downstream = sd->dconn->get_downstream(); auto downstream = sd->dconn->get_downstream();
if(downstream) { if(downstream) {
downstream->set_downstream_stream_id(frame->hd.stream_id); downstream->set_downstream_stream_id(frame->hd.stream_id);
} else { } else {
nghttp2_submit_rst_stream(session, frame->hd.stream_id, NGHTTP2_CANCEL); spdy->submit_rst_stream(frame->hd.stream_id, NGHTTP2_CANCEL);
} }
} }
return 0; return 0;
@ -1098,8 +1091,8 @@ int SpdySession::on_connect()
entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE; entry[1].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
entry[1].value = get_initial_window_size(); entry[1].value = get_initial_window_size();
rv = nghttp2_submit_settings rv = nghttp2_submit_settings(session_, NGHTTP2_FLAG_NONE, entry,
(session_, entry, sizeof(entry)/sizeof(nghttp2_settings_entry)); sizeof(entry)/sizeof(nghttp2_settings_entry));
if(rv != 0) { if(rv != 0) {
return -1; return -1;
} }

View File

@ -68,8 +68,7 @@ public:
uint8_t pri, const char **nv, uint8_t pri, const char **nv,
const nghttp2_data_provider *data_prd); const nghttp2_data_provider *data_prd);
int submit_rst_stream(SpdyDownstreamConnection *dconn, int submit_rst_stream(int32_t stream_id, nghttp2_error_code error_code);
int32_t stream_id, nghttp2_error_code error_code);
int submit_window_update(SpdyDownstreamConnection *dconn, int32_t amount); int submit_window_update(SpdyDownstreamConnection *dconn, int32_t amount);

View File

@ -2243,9 +2243,10 @@ void test_nghttp2_submit_priority(void)
NGHTTP2_STREAM_OPENING, NULL); NGHTTP2_STREAM_OPENING, NULL);
CU_ASSERT(NGHTTP2_ERR_INVALID_ARGUMENT == CU_ASSERT(NGHTTP2_ERR_INVALID_ARGUMENT ==
nghttp2_submit_priority(session, 1, -1)); nghttp2_submit_priority(session, NGHTTP2_FLAG_NONE, 1, -1));
CU_ASSERT(0 == nghttp2_submit_priority(session, 1, 1000000007)); CU_ASSERT(0 == nghttp2_submit_priority(session, NGHTTP2_FLAG_NONE, 1,
1000000007));
CU_ASSERT(1000000007 == stream->pri); CU_ASSERT(1000000007 == stream->pri);
nghttp2_session_del(session); nghttp2_session_del(session);
@ -2282,7 +2283,7 @@ void test_nghttp2_submit_settings(void)
nghttp2_session_server_new(&session, &callbacks, &ud); nghttp2_session_server_new(&session, &callbacks, &ud);
CU_ASSERT(NGHTTP2_ERR_INVALID_ARGUMENT == CU_ASSERT(NGHTTP2_ERR_INVALID_ARGUMENT ==
nghttp2_submit_settings(session, iv, 5)); nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, 5));
/* Make sure that local settings are not changed */ /* Make sure that local settings are not changed */
CU_ASSERT(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS == CU_ASSERT(NGHTTP2_INITIAL_MAX_CONCURRENT_STREAMS ==
@ -2293,7 +2294,7 @@ void test_nghttp2_submit_settings(void)
session->local_settings[NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS]); session->local_settings[NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS]);
/* Now sends without 5th one */ /* Now sends without 5th one */
CU_ASSERT(0 == nghttp2_submit_settings(session, iv, 4)); CU_ASSERT(0 == nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, 4));
/* Make sure that local settings are changed */ /* Make sure that local settings are changed */
CU_ASSERT(50 == CU_ASSERT(50 ==
@ -2356,7 +2357,7 @@ void test_nghttp2_submit_settings_update_local_window_size(void)
NGHTTP2_STREAM_OPENED, NULL); NGHTTP2_STREAM_OPENED, NULL);
stream->local_flow_control = 0; stream->local_flow_control = 0;
CU_ASSERT(0 == nghttp2_submit_settings(session, iv, 1)); CU_ASSERT(0 == nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, 1));
stream = nghttp2_session_get_stream(session, 1); stream = nghttp2_session_get_stream(session, 1);
CU_ASSERT(0 == stream->recv_window_size); CU_ASSERT(0 == stream->recv_window_size);
@ -2380,7 +2381,7 @@ void test_nghttp2_submit_settings_update_local_window_size(void)
NGHTTP2_PRI_DEFAULT, NGHTTP2_PRI_DEFAULT,
NGHTTP2_STREAM_OPENED, NULL); NGHTTP2_STREAM_OPENED, NULL);
CU_ASSERT(0 == nghttp2_submit_settings(session, iv, 2)); CU_ASSERT(0 == nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, 2));
CU_ASSERT(NGHTTP2_INITIAL_WINDOW_SIZE == stream->local_window_size); CU_ASSERT(NGHTTP2_INITIAL_WINDOW_SIZE == stream->local_window_size);
nghttp2_session_del(session); nghttp2_session_del(session);
@ -2393,7 +2394,7 @@ void test_nghttp2_submit_settings_update_local_window_size(void)
NGHTTP2_STREAM_OPENED, NULL); NGHTTP2_STREAM_OPENED, NULL);
stream->local_window_size = NGHTTP2_MAX_WINDOW_SIZE; stream->local_window_size = NGHTTP2_MAX_WINDOW_SIZE;
CU_ASSERT(0 == nghttp2_submit_settings(session, iv, 1)); CU_ASSERT(0 == nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv, 1));
CU_ASSERT(NGHTTP2_STREAM_CLOSING == stream->state); CU_ASSERT(NGHTTP2_STREAM_CLOSING == stream->state);
nghttp2_session_del(session); nghttp2_session_del(session);
@ -2675,7 +2676,7 @@ void test_nghttp2_session_get_next_ob_item(void)
session->remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] = 2; session->remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] = 2;
CU_ASSERT(NULL == nghttp2_session_get_next_ob_item(session)); CU_ASSERT(NULL == nghttp2_session_get_next_ob_item(session));
nghttp2_submit_ping(session, NULL); nghttp2_submit_ping(session, NGHTTP2_FLAG_NONE, NULL);
CU_ASSERT(NGHTTP2_PING == CU_ASSERT(NGHTTP2_PING ==
OB_CTRL_TYPE(nghttp2_session_get_next_ob_item(session))); OB_CTRL_TYPE(nghttp2_session_get_next_ob_item(session)));
@ -2721,7 +2722,7 @@ void test_nghttp2_session_pop_next_ob_item(void)
session->remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] = 1; session->remote_settings[NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS] = 1;
CU_ASSERT(NULL == nghttp2_session_pop_next_ob_item(session)); CU_ASSERT(NULL == nghttp2_session_pop_next_ob_item(session));
nghttp2_submit_ping(session, NULL); nghttp2_submit_ping(session, NGHTTP2_FLAG_NONE, NULL);
nghttp2_submit_request(session, 1, nv, NULL, NULL); nghttp2_submit_request(session, 1, nv, NULL, NULL);
item = nghttp2_session_pop_next_ob_item(session); item = nghttp2_session_pop_next_ob_item(session);
@ -2938,7 +2939,7 @@ void test_nghttp2_session_defer_data(void)
CU_ASSERT(ud.data_source_length == 16*1024); CU_ASSERT(ud.data_source_length == 16*1024);
ud.block_count = 1; ud.block_count = 1;
nghttp2_submit_ping(session, NULL); nghttp2_submit_ping(session, NGHTTP2_FLAG_NONE, NULL);
/* Sends PING */ /* Sends PING */
CU_ASSERT(0 == nghttp2_session_send(session)); CU_ASSERT(0 == nghttp2_session_send(session));
CU_ASSERT(NGHTTP2_PING == ud.sent_frame_type); CU_ASSERT(NGHTTP2_PING == ud.sent_frame_type);
@ -3153,7 +3154,7 @@ void test_nghttp2_session_flow_control_disable_local(void)
iv[0].settings_id = NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS; iv[0].settings_id = NGHTTP2_SETTINGS_FLOW_CONTROL_OPTIONS;
iv[0].value = 1; iv[0].value = 1;
CU_ASSERT(0 == nghttp2_submit_settings(session, iv, CU_ASSERT(0 == nghttp2_submit_settings(session, NGHTTP2_FLAG_NONE, iv,
sizeof(iv)/sizeof(iv[0]))); sizeof(iv)/sizeof(iv[0])));
CU_ASSERT(0 == stream->local_flow_control); CU_ASSERT(0 == stream->local_flow_control);
CU_ASSERT(0 == session->local_flow_control); CU_ASSERT(0 == session->local_flow_control);
@ -3399,7 +3400,8 @@ void test_nghttp2_session_on_ctrl_not_send(void)
CU_ASSERT(0 == CU_ASSERT(0 ==
nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, 1, nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, 1,
NGHTTP2_PRI_DEFAULT, nv, NULL)); NGHTTP2_PRI_DEFAULT, nv, NULL));
CU_ASSERT(0 == nghttp2_submit_rst_stream(session, 1, NGHTTP2_INTERNAL_ERROR)); CU_ASSERT(0 == nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, 1,
NGHTTP2_INTERNAL_ERROR));
CU_ASSERT(0 == nghttp2_session_send(session)); CU_ASSERT(0 == nghttp2_session_send(session));
CU_ASSERT(1 == user_data.frame_not_send_cb_called); CU_ASSERT(1 == user_data.frame_not_send_cb_called);
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type); CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
@ -3415,7 +3417,8 @@ void test_nghttp2_session_on_ctrl_not_send(void)
CU_ASSERT(0 == CU_ASSERT(0 ==
nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, 3, nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, 3,
NGHTTP2_PRI_DEFAULT, nv, NULL)); NGHTTP2_PRI_DEFAULT, nv, NULL));
CU_ASSERT(0 == nghttp2_submit_rst_stream(session, 3, NGHTTP2_INTERNAL_ERROR)); CU_ASSERT(0 == nghttp2_submit_rst_stream(session, NGHTTP2_FLAG_NONE, 3,
NGHTTP2_INTERNAL_ERROR));
CU_ASSERT(0 == nghttp2_session_send(session)); CU_ASSERT(0 == nghttp2_session_send(session));
CU_ASSERT(1 == user_data.frame_not_send_cb_called); CU_ASSERT(1 == user_data.frame_not_send_cb_called);
CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type); CU_ASSERT(NGHTTP2_HEADERS == user_data.not_sent_frame_type);
@ -3437,11 +3440,12 @@ void test_nghttp2_session_on_ctrl_not_send(void)
/* Send PRIORITY to stream ID = 1 which does not exist */ /* Send PRIORITY to stream ID = 1 which does not exist */
CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED == CU_ASSERT(NGHTTP2_ERR_STREAM_CLOSED ==
nghttp2_submit_priority(session, 1, 0)); nghttp2_submit_priority(session, NGHTTP2_FLAG_NONE, 1, 0));
user_data.frame_not_send_cb_called = 0; user_data.frame_not_send_cb_called = 0;
/* Send GOAWAY */ /* Send GOAWAY */
CU_ASSERT(0 == nghttp2_submit_goaway(session, NGHTTP2_NO_ERROR, NULL, 0)); CU_ASSERT(0 == nghttp2_submit_goaway(session, NGHTTP2_FLAG_NONE,
NGHTTP2_NO_ERROR, NULL, 0));
CU_ASSERT(0 == nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, -1, CU_ASSERT(0 == nghttp2_submit_headers(session, NGHTTP2_FLAG_END_STREAM, -1,
NGHTTP2_PRI_DEFAULT, nv, NULL)); NGHTTP2_PRI_DEFAULT, nv, NULL));
CU_ASSERT(0 == nghttp2_session_send(session)); CU_ASSERT(0 == nghttp2_session_send(session));
@ -3461,10 +3465,11 @@ void test_nghttp2_session_get_outbound_queue_size(void)
CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, NULL)); CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, NULL));
CU_ASSERT(0 == nghttp2_session_get_outbound_queue_size(session)); CU_ASSERT(0 == nghttp2_session_get_outbound_queue_size(session));
CU_ASSERT(0 == nghttp2_submit_ping(session, NULL)); CU_ASSERT(0 == nghttp2_submit_ping(session, NGHTTP2_FLAG_NONE, NULL));
CU_ASSERT(1 == nghttp2_session_get_outbound_queue_size(session)); CU_ASSERT(1 == nghttp2_session_get_outbound_queue_size(session));
CU_ASSERT(0 == nghttp2_submit_goaway(session, NGHTTP2_NO_ERROR, NULL, 0)); CU_ASSERT(0 == nghttp2_submit_goaway(session, NGHTTP2_FLAG_NONE,
NGHTTP2_NO_ERROR, NULL, 0));
CU_ASSERT(2 == nghttp2_session_get_outbound_queue_size(session)); CU_ASSERT(2 == nghttp2_session_get_outbound_queue_size(session));
nghttp2_session_del(session); nghttp2_session_del(session);
@ -3570,7 +3575,7 @@ void test_nghttp2_session_data_backoff_by_high_pri_frame(void)
/* data for DATA[1] is read from data_prd but it is not sent */ /* data for DATA[1] is read from data_prd but it is not sent */
CU_ASSERT(ud.data_source_length == 8*1024); CU_ASSERT(ud.data_source_length == 8*1024);
nghttp2_submit_ping(session, NULL); nghttp2_submit_ping(session, NGHTTP2_FLAG_NONE, NULL);
ud.block_count = 2; ud.block_count = 2;
/* Sends DATA[1] + PING, PING is interleaved in DATA sequence */ /* Sends DATA[1] + PING, PING is interleaved in DATA sequence */
CU_ASSERT(0 == nghttp2_session_send(session)); CU_ASSERT(0 == nghttp2_session_send(session));