Always accept SPDY/3 style name/value pairs from spdylay_submit_* and

translate them into SPDY/2 as needed.
This commit is contained in:
Tatsuhiro Tsujikawa
2012-03-06 23:43:45 +09:00
parent 7d9a7b3069
commit 00abfc8dd3
8 changed files with 187 additions and 44 deletions

View File

@@ -170,6 +170,8 @@ int main(int argc, char* argv[])
test_spdylay_frame_nv_downcase) ||
!CU_add_test(pSuite, "frame_pack_nv_duplicate_keys",
test_spdylay_frame_pack_nv_duplicate_keys) ||
!CU_add_test(pSuite, "frame_nv_2to3", test_spdylay_frame_nv_2to3) ||
!CU_add_test(pSuite, "frame_nv_3to2", test_spdylay_frame_nv_3to2) ||
!CU_add_test(pSuite, "stream_add_pushed_stream",
test_spdylay_stream_add_pushed_stream)) {
CU_cleanup_registry();

View File

@@ -526,3 +526,53 @@ void test_spdylay_frame_nv_downcase()
CU_ASSERT(0 == strcmp("1000000007", nv[3]));
spdylay_frame_nv_del(nv);
}
void test_spdylay_frame_nv_2to3()
{
const char *nv_src[] = {
"host", "localhost",
"method", "GET",
"url", "/",
"accept", "*/*",
"scheme", "https",
"status", "200 OK",
"version", "HTTP/1.1",
NULL
};
char **nv;
nv = spdylay_frame_nv_copy(nv_src);
spdylay_frame_nv_2to3(nv);
CU_ASSERT(0 == strcmp(":host", nv[0]));
CU_ASSERT(0 == strcmp(":method", nv[2]));
CU_ASSERT(0 == strcmp(":path", nv[4]));
CU_ASSERT(0 == strcmp("accept", nv[6]));
CU_ASSERT(0 == strcmp(":scheme", nv[8]));
CU_ASSERT(0 == strcmp(":status", nv[10]));
CU_ASSERT(0 == strcmp(":version", nv[12]));
spdylay_frame_nv_del(nv);
}
void test_spdylay_frame_nv_3to2()
{
const char *nv_src[] = {
":host", "localhost",
":method", "GET",
":path", "/",
"accept", "*/*",
":scheme", "https",
":status", "200 OK",
":version", "HTTP/1.1",
NULL
};
char **nv;
nv = spdylay_frame_nv_copy(nv_src);
spdylay_frame_nv_3to2(nv);
CU_ASSERT(0 == strcmp("host", nv[0]));
CU_ASSERT(0 == strcmp("method", nv[2]));
CU_ASSERT(0 == strcmp("url", nv[4]));
CU_ASSERT(0 == strcmp("accept", nv[6]));
CU_ASSERT(0 == strcmp("scheme", nv[8]));
CU_ASSERT(0 == strcmp("status", nv[10]));
CU_ASSERT(0 == strcmp("version", nv[12]));
spdylay_frame_nv_del(nv);
}

View File

@@ -43,5 +43,7 @@ void test_spdylay_frame_pack_window_update();
void test_spdylay_frame_pack_settings();
void test_spdylay_frame_nv_sort();
void test_spdylay_frame_nv_downcase();
void test_spdylay_frame_nv_2to3();
void test_spdylay_frame_nv_3to2();
#endif /* SPDYLAY_FRAME_TEST_H */

View File

@@ -579,21 +579,36 @@ void test_spdylay_submit_response_with_null_data_read_callback()
{
spdylay_session *session;
spdylay_session_callbacks callbacks;
const char *nv[] = { "Version", "HTTP/1.1", NULL };
accumulator acc;
const char *nv[] = { ":Version", "HTTP/1.1", NULL };
spdylay_data_provider data_prd = {{-1}, NULL};
spdylay_outbound_item *item;
my_user_data ud;
spdylay_frame frame;
acc.length = 0;
ud.acc = &acc;
memset(&callbacks, 0, sizeof(callbacks));
callbacks.send_callback = null_send_callback;
callbacks.send_callback = accumulator_send_callback;
CU_ASSERT(0 == spdylay_session_server_new(&session, SPDYLAY_PROTO_SPDY2,
&callbacks, NULL));
&callbacks, &ud));
spdylay_session_open_stream(session, 1, SPDYLAY_CTRL_FLAG_FIN, 3,
SPDYLAY_STREAM_OPENING, NULL);
CU_ASSERT(0 == spdylay_submit_response(session, 1, nv, &data_prd));
item = spdylay_session_get_next_ob_item(session);
CU_ASSERT(0 == strcmp("version", item->frame->syn_reply.nv[0]));
CU_ASSERT(0 == strcmp(":version", item->frame->syn_reply.nv[0]));
CU_ASSERT(item->frame->syn_reply.hd.flags & SPDYLAY_CTRL_FLAG_FIN);
CU_ASSERT(0 == spdylay_session_send(session));
CU_ASSERT(0 == spdylay_frame_unpack_syn_reply(&frame.syn_reply,
&session->inflatebuf,
&session->nvbuf,
&session->nvbuflen,
&acc.buf[0], SPDYLAY_HEAD_LEN,
&acc.buf[SPDYLAY_HEAD_LEN],
acc.length-SPDYLAY_HEAD_LEN,
&session->hd_inflater));
CU_ASSERT(0 == strcmp("version", frame.syn_reply.nv[0]));
spdylay_session_del(session);
}
@@ -627,23 +642,36 @@ void test_spdylay_submit_request_with_data()
void test_spdylay_submit_request_with_null_data_read_callback()
{
spdylay_session *session;
spdylay_session_callbacks callbacks = {
null_send_callback,
NULL,
NULL,
NULL
};
const char *nv[] = { "Version", "HTTP/1.1", NULL };
spdylay_session_callbacks callbacks;
accumulator acc;
const char *nv[] = { ":Version", "HTTP/1.1", NULL };
spdylay_data_provider data_prd = {{-1}, NULL};
spdylay_outbound_item *item;
my_user_data ud;
spdylay_frame frame;
acc.length = 0;
ud.acc = &acc;
memset(&callbacks, 0, sizeof(spdylay_session_callbacks));
callbacks.send_callback = accumulator_send_callback;
CU_ASSERT(0 == spdylay_session_client_new(&session, SPDYLAY_PROTO_SPDY2,
&callbacks, NULL));
&callbacks, &ud));
CU_ASSERT(0 == spdylay_submit_request(session, 3, nv, &data_prd, NULL));
item = spdylay_session_get_next_ob_item(session);
CU_ASSERT(0 == strcmp("version", item->frame->syn_stream.nv[0]));
CU_ASSERT(0 == strcmp(":version", item->frame->syn_stream.nv[0]));
CU_ASSERT(item->frame->syn_stream.hd.flags & SPDYLAY_CTRL_FLAG_FIN);
CU_ASSERT(0 == spdylay_session_send(session));
CU_ASSERT(0 == spdylay_frame_unpack_syn_stream(&frame.syn_stream,
&session->inflatebuf,
&session->nvbuf,
&session->nvbuflen,
&acc.buf[0], SPDYLAY_HEAD_LEN,
&acc.buf[SPDYLAY_HEAD_LEN],
acc.length-SPDYLAY_HEAD_LEN,
&session->hd_inflater));
CU_ASSERT(0 == strcmp("version", frame.syn_stream.nv[0]));
spdylay_session_del(session);
}
@@ -724,20 +752,24 @@ void test_spdylay_submit_headers()
{
spdylay_session *session;
spdylay_session_callbacks callbacks;
const char *nv[] = { "version", "HTTP/1.1", NULL };
const char *nv[] = { ":Version", "HTTP/1.1", NULL };
my_user_data ud;
spdylay_outbound_item *item;
spdylay_stream *stream;
accumulator acc;
spdylay_frame frame;
acc.length = 0;
ud.acc = &acc;
memset(&callbacks, 0, sizeof(spdylay_session_callbacks));
callbacks.send_callback = null_send_callback;
callbacks.send_callback = accumulator_send_callback;
callbacks.on_ctrl_send_callback = on_ctrl_send_callback;
CU_ASSERT(0 == spdylay_session_client_new(&session, SPDYLAY_PROTO_SPDY2,
&callbacks, &ud));
CU_ASSERT(0 == spdylay_submit_headers(session, SPDYLAY_CTRL_FLAG_FIN, 1, nv));
item = spdylay_session_get_next_ob_item(session);
CU_ASSERT(0 == strcmp("version", item->frame->headers.nv[0]));
CU_ASSERT(0 == strcmp(":version", item->frame->headers.nv[0]));
CU_ASSERT(SPDYLAY_CTRL_FLAG_FIN == item->frame->headers.hd.flags);
ud.ctrl_send_cb_called = 0;
@@ -754,6 +786,16 @@ void test_spdylay_submit_headers()
CU_ASSERT(SPDYLAY_HEADERS == ud.sent_frame_type);
CU_ASSERT(stream->shut_flags & SPDYLAY_SHUT_WR);
CU_ASSERT(0 == spdylay_frame_unpack_headers(&frame.headers,
&session->inflatebuf,
&session->nvbuf,
&session->nvbuflen,
&acc.buf[0], SPDYLAY_HEAD_LEN,
&acc.buf[SPDYLAY_HEAD_LEN],
acc.length-SPDYLAY_HEAD_LEN,
&session->hd_inflater));
CU_ASSERT(0 == strcmp("version", frame.headers.nv[0]));
spdylay_session_del(session);
}