From e61876ccbdf41b6c2f4eda1392cc3a6b7b01bde9 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 14 Dec 2013 18:48:41 +0900 Subject: [PATCH] nghttp2_hd: Provide dedicated function to enable no reference set feature --- hdtest/deflatehd.c | 4 ++-- lib/nghttp2_hd.c | 23 ++++++++++++----------- lib/nghttp2_hd.h | 14 +++++++++----- tests/nghttp2_hd_test.c | 9 +++++---- 4 files changed, 28 insertions(+), 22 deletions(-) diff --git a/hdtest/deflatehd.c b/hdtest/deflatehd.c index 1a3a709d..72b6fb7c 100644 --- a/hdtest/deflatehd.c +++ b/hdtest/deflatehd.c @@ -384,8 +384,8 @@ int main(int argc, char **argv) break; } } - nghttp2_hd_deflate_init2(&deflater, config.side, config.deflate_table_size, - config.no_refset); + nghttp2_hd_deflate_init2(&deflater, config.side, config.deflate_table_size); + nghttp2_hd_deflate_set_no_refset(&deflater, config.no_refset); nghttp2_hd_change_table_size(&deflater, config.table_size); if(config.http1text) { perform_from_http1text(&deflater); diff --git a/lib/nghttp2_hd.c b/lib/nghttp2_hd.c index ee5fa71b..c1aef30e 100644 --- a/lib/nghttp2_hd.c +++ b/lib/nghttp2_hd.c @@ -246,14 +246,13 @@ static void nghttp2_hd_ringbuf_pop_back(nghttp2_hd_ringbuf *ringbuf) static int nghttp2_hd_context_init(nghttp2_hd_context *context, nghttp2_hd_role role, nghttp2_hd_side side, - size_t deflate_hd_table_bufsize_max, - uint8_t no_refset) + size_t deflate_hd_table_bufsize_max) { int rv; context->role = role; context->side = side; context->bad = 0; - context->no_refset = no_refset; + context->no_refset = 0; context->hd_table_bufsize_max = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE; rv = nghttp2_hd_ringbuf_init (&context->hd_table, @@ -279,24 +278,20 @@ static int nghttp2_hd_context_init(nghttp2_hd_context *context, int nghttp2_hd_deflate_init(nghttp2_hd_context *deflater, nghttp2_hd_side side) { return nghttp2_hd_context_init(deflater, NGHTTP2_HD_ROLE_DEFLATE, side, - NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, - 0); + NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE); } int nghttp2_hd_deflate_init2(nghttp2_hd_context *deflater, nghttp2_hd_side side, - size_t deflate_hd_table_bufsize_max, - uint8_t no_refset) + size_t deflate_hd_table_bufsize_max) { return nghttp2_hd_context_init(deflater, NGHTTP2_HD_ROLE_DEFLATE, side, - deflate_hd_table_bufsize_max, - no_refset); + deflate_hd_table_bufsize_max); } int nghttp2_hd_inflate_init(nghttp2_hd_context *inflater, nghttp2_hd_side side) { - return nghttp2_hd_context_init(inflater, NGHTTP2_HD_ROLE_INFLATE, side, 0, - 0); + return nghttp2_hd_context_init(inflater, NGHTTP2_HD_ROLE_INFLATE, side, 0); } static void nghttp2_hd_context_free(nghttp2_hd_context *context) @@ -329,6 +324,12 @@ void nghttp2_hd_inflate_free(nghttp2_hd_context *inflater) nghttp2_hd_context_free(inflater); } +void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_context *deflater, + uint8_t no_refset) +{ + deflater->no_refset = no_refset; +} + static size_t entry_room(size_t namelen, size_t valuelen) { return NGHTTP2_HD_ENTRY_OVERHEAD + namelen + valuelen; diff --git a/lib/nghttp2_hd.h b/lib/nghttp2_hd.h index 63502284..21554b95 100644 --- a/lib/nghttp2_hd.h +++ b/lib/nghttp2_hd.h @@ -188,9 +188,6 @@ int nghttp2_hd_deflate_init(nghttp2_hd_context *deflater, * for header table even if the larger value is specified later in * nghttp2_hd_change_table_size(). * - * If nonzero is given in the |no_refset|, the encoder first clears - * the reference set each time on deflation. - * * This function returns 0 if it succeeds, or one of the following * negative error codes: * @@ -199,8 +196,7 @@ int nghttp2_hd_deflate_init(nghttp2_hd_context *deflater, */ int nghttp2_hd_deflate_init2(nghttp2_hd_context *deflater, nghttp2_hd_side side, - size_t deflate_hd_table_bufsize_max, - uint8_t no_refset); + size_t deflate_hd_table_bufsize_max); /* * Initializes |inflater| for inflating name/values pairs. @@ -224,6 +220,14 @@ void nghttp2_hd_deflate_free(nghttp2_hd_context *deflater); */ void nghttp2_hd_inflate_free(nghttp2_hd_context *inflater); +/* + * Sets the availability of reference set in the |deflater|. If + * |no_refset| is nonzero, the deflater will first emit index=0 in the + * each invocation of nghttp2_hd_deflate_hd() to clear up reference + * set. By default, the deflater uses reference set. + */ +void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_context *deflater, + uint8_t no_refset); /* * Changes header table size in |context|. This may trigger eviction diff --git a/tests/nghttp2_hd_test.c b/tests/nghttp2_hd_test.c index 168487cb..44e6ffe7 100644 --- a/tests/nghttp2_hd_test.c +++ b/tests/nghttp2_hd_test.c @@ -278,7 +278,7 @@ void test_nghttp2_hd_deflate_deflate_buffer(void) /* Check the case where entry from static table is inserted to dynamic header table. And it is out of deflate header table size. */ - nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 32, 0); + nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 32); nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); blocklen = nghttp2_hd_deflate_hd(&deflater, &buf, &buflen, 0, nva4, ARRLEN(nva4)); @@ -310,7 +310,7 @@ void test_nghttp2_hd_deflate_deflate_buffer(void) nghttp2_hd_inflate_free(&inflater); /* 156 buffer size can hold all headers in deflate region */ - nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 156, 0); + nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 156); blocklen = nghttp2_hd_deflate_hd(&deflater, &buf, &buflen, 0, nva1, ARRLEN(nva1)); CU_ASSERT(blocklen > 0); @@ -344,7 +344,7 @@ void test_nghttp2_hd_deflate_deflate_buffer(void) nghttp2_hd_deflate_free(&deflater); /* Check more complex use case */ - nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 155, 0); + nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, 155); nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); blocklen = nghttp2_hd_deflate_hd(&deflater, &buf, &buflen, 0, nva1, ARRLEN(nva1)); @@ -452,7 +452,8 @@ void test_nghttp2_hd_deflate_clear_refset(void) size_t i; nghttp2_hd_deflate_init2(&deflater, NGHTTP2_HD_SIDE_REQUEST, - NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE, 1); + NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE); + nghttp2_hd_deflate_set_no_refset(&deflater, 1); nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); for(i = 0; i < 2; ++i) {