Allow empty SETTINGS in upgrade

This commit is contained in:
Tatsuhiro Tsujikawa 2014-04-04 20:23:46 +09:00
parent 2a49e164c8
commit 1e38ceb1cd
3 changed files with 6 additions and 37 deletions

View File

@ -2061,10 +2061,7 @@ int nghttp2_session_terminate_session(nghttp2_session *session,
* :enum:`NGHTTP2_ERR_INVALID_ARGUMENT` * :enum:`NGHTTP2_ERR_INVALID_ARGUMENT`
* The |settings_payload| is badly formed. * The |settings_payload| is badly formed.
* :enum:`NGHTTP2_ERR_PROTO` * :enum:`NGHTTP2_ERR_PROTO`
* The stream ID 1 is already used or closed; or is not available; * The stream ID 1 is already used or closed; or is not available.
* or the |settings_payload| does not include both
* :enum:`NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS` and
* :enum:`NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE`.
*/ */
int nghttp2_session_upgrade(nghttp2_session *session, int nghttp2_session_upgrade(nghttp2_session *session,
const uint8_t *settings_payload, const uint8_t *settings_payload,

View File

@ -5568,9 +5568,6 @@ int nghttp2_session_upgrade(nghttp2_session *session,
nghttp2_settings_entry *iv; nghttp2_settings_entry *iv;
size_t niv; size_t niv;
int rv; int rv;
int max_conn_val_seen = 0;
int ini_win_size_seen = 0;
size_t i;
nghttp2_priority_spec pri_spec; nghttp2_priority_spec pri_spec;
if((!session->server && session->next_stream_id != 1) || if((!session->server && session->next_stream_id != 1) ||
@ -5585,17 +5582,7 @@ int nghttp2_session_upgrade(nghttp2_session *session,
if(rv != 0) { if(rv != 0) {
return rv; return rv;
} }
for(i = 0; i < niv; ++i) {
if(iv[i].settings_id == NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS) {
max_conn_val_seen = 1;
} else if(iv[i].settings_id == NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE) {
ini_win_size_seen = 1;
}
}
if(!max_conn_val_seen || !ini_win_size_seen) {
free(iv);
return NGHTTP2_ERR_PROTO;
}
if(session->server) { if(session->server) {
memset(&frame.hd, 0, sizeof(frame.hd)); memset(&frame.hd, 0, sizeof(frame.hd));
frame.settings.iv = iv; frame.settings.iv = iv;

View File

@ -2578,29 +2578,14 @@ void test_nghttp2_session_upgrade(void)
&callbacks)); &callbacks));
nghttp2_session_del(session); nghttp2_session_del(session);
/* Check required settings */ /* Empty SETTINGS is OK */
iv[0].settings_id = NGHTTP2_SETTINGS_MAX_CONCURRENT_STREAMS;
iv[0].value = 1;
settings_payloadlen = nghttp2_pack_settings_payload(settings_payload, settings_payloadlen = nghttp2_pack_settings_payload(settings_payload,
sizeof(settings_payload), sizeof(settings_payload),
iv, 1); NULL, 0);
nghttp2_session_client_new(&session, &callbacks, NULL); nghttp2_session_client_new(&session, &callbacks, NULL);
CU_ASSERT(NGHTTP2_ERR_PROTO == CU_ASSERT(0 == nghttp2_session_upgrade(session, settings_payload,
nghttp2_session_upgrade(session, settings_payload, settings_payloadlen, NULL));
settings_payloadlen, NULL));
nghttp2_session_del(session);
iv[0].settings_id = NGHTTP2_SETTINGS_INITIAL_WINDOW_SIZE;
iv[0].value = 4095;
settings_payloadlen = nghttp2_pack_settings_payload(settings_payload,
sizeof(settings_payload),
iv, 1);
nghttp2_session_client_new(&session, &callbacks, NULL);
CU_ASSERT(NGHTTP2_ERR_PROTO ==
nghttp2_session_upgrade(session, settings_payload,
settings_payloadlen, NULL));
nghttp2_session_del(session); nghttp2_session_del(session);
} }