Issue stream error with the status code STREAM_IN_USE if multiple SYN_REPLY
frames are received for the same active stream ID.
This commit is contained in:
parent
ce6dc1303e
commit
6024106695
|
@ -1529,6 +1529,7 @@ int spdylay_session_on_syn_reply_received(spdylay_session *session,
|
||||||
{
|
{
|
||||||
int r = 0;
|
int r = 0;
|
||||||
int valid = 0;
|
int valid = 0;
|
||||||
|
int status_code = SPDYLAY_PROTOCOL_ERROR;
|
||||||
spdylay_stream *stream;
|
spdylay_stream *stream;
|
||||||
if(!spdylay_session_check_version(session, frame->syn_reply.hd.version)) {
|
if(!spdylay_session_check_version(session, frame->syn_reply.hd.version)) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1554,13 +1555,21 @@ int spdylay_session_on_syn_reply_received(spdylay_session *session,
|
||||||
that we queued RST_STREAM but it has not been sent. It will
|
that we queued RST_STREAM but it has not been sent. It will
|
||||||
eventually sent, so we just ignore this frame. */
|
eventually sent, so we just ignore this frame. */
|
||||||
valid = 1;
|
valid = 1;
|
||||||
|
} else {
|
||||||
|
if(session->version == SPDYLAY_PROTO_SPDY3) {
|
||||||
|
/* SPDY/3 spec says if multiple SYN_REPLY frames for the
|
||||||
|
same active stream ID are received, the receiver must
|
||||||
|
issue a stream error with the status code
|
||||||
|
STREAM_IN_USE. */
|
||||||
|
status_code = SPDYLAY_STREAM_IN_USE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!valid) {
|
if(!valid) {
|
||||||
r = spdylay_session_handle_invalid_stream
|
r = spdylay_session_handle_invalid_stream
|
||||||
(session, frame->syn_reply.stream_id, SPDYLAY_SYN_REPLY, frame,
|
(session, frame->syn_reply.stream_id, SPDYLAY_SYN_REPLY, frame,
|
||||||
SPDYLAY_PROTOCOL_ERROR);
|
status_code);
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
|
@ -473,20 +473,19 @@ void test_spdylay_session_on_syn_stream_received_with_push()
|
||||||
void test_spdylay_session_on_syn_reply_received()
|
void test_spdylay_session_on_syn_reply_received()
|
||||||
{
|
{
|
||||||
spdylay_session *session;
|
spdylay_session *session;
|
||||||
spdylay_session_callbacks callbacks = {
|
spdylay_session_callbacks callbacks;
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
on_ctrl_recv_callback,
|
|
||||||
on_invalid_ctrl_recv_callback
|
|
||||||
};
|
|
||||||
my_user_data user_data;
|
my_user_data user_data;
|
||||||
const char *nv[] = { NULL };
|
const char *nv[] = { NULL };
|
||||||
const char *upcase_nv[] = { "version", "http/1.1", "methoD", "get", NULL };
|
const char *upcase_nv[] = { "version", "http/1.1", "methoD", "get", NULL };
|
||||||
spdylay_frame frame;
|
spdylay_frame frame;
|
||||||
spdylay_stream *stream;
|
spdylay_stream *stream;
|
||||||
|
spdylay_outbound_item *item;
|
||||||
user_data.ctrl_recv_cb_called = 0;
|
user_data.ctrl_recv_cb_called = 0;
|
||||||
user_data.invalid_ctrl_recv_cb_called = 0;
|
user_data.invalid_ctrl_recv_cb_called = 0;
|
||||||
|
|
||||||
|
memset(&callbacks, 0, sizeof(spdylay_session_callbacks));
|
||||||
|
callbacks.on_ctrl_recv_callback = on_ctrl_recv_callback;
|
||||||
|
callbacks.on_invalid_ctrl_recv_callback = on_invalid_ctrl_recv_callback;
|
||||||
spdylay_session_client_new(&session, SPDYLAY_PROTO_SPDY2, &callbacks,
|
spdylay_session_client_new(&session, SPDYLAY_PROTO_SPDY2, &callbacks,
|
||||||
&user_data);
|
&user_data);
|
||||||
spdylay_session_open_stream(session, 1, SPDYLAY_CTRL_FLAG_NONE, 0,
|
spdylay_session_open_stream(session, 1, SPDYLAY_CTRL_FLAG_NONE, 0,
|
||||||
|
@ -527,6 +526,25 @@ void test_spdylay_session_on_syn_reply_received()
|
||||||
spdylay_frame_syn_reply_free(&frame.syn_reply);
|
spdylay_frame_syn_reply_free(&frame.syn_reply);
|
||||||
|
|
||||||
spdylay_session_del(session);
|
spdylay_session_del(session);
|
||||||
|
|
||||||
|
spdylay_session_client_new(&session, SPDYLAY_PROTO_SPDY3, &callbacks,
|
||||||
|
&user_data);
|
||||||
|
|
||||||
|
/* Multiple SYN_REPLY frames for the same active stream ID */
|
||||||
|
spdylay_session_open_stream(session, 1, SPDYLAY_CTRL_FLAG_NONE, 0,
|
||||||
|
SPDYLAY_STREAM_OPENED, NULL);
|
||||||
|
spdylay_frame_syn_reply_init(&frame.syn_reply, SPDYLAY_PROTO_SPDY3,
|
||||||
|
SPDYLAY_CTRL_FLAG_NONE, 1, dup_nv(nv));
|
||||||
|
user_data.invalid_ctrl_recv_cb_called = 0;
|
||||||
|
CU_ASSERT(0 == spdylay_session_on_syn_reply_received(session, &frame));
|
||||||
|
CU_ASSERT(1 == user_data.invalid_ctrl_recv_cb_called);
|
||||||
|
item = spdylay_session_get_next_ob_item(session);
|
||||||
|
CU_ASSERT(SPDYLAY_RST_STREAM == item->frame_type);
|
||||||
|
CU_ASSERT(SPDYLAY_STREAM_IN_USE == item->frame->rst_stream.status_code);
|
||||||
|
|
||||||
|
spdylay_frame_syn_reply_free(&frame.syn_reply);
|
||||||
|
|
||||||
|
spdylay_session_del(session);
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_spdylay_session_send_syn_stream()
|
void test_spdylay_session_send_syn_stream()
|
||||||
|
|
Loading…
Reference in New Issue