From 58619a4f9736854e82a0404a0e835d6a91a81e3e Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 15 Sep 2012 00:47:17 +0900 Subject: [PATCH] Enable name/value header compression on server side --- lib/spdylay_session.c | 10 +++++++--- lib/spdylay_zlib.c | 17 +++++++---------- lib/spdylay_zlib.h | 8 +++++--- tests/failmalloc_test.c | 4 ++-- tests/spdylay_frame_test.c | 10 +++++----- tests/spdylay_zlib_test.c | 5 +++-- 6 files changed, 29 insertions(+), 25 deletions(-) diff --git a/lib/spdylay_session.c b/lib/spdylay_session.c index 9d7a64d0..f25dfb04 100644 --- a/lib/spdylay_session.c +++ b/lib/spdylay_session.c @@ -140,7 +140,8 @@ static int spdylay_session_new(spdylay_session **session_ptr, uint16_t version, const spdylay_session_callbacks *callbacks, void *user_data, - size_t cli_certvec_length) + size_t cli_certvec_length, + int hd_comp) { int r; if(version != SPDYLAY_PROTO_SPDY2 && version != SPDYLAY_PROTO_SPDY3) { @@ -172,6 +173,7 @@ static int spdylay_session_new(spdylay_session **session_ptr, (*session_ptr)->max_recv_ctrl_frame_buf = (1 << 24)-1; r = spdylay_zlib_deflate_hd_init(&(*session_ptr)->hd_deflater, + hd_comp, (*session_ptr)->version); if(r != 0) { goto fail_hd_deflater; @@ -268,8 +270,9 @@ int spdylay_session_client_new(spdylay_session **session_ptr, void *user_data) { int r; + /* For client side session, header compression is disabled. */ r = spdylay_session_new(session_ptr, version, callbacks, user_data, - SPDYLAY_INITIAL_CLIENT_CERT_VECTOR_LENGTH); + SPDYLAY_INITIAL_CLIENT_CERT_VECTOR_LENGTH, 0); if(r == 0) { /* IDs for use in client */ (*session_ptr)->next_stream_id = 1; @@ -285,8 +288,9 @@ int spdylay_session_server_new(spdylay_session **session_ptr, void *user_data) { int r; + /* Enable header compression on server side. */ r = spdylay_session_new(session_ptr, version, callbacks, user_data, - 0); + 0, 1 /* hd_comp */); if(r == 0) { (*session_ptr)->server = 1; /* IDs for use in client */ diff --git a/lib/spdylay_zlib.c b/lib/spdylay_zlib.c index 4789de1f..445c5edc 100644 --- a/lib/spdylay_zlib.c +++ b/lib/spdylay_zlib.c @@ -26,13 +26,7 @@ #include -/* By default header compression is disabled */ -#undef ENABLE_HD_COMP -#ifdef ENABLE_HD_COMP -# define COMPRESSION_LEVEL 9 -#else /* !ENABLE_HD_COMP */ -# define COMPRESSION_LEVEL 0 -#endif /* !ENABLE_HD_COMP */ +#define COMPRESSION_LEVEL 9 #define WINDOW_BITS 11 #define MEM_LEVEL 1 @@ -246,7 +240,8 @@ static const uint8_t* spdylay_select_hd_dict(size_t *len_ptr, uint16_t version) return hd_dict; } -int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, uint16_t version) +int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, int comp, + uint16_t version) { const unsigned char *hd_dict; size_t hd_dict_length; @@ -259,8 +254,10 @@ int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, uint16_t version) if(hd_dict == NULL) { return SPDYLAY_ERR_UNSUPPORTED_VERSION; } - if(Z_OK != deflateInit2(&deflater->zst, COMPRESSION_LEVEL, Z_DEFLATED, - WINDOW_BITS, MEM_LEVEL, Z_DEFAULT_STRATEGY)) { + if(Z_OK != deflateInit2(&deflater->zst, + comp ? COMPRESSION_LEVEL : Z_NO_COMPRESSION, + Z_DEFLATED, WINDOW_BITS, MEM_LEVEL, + Z_DEFAULT_STRATEGY)) { return SPDYLAY_ERR_ZLIB; } if(Z_OK != deflateSetDictionary(&deflater->zst, (uint8_t*)hd_dict, diff --git a/lib/spdylay_zlib.h b/lib/spdylay_zlib.h index c26f2a97..f1e0d636 100644 --- a/lib/spdylay_zlib.h +++ b/lib/spdylay_zlib.h @@ -40,8 +40,9 @@ typedef struct { } spdylay_zlib; /* - * Initializes |deflater| for deflating name/values pairs in the - * frame of the protocol version |version|. + * Initializes |deflater| for deflating name/values pairs in the frame + * of the protocol version |version|. If the |comp| is zero, + * compression level becomes 0, which means no compression. * * This function returns 0 if it succeeds, or one of the following * negative error codes: @@ -51,7 +52,8 @@ typedef struct { * SPDYLAY_ERR_UNSUPPORTED_VERSION * The version is not supported. */ -int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, uint16_t version); +int spdylay_zlib_deflate_hd_init(spdylay_zlib *deflater, int comp, + uint16_t version); /* * Initializes |inflater| for inflating name/values pairs in the diff --git a/tests/failmalloc_test.c b/tests/failmalloc_test.c index e3ccef50..63cf7f1a 100644 --- a/tests/failmalloc_test.c +++ b/tests/failmalloc_test.c @@ -299,7 +299,7 @@ static void run_spdylay_session_recv(void) ud.df = &df; spdylay_failmalloc_pause(); - spdylay_zlib_deflate_hd_init(&deflater, SPDYLAY_PROTO_SPDY3); + spdylay_zlib_deflate_hd_init(&deflater, 1, SPDYLAY_PROTO_SPDY3); spdylay_session_server_new(&session, SPDYLAY_PROTO_SPDY3, &callbacks, &ud); spdylay_failmalloc_unpause(); @@ -414,7 +414,7 @@ static void run_spdylay_frame_pack_syn_stream(void) int rv; spdylay_buffer_init(&inflatebuf, 4096); - rv = spdylay_zlib_deflate_hd_init(&deflater, SPDYLAY_PROTO_SPDY3); + rv = spdylay_zlib_deflate_hd_init(&deflater, 1, SPDYLAY_PROTO_SPDY3); if(rv != 0) { goto deflate_init_fail; } diff --git a/tests/spdylay_frame_test.c b/tests/spdylay_frame_test.c index 2c52abc3..06685a20 100644 --- a/tests/spdylay_frame_test.c +++ b/tests/spdylay_frame_test.c @@ -305,7 +305,7 @@ static void test_spdylay_frame_pack_syn_stream_version(uint16_t version) size_t buflen = 0, nvbuflen = 0; ssize_t framelen; - spdylay_zlib_deflate_hd_init(&deflater, version); + spdylay_zlib_deflate_hd_init(&deflater, 1, version); spdylay_zlib_inflate_hd_init(&inflater, version); spdylay_frame_syn_stream_init(&frame.syn_stream, version, SPDYLAY_CTRL_FLAG_FIN, 65536, 1000000007, 3, @@ -358,8 +358,8 @@ void test_spdylay_frame_pack_syn_stream_frame_too_large(void) const char *big_hds[] = { "header", big_val, NULL }; memset(big_val, '0', big_vallen); big_val[big_vallen] = '\0'; - - spdylay_zlib_deflate_hd_init(&deflater, SPDYLAY_PROTO_SPDY3); + /* No compression */ + spdylay_zlib_deflate_hd_init(&deflater, 0, SPDYLAY_PROTO_SPDY3); spdylay_frame_syn_stream_init(&frame.syn_stream, SPDYLAY_PROTO_SPDY3, SPDYLAY_CTRL_FLAG_FIN, 65536, 1000000007, 3, spdylay_frame_nv_copy(big_hds)); @@ -382,7 +382,7 @@ static void test_spdylay_frame_pack_syn_reply_version(uint16_t version) uint8_t *buf = NULL, *nvbuf = NULL; size_t buflen = 0, nvbuflen = 0; ssize_t framelen; - spdylay_zlib_deflate_hd_init(&deflater, version); + spdylay_zlib_deflate_hd_init(&deflater, 1, version); spdylay_zlib_inflate_hd_init(&inflater, version); spdylay_frame_syn_reply_init(&frame.syn_reply, version, SPDYLAY_CTRL_FLAG_FIN, 3, @@ -430,7 +430,7 @@ static void test_spdylay_frame_pack_headers_version(uint16_t version) spdylay_buffer inflatebuf; ssize_t framelen; spdylay_buffer_init(&inflatebuf, 4096); - spdylay_zlib_deflate_hd_init(&deflater, version); + spdylay_zlib_deflate_hd_init(&deflater, 1, version); spdylay_zlib_inflate_hd_init(&inflater, version); spdylay_frame_headers_init(&frame.headers, version, SPDYLAY_CTRL_FLAG_FIN, 3, diff --git a/tests/spdylay_zlib_test.c b/tests/spdylay_zlib_test.c index 009fc843..54fe0300 100644 --- a/tests/spdylay_zlib_test.c +++ b/tests/spdylay_zlib_test.c @@ -49,8 +49,9 @@ static void test_spdylay_zlib_with(uint16_t version) size_t deflatebuf_max; ssize_t deflatebuf_len; spdylay_buffer_init(&buf, 4096); - - CU_ASSERT(0 == spdylay_zlib_deflate_hd_init(&deflater, version)); + + CU_ASSERT(0 == spdylay_zlib_deflate_hd_init(&deflater, 1, + version)); CU_ASSERT(0 == spdylay_zlib_inflate_hd_init(&inflater, version)); deflatebuf_max = spdylay_zlib_deflate_hd_bound(&deflater, sizeof(msg));