From de57b6efeaf25d5ea4584682942f720c9c03f3d4 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 28 Jan 2012 00:09:01 +0900 Subject: [PATCH] Sort nv in spdylay_submit_request and spdylay_submit_response --- lib/spdylay_frame.c | 12 ++++++++++++ lib/spdylay_frame.h | 5 +++++ lib/spdylay_session.c | 2 ++ tests/main.c | 3 ++- tests/spdylay_frame_test.c | 19 +++++++++++++++++++ tests/spdylay_frame_test.h | 1 + 6 files changed, 41 insertions(+), 1 deletion(-) diff --git a/lib/spdylay_frame.c b/lib/spdylay_frame.c index e418baca..da83b602 100644 --- a/lib/spdylay_frame.c +++ b/lib/spdylay_frame.c @@ -337,6 +337,18 @@ char** spdylay_frame_nv_copy(const char **nv) return nnv; } +static int spdylay_string_compar(const void *lhs, const void *rhs) +{ + return strcmp(*(char **)lhs, *(char **)rhs); +} + +void spdylay_frame_nv_sort(char **nv) +{ + int n; + for(n = 0; nv[n]; ++n); + qsort(nv, n/2, 2*sizeof(char*), spdylay_string_compar); +} + void spdylay_frame_syn_stream_init(spdylay_syn_stream *frame, uint8_t flags, int32_t stream_id, int32_t assoc_stream_id, uint8_t pri, char **nv) diff --git a/lib/spdylay_frame.h b/lib/spdylay_frame.h index 6a3e6198..3e0bc940 100644 --- a/lib/spdylay_frame.h +++ b/lib/spdylay_frame.h @@ -213,4 +213,9 @@ void spdylay_frame_nv_free(char **nv); */ char** spdylay_frame_nv_copy(const char **nv); +/* + * Sorts |nv| in the ascending order of name. + */ +void spdylay_frame_nv_sort(char **nv); + #endif /* SPDYLAY_FRAME_H */ diff --git a/lib/spdylay_session.c b/lib/spdylay_session.c index 963eb366..917f64f1 100644 --- a/lib/spdylay_session.c +++ b/lib/spdylay_session.c @@ -1019,6 +1019,7 @@ int spdylay_submit_response(spdylay_session *session, free(frame); return SPDYLAY_ERR_NOMEM; } + spdylay_frame_nv_sort(nv_copy); if(data_prd == NULL) { flags |= SPDYLAY_FLAG_FIN; } @@ -1068,6 +1069,7 @@ int spdylay_submit_request(spdylay_session *session, uint8_t pri, free(frame); return SPDYLAY_ERR_NOMEM; } + spdylay_frame_nv_sort(nv_copy); /* When we support POST using spdylay_data_provider, flags should be 0 if data_prd is set. */ flags |= SPDYLAY_FLAG_FIN; diff --git a/tests/main.c b/tests/main.c index c5b8e95b..dc09f970 100644 --- a/tests/main.c +++ b/tests/main.c @@ -91,7 +91,8 @@ int main() test_spdylay_frame_count_nv_space) || !CU_add_test(pSuite, "frame_pack_ping", test_spdylay_frame_pack_ping) || !CU_add_test(pSuite, "frame_pack_headers", - test_spdylay_frame_pack_headers)) { + test_spdylay_frame_pack_headers) || + !CU_add_test(pSuite, "frame_nv_sort", test_spdylay_frame_nv_sort)) { CU_cleanup_registry(); return CU_get_error(); } diff --git a/tests/spdylay_frame_test.c b/tests/spdylay_frame_test.c index b5d9f504..4f65a281 100644 --- a/tests/spdylay_frame_test.c +++ b/tests/spdylay_frame_test.c @@ -99,3 +99,22 @@ void test_spdylay_frame_pack_headers() spdylay_zlib_inflate_free(&inflater); spdylay_zlib_deflate_free(&deflater); } + +void test_spdylay_frame_nv_sort() +{ + char *nv[7]; + nv[0] = (char*)"version"; + nv[1] = (char*)"HTTP/1.1"; + nv[2] = (char*)"method"; + nv[3] = (char*)"GET"; + nv[4] = (char*)"scheme"; + nv[5] = (char*)"https"; + nv[6] = NULL; + spdylay_frame_nv_sort(nv); + CU_ASSERT(strcmp("method", nv[0]) == 0); + CU_ASSERT(strcmp("GET", nv[1]) == 0); + CU_ASSERT(strcmp("scheme", nv[2]) == 0); + CU_ASSERT(strcmp("https", nv[3]) == 0); + CU_ASSERT(strcmp("version", nv[4]) == 0); + CU_ASSERT(strcmp("HTTP/1.1", nv[5]) == 0); +} diff --git a/tests/spdylay_frame_test.h b/tests/spdylay_frame_test.h index 81db459a..c8f3c765 100644 --- a/tests/spdylay_frame_test.h +++ b/tests/spdylay_frame_test.h @@ -29,5 +29,6 @@ void test_spdylay_frame_unpack_nv(); void test_spdylay_frame_count_nv_space(); void test_spdylay_frame_pack_ping(); void test_spdylay_frame_pack_headers(); +void test_spdylay_frame_nv_sort(); #endif /* SPDYLAY_FRAME_TEST_H */