Commit fd88c616 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

HPACK post -05 updates

* Use 1 Huffman code table for both request and response
* Remove complicated deflater side table size management
* Add encoding context update
* Fix memory leak in inflater
parent 082876d9
This diff is collapsed.
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/ */
#ifndef NGHTTP2_HD_COMP_H #ifndef NGHTTP2_HD_H
#define NGHTTP2_HD_COMP_H #define NGHTTP2_HD_H
#ifdef HAVE_CONFIG_H #ifdef HAVE_CONFIG_H
# include <config.h> # include <config.h>
...@@ -48,11 +48,6 @@ ...@@ -48,11 +48,6 @@
encoder only uses the memory up to this value. */ encoder only uses the memory up to this value. */
#define NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE (1 << 12) #define NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE (1 << 12)
typedef enum {
NGHTTP2_HD_SIDE_REQUEST = 0,
NGHTTP2_HD_SIDE_RESPONSE = 1
} nghttp2_hd_side;
typedef enum { typedef enum {
NGHTTP2_HD_ROLE_DEFLATE, NGHTTP2_HD_ROLE_DEFLATE,
NGHTTP2_HD_ROLE_INFLATE NGHTTP2_HD_ROLE_INFLATE
...@@ -108,6 +103,8 @@ typedef enum { ...@@ -108,6 +103,8 @@ typedef enum {
typedef enum { typedef enum {
NGHTTP2_HD_STATE_OPCODE, NGHTTP2_HD_STATE_OPCODE,
NGHTTP2_HD_STATE_CONTEXT_UPDATE,
NGHTTP2_HD_STATE_READ_TABLE_SIZE,
NGHTTP2_HD_STATE_READ_INDEX, NGHTTP2_HD_STATE_READ_INDEX,
NGHTTP2_HD_STATE_NEWNAME_CHECK_NAMELEN, NGHTTP2_HD_STATE_NEWNAME_CHECK_NAMELEN,
NGHTTP2_HD_STATE_NEWNAME_READ_NAMELEN, NGHTTP2_HD_STATE_NEWNAME_READ_NAMELEN,
...@@ -126,30 +123,10 @@ typedef struct { ...@@ -126,30 +123,10 @@ typedef struct {
is the sum of length of name/value in hd_table + is the sum of length of name/value in hd_table +
NGHTTP2_HD_ENTRY_OVERHEAD bytes overhead per each entry. */ NGHTTP2_HD_ENTRY_OVERHEAD bytes overhead per each entry. */
size_t hd_table_bufsize; size_t hd_table_bufsize;
/* The header table size for decoding. If the context is initialized /* The effective header table size. */
as encoder, this value is advertised by remote endpoint
decoder. */
size_t hd_table_bufsize_max; size_t hd_table_bufsize_max;
/* The current effective header table size for encoding. This value
is always equal to |hd_table_bufsize| on decoder
context. |deflate_hd_table_bufsize| <= |hd_table_bufsize| must be
hold. */
size_t deflate_hd_table_bufsize;
/* The maximum effective header table for encoding. Although header
table size is bounded by |hd_table_bufsize_max|, the encoder can
use smaller buffer by not retaining the header name/values beyond
the |deflate_hd_table_bufsize_max| and not referencing those
entries. This value is always equal to |hd_table_bufsize_max| on
decoder context. */
size_t deflate_hd_table_bufsize_max;
/* The number of effective entry in |hd_table|. This value is always
equal to hd_table.len on decoder side. */
size_t deflate_hd_tablelen;
/* Role of this context; deflate or infalte */ /* Role of this context; deflate or infalte */
nghttp2_hd_role role; nghttp2_hd_role role;
/* NGHTTP2_HD_SIDE_REQUEST for processing request, otherwise
response. */
nghttp2_hd_side side;
/* If inflate/deflate error occurred, this value is set to 1 and /* If inflate/deflate error occurred, this value is set to 1 and
further invocation of inflate/deflate will fail with further invocation of inflate/deflate will fail with
NGHTTP2_ERR_HEADER_COMP. */ NGHTTP2_ERR_HEADER_COMP. */
...@@ -158,6 +135,8 @@ typedef struct { ...@@ -158,6 +135,8 @@ typedef struct {
typedef struct { typedef struct {
nghttp2_hd_context ctx; nghttp2_hd_context ctx;
/* The upper limit of the header table size the deflater accepts. */
size_t deflate_hd_table_bufsize_max;
/* Set to this nonzero to clear reference set on each deflation each /* Set to this nonzero to clear reference set on each deflation each
time. */ time. */
uint8_t no_refset; uint8_t no_refset;
...@@ -189,6 +168,9 @@ typedef struct { ...@@ -189,6 +168,9 @@ typedef struct {
/* The index of header table to toggle off the entry from reference /* The index of header table to toggle off the entry from reference
set at the end of decompression. */ set at the end of decompression. */
size_t end_headers_index; size_t end_headers_index;
/* The maximum header table size the inflater supports. This is the
same value transmitted in SETTINGS_HEADER_TABLE_SIZE */
size_t settings_hd_table_bufsize_max;
nghttp2_hd_opcode opcode; nghttp2_hd_opcode opcode;
nghttp2_hd_inflate_state state; nghttp2_hd_inflate_state state;
/* nonzero if string is huffman encoded */ /* nonzero if string is huffman encoded */
...@@ -230,8 +212,7 @@ void nghttp2_hd_entry_free(nghttp2_hd_entry *ent); ...@@ -230,8 +212,7 @@ void nghttp2_hd_entry_free(nghttp2_hd_entry *ent);
* NGHTTP2_ERR_NOMEM * NGHTTP2_ERR_NOMEM
* Out of memory. * Out of memory.
*/ */
int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater, int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater);
nghttp2_hd_side side);
/* /*
* Initializes |deflater| for deflating name/values pairs. * Initializes |deflater| for deflating name/values pairs.
...@@ -247,7 +228,6 @@ int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater, ...@@ -247,7 +228,6 @@ int nghttp2_hd_deflate_init(nghttp2_hd_deflater *deflater,
* Out of memory. * Out of memory.
*/ */
int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater, int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater,
nghttp2_hd_side side,
size_t deflate_hd_table_bufsize_max); size_t deflate_hd_table_bufsize_max);
/* /*
...@@ -259,8 +239,7 @@ int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater, ...@@ -259,8 +239,7 @@ int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater,
* NGHTTP2_ERR_NOMEM * NGHTTP2_ERR_NOMEM
* Out of memory. * Out of memory.
*/ */
int nghttp2_hd_inflate_init(nghttp2_hd_inflater *inflater, int nghttp2_hd_inflate_init(nghttp2_hd_inflater *inflater);
nghttp2_hd_side side);
/* /*
* Deallocates any resources allocated for |deflater|. * Deallocates any resources allocated for |deflater|.
...@@ -282,10 +261,11 @@ void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater, ...@@ -282,10 +261,11 @@ void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater,
uint8_t no_refset); uint8_t no_refset);
/* /*
* Changes header table size in |context|. This may trigger eviction * Changes header table size of the |deflater|. This may trigger
* in the dynamic table. * eviction in the dynamic table.
* *
* This function can be used for deflater and inflater. * The |settings_hd_table_bufsize_max| should be the value received in
* SETTINGS_HEADER_TABLE_SIZE.
* *
* This function returns 0 if it succeeds, or one of the following * This function returns 0 if it succeeds, or one of the following
* negative error codes: * negative error codes:
...@@ -293,8 +273,25 @@ void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater, ...@@ -293,8 +273,25 @@ void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater,
* NGHTTP2_ERR_NOMEM * NGHTTP2_ERR_NOMEM
* Out of memory. * Out of memory.
*/ */
int nghttp2_hd_change_table_size(nghttp2_hd_context *context, int nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater,
size_t hd_table_bufsize_max); size_t settings_hd_table_bufsize_max);
/*
* Changes header table size in the |inflater|. This may trigger
* eviction in the dynamic table.
*
* The |settings_hd_table_bufsize_max| should be the value transmitted
* in SETTINGS_HEADER_TABLE_SIZE.
*
* This function returns 0 if it succeeds, or one of the following
* negative error codes:
*
* NGHTTP2_ERR_NOMEM
* Out of memory.
*/
int nghttp2_hd_inflate_change_table_size(nghttp2_hd_inflater *inflater,
size_t settings_hd_table_bufsize_max);
/* /*
* Deflates the |nva|, which has the |nvlen| name/value pairs, into * Deflates the |nva|, which has the |nvlen| name/value pairs, into
...@@ -379,14 +376,16 @@ int nghttp2_hd_inflate_end_headers(nghttp2_hd_inflater *inflater); ...@@ -379,14 +376,16 @@ int nghttp2_hd_inflate_end_headers(nghttp2_hd_inflater *inflater);
int nghttp2_hd_emit_indname_block(uint8_t **buf_ptr, size_t *buflen_ptr, int nghttp2_hd_emit_indname_block(uint8_t **buf_ptr, size_t *buflen_ptr,
size_t *offset_ptr, size_t index, size_t *offset_ptr, size_t index,
const uint8_t *value, size_t valuelen, const uint8_t *value, size_t valuelen,
int inc_indexing, int inc_indexing);
nghttp2_hd_side side);
/* For unittesting purpose */ /* For unittesting purpose */
int nghttp2_hd_emit_newname_block(uint8_t **buf_ptr, size_t *buflen_ptr, int nghttp2_hd_emit_newname_block(uint8_t **buf_ptr, size_t *buflen_ptr,
size_t *offset_ptr, nghttp2_nv *nv, size_t *offset_ptr, nghttp2_nv *nv,
int inc_indexing, int inc_indexing);
nghttp2_hd_side side);
/* For unittesting purpose */
int nghttp2_hd_emit_table_size(uint8_t **buf_ptr, size_t *buflen_ptr,
size_t *offset_ptr, size_t table_size);
/* For unittesting purpose */ /* For unittesting purpose */
nghttp2_hd_entry* nghttp2_hd_table_get(nghttp2_hd_context *context, nghttp2_hd_entry* nghttp2_hd_table_get(nghttp2_hd_context *context,
...@@ -395,37 +394,30 @@ nghttp2_hd_entry* nghttp2_hd_table_get(nghttp2_hd_context *context, ...@@ -395,37 +394,30 @@ nghttp2_hd_entry* nghttp2_hd_table_get(nghttp2_hd_context *context,
/* Huffman encoding/decoding functions */ /* Huffman encoding/decoding functions */
/* /*
* Counts the required bytes to encode |src| with length |len|. If * Counts the required bytes to encode |src| with length |len|.
* |side| is NGHTTP2_HD_SIDE_REQUEST, the request huffman code table
* is used. Otherwise, the response code table is used.
* *
* This function returns the number of required bytes to encode given * This function returns the number of required bytes to encode given
* data, including padding of prefix of terminal symbol code. This * data, including padding of prefix of terminal symbol code. This
* function always succeeds. * function always succeeds.
*/ */
size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len, size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len);
nghttp2_hd_side side);
/* /*
* Encodes the given data |src| with length |srclen| to the given * Encodes the given data |src| with length |srclen| to the given
* memory location pointed by |dest|, allocated at lest |destlen| * memory location pointed by |dest|, allocated at lest |destlen|
* bytes. The caller is responsible to specify |destlen| at least the * bytes. The caller is responsible to specify |destlen| at least the
* length that nghttp2_hd_huff_encode_count() returns. If |side| is * length that nghttp2_hd_huff_encode_count() returns.
* NGHTTP2_HD_SIDE_REQUEST, the request huffman code table is
* used. Otherwise, the response code table is used.
* *
* This function returns the number of written bytes, including * This function returns the number of written bytes, including
* padding of prefix of terminal symbol code. This return value is * padding of prefix of terminal symbol code. This return value is
* exactly the same with the return value of * exactly the same with the return value of
* nghttp2_hd_huff_encode_count() if it is given with the same |src|, * nghttp2_hd_huff_encode_count() if it is given with the same |src|
* |srclen|, and |side|. This function always succeeds. * and |srclen|. This function always succeeds.
*/ */
ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen, ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen,
const uint8_t *src, size_t srclen, const uint8_t *src, size_t srclen);
nghttp2_hd_side side);
void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx, void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx);
nghttp2_hd_side side);
/* /*
* Decodes the given data |src| with length |srclen|. The |ctx| must * Decodes the given data |src| with length |srclen|. The |ctx| must
...@@ -453,4 +445,4 @@ ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx, ...@@ -453,4 +445,4 @@ ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
nghttp2_buffer *dest, nghttp2_buffer *dest,
const uint8_t *src, size_t srclen, int final); const uint8_t *src, size_t srclen, int final);
#endif /* NGHTTP2_HD_COMP_H */ #endif /* NGHTTP2_HD_H */
...@@ -30,11 +30,8 @@ ...@@ -30,11 +30,8 @@
#include "nghttp2_hd.h" #include "nghttp2_hd.h"
extern const nghttp2_huff_sym req_huff_sym_table[]; extern const nghttp2_huff_sym huff_sym_table[];
extern const nghttp2_huff_decode req_huff_decode_table[][16]; extern const nghttp2_huff_decode huff_decode_table[][16];
extern const nghttp2_huff_sym res_huff_sym_table[];
extern const nghttp2_huff_decode res_huff_decode_table[][16];
/* /*
* Encodes huffman code |sym| into |*dest_ptr|, whose least |rembits| * Encodes huffman code |sym| into |*dest_ptr|, whose least |rembits|
...@@ -65,18 +62,11 @@ static size_t huff_encode_sym(uint8_t **dest_ptr, size_t rembits, ...@@ -65,18 +62,11 @@ static size_t huff_encode_sym(uint8_t **dest_ptr, size_t rembits,
return rembits; return rembits;
} }
size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len, size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len)
nghttp2_hd_side side)
{ {
size_t i; size_t i;
size_t nbits = 0; size_t nbits = 0;
const nghttp2_huff_sym *huff_sym_table;
if(side == NGHTTP2_HD_SIDE_REQUEST) {
huff_sym_table = req_huff_sym_table;
} else {
huff_sym_table = res_huff_sym_table;
}
for(i = 0; i < len; ++i) { for(i = 0; i < len; ++i) {
nbits += huff_sym_table[src[i]].nbits; nbits += huff_sym_table[src[i]].nbits;
} }
...@@ -85,19 +75,12 @@ size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len, ...@@ -85,19 +75,12 @@ size_t nghttp2_hd_huff_encode_count(const uint8_t *src, size_t len,
} }
ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen, ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen,
const uint8_t *src, size_t srclen, const uint8_t *src, size_t srclen)
nghttp2_hd_side side)
{ {
int rembits = 8; int rembits = 8;
uint8_t *dest_first = dest; uint8_t *dest_first = dest;
size_t i; size_t i;
const nghttp2_huff_sym *huff_sym_table;
if(side == NGHTTP2_HD_SIDE_REQUEST) {
huff_sym_table = req_huff_sym_table;
} else {
huff_sym_table = res_huff_sym_table;
}
for(i = 0; i < srclen; ++i) { for(i = 0; i < srclen; ++i) {
const nghttp2_huff_sym *sym = &huff_sym_table[src[i]]; const nghttp2_huff_sym *sym = &huff_sym_table[src[i]];
if(rembits == 8) { if(rembits == 8) {
...@@ -114,14 +97,8 @@ ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen, ...@@ -114,14 +97,8 @@ ssize_t nghttp2_hd_huff_encode(uint8_t *dest, size_t destlen,
return dest - dest_first; return dest - dest_first;
} }
void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx, void nghttp2_hd_huff_decode_context_init(nghttp2_hd_huff_decode_context *ctx)
nghttp2_hd_side side)
{ {
if(side == NGHTTP2_HD_SIDE_REQUEST) {
ctx->huff_decode_table = req_huff_decode_table;
} else {
ctx->huff_decode_table = res_huff_decode_table;
}
ctx->state = 0; ctx->state = 0;
ctx->accept = 1; ctx->accept = 1;
} }
...@@ -137,7 +114,7 @@ ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx, ...@@ -137,7 +114,7 @@ ssize_t nghttp2_hd_huff_decode(nghttp2_hd_huff_decode_context *ctx,
for(i = 0; i < srclen; ++i) { for(i = 0; i < srclen; ++i) {
uint8_t in = src[i] >> 4; uint8_t in = src[i] >> 4;
for(j = 0; j < 2; ++j) { for(j = 0; j < 2; ++j) {
const nghttp2_huff_decode *t = &ctx->huff_decode_table[ctx->state][in]; const nghttp2_huff_decode *t = &huff_decode_table[ctx->state][in];
if(t->state == -1) { if(t->state == -1) {
return NGHTTP2_ERR_HEADER_COMP; return NGHTTP2_ERR_HEADER_COMP;
} }
......
...@@ -52,7 +52,6 @@ typedef struct { ...@@ -52,7 +52,6 @@ typedef struct {
typedef nghttp2_huff_decode huff_decode_table_type[16]; typedef nghttp2_huff_decode huff_decode_table_type[16];
typedef struct { typedef struct {
const huff_decode_table_type *huff_decode_table;
/* Current huffman decoding state. We stripped leaf nodes, so the /* Current huffman decoding state. We stripped leaf nodes, so the
value range is [0..255], inclusive. */ value range is [0..255], inclusive. */
uint8_t state; uint8_t state;
......
This diff is collapsed.
...@@ -201,7 +201,7 @@ static int nghttp2_session_new(nghttp2_session **session_ptr, ...@@ -201,7 +201,7 @@ static int nghttp2_session_new(nghttp2_session **session_ptr,
const nghttp2_opt_set *opt_set) const nghttp2_opt_set *opt_set)
{ {
int r; int r;
nghttp2_hd_side side_deflate, side_inflate;
*session_ptr = malloc(sizeof(nghttp2_session)); *session_ptr = malloc(sizeof(nghttp2_session));
if(*session_ptr == NULL) { if(*session_ptr == NULL) {
r = NGHTTP2_ERR_NOMEM; r = NGHTTP2_ERR_NOMEM;
...@@ -236,17 +236,12 @@ static int nghttp2_session_new(nghttp2_session **session_ptr, ...@@ -236,17 +236,12 @@ static int nghttp2_session_new(nghttp2_session **session_ptr,
if(server) { if(server) {
(*session_ptr)->server = 1; (*session_ptr)->server = 1;
side_deflate = NGHTTP2_HD_SIDE_RESPONSE;
side_inflate = NGHTTP2_HD_SIDE_REQUEST;
} else {
side_deflate = NGHTTP2_HD_SIDE_REQUEST;
side_inflate = NGHTTP2_HD_SIDE_RESPONSE;
} }
r = nghttp2_hd_deflate_init(&(*session_ptr)->hd_deflater, side_deflate); r = nghttp2_hd_deflate_init(&(*session_ptr)->hd_deflater);
if(r != 0) { if(r != 0) {
goto fail_hd_deflater; goto fail_hd_deflater;
} }
r = nghttp2_hd_inflate_init(&(*session_ptr)->hd_inflater, side_inflate); r = nghttp2_hd_inflate_init(&(*session_ptr)->hd_inflater);
if(r != 0) { if(r != 0) {
goto fail_hd_inflater; goto fail_hd_inflater;
} }
...@@ -2708,8 +2703,8 @@ int nghttp2_session_update_local_settings(nghttp2_session *session, ...@@ -2708,8 +2703,8 @@ int nghttp2_session_update_local_settings(nghttp2_session *session,
header_table_size > NGHTTP2_MAX_HEADER_TABLE_SIZE) { header_table_size > NGHTTP2_MAX_HEADER_TABLE_SIZE) {
return NGHTTP2_ERR_HEADER_COMP; return NGHTTP2_ERR_HEADER_COMP;
} }
rv = nghttp2_hd_change_table_size(&session->hd_inflater.ctx, rv = nghttp2_hd_inflate_change_table_size(&session->hd_inflater,
header_table_size); header_table_size);
if(rv != 0) { if(rv != 0) {
return rv; return rv;
} }
...@@ -2791,8 +2786,8 @@ int nghttp2_session_on_settings_received(nghttp2_session *session, ...@@ -2791,8 +2786,8 @@ int nghttp2_session_on_settings_received(nghttp2_session *session,
return nghttp2_session_handle_invalid_connection return nghttp2_session_handle_invalid_connection
(session, frame, NGHTTP2_COMPRESSION_ERROR); (session, frame, NGHTTP2_COMPRESSION_ERROR);
} }
rv = nghttp2_hd_change_table_size(&session->hd_deflater.ctx, rv = nghttp2_hd_deflate_change_table_size(&session->hd_deflater,
entry->value); entry->value);
if(rv != 0) { if(rv != 0) {
if(nghttp2_is_fatal(rv)) { if(nghttp2_is_fatal(rv)) {
return rv; return rv;
......
...@@ -45,10 +45,6 @@ cdef extern from 'nghttp2_hd.h': ...@@ -45,10 +45,6 @@ cdef extern from 'nghttp2_hd.h':
# This is macro # This is macro
int NGHTTP2_HD_ENTRY_OVERHEAD int NGHTTP2_HD_ENTRY_OVERHEAD
ctypedef enum nghttp2_hd_side:
NGHTTP2_HD_SIDE_REQUEST
NGHTTP2_HD_SIDE_RESPONSE
ctypedef enum nghttp2_hd_flags: ctypedef enum nghttp2_hd_flags:
NGHTTP2_HD_FLAG_REFSET NGHTTP2_HD_FLAG_REFSET
...@@ -73,12 +69,9 @@ cdef extern from 'nghttp2_hd.h': ...@@ -73,12 +69,9 @@ cdef extern from 'nghttp2_hd.h':
nghttp2_hd_context ctx nghttp2_hd_context ctx
int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater, int nghttp2_hd_deflate_init2(nghttp2_hd_deflater *deflater,
nghttp2_hd_side side,
size_t deflate_hd_table_bufsize_max) size_t deflate_hd_table_bufsize_max)
int nghttp2_hd_inflate_init(nghttp2_hd_inflater *inflater, int nghttp2_hd_inflate_init(nghttp2_hd_inflater *inflater)
nghttp2_hd_side side)
void nghttp2_hd_deflate_free(nghttp2_hd_deflater *deflater) void nghttp2_hd_deflate_free(nghttp2_hd_deflater *deflater)
...@@ -87,8 +80,11 @@ cdef extern from 'nghttp2_hd.h': ...@@ -87,8 +80,11 @@ cdef extern from 'nghttp2_hd.h':
void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater, void nghttp2_hd_deflate_set_no_refset(nghttp2_hd_deflater *deflater,
uint8_t no_refset) uint8_t no_refset)
int nghttp2_hd_change_table_size(nghttp2_hd_context *context, int nghttp2_hd_deflate_change_table_size(nghttp2_hd_deflater *deflater,
size_t hd_table_bufsize_max) size_t hd_table_bufsize_max)
int nghttp2_hd_inflate_change_table_size(nghttp2_hd_inflater *inflater,
size_t hd_table_bufsize_max)
ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater, ssize_t nghttp2_hd_deflate_hd(nghttp2_hd_deflater *deflater,
uint8_t **buf_ptr, size_t *buflen_ptr, uint8_t **buf_ptr, size_t *buflen_ptr,
......
...@@ -13,12 +13,7 @@ from binascii import a2b_hex ...@@ -13,12 +13,7 @@ from binascii import a2b_hex
import nghttp2 import nghttp2
def testsuite(testdata): def testsuite(testdata):
if testdata['context'] == 'request': inflater = nghttp2.HDInflater()
side = nghttp2.HD_SIDE_REQUEST
else:
side = nghttp2.HD_SIDE_RESPONSE
inflater = nghttp2.HDInflater(side)
for casenum, item in enumerate(testdata['cases']): for casenum, item in enumerate(testdata['cases']):
if 'header_table_size' in item: if 'header_table_size' in item:
...@@ -47,7 +42,7 @@ def testsuite(testdata): ...@@ -47,7 +42,7 @@ def testsuite(testdata):
if __name__ == '__main__': if __name__ == '__main__':
for filename in sys.argv[1:]: for filename in sys.argv[1:]:
sys.stderr.write('{}\n'.format(filename)) sys.stderr.write('{}: '.format(filename))
with open(filename) as f: with open(filename) as f:
input = f.read() input = f.read()
testsuite(json.loads(input)) testsuite(json.loads(input))
...@@ -14,11 +14,6 @@ from binascii import b2a_hex ...@@ -14,11 +14,6 @@ from binascii import b2a_hex
import nghttp2 import nghttp2
def testsuite(testdata, filename, outdir, table_size, deflate_table_size): def testsuite(testdata, filename, outdir, table_size, deflate_table_size):
if testdata['context'] == 'request':
side = nghttp2.HD_SIDE_REQUEST
else:
side = nghttp2.HD_SIDE_RESPONSE
res = { res = {
'draft':5, 'context': testdata['context'], 'draft':5, 'context': testdata['context'],
'description': '''\ 'description': '''\
...@@ -29,7 +24,7 @@ original. We make some headers not indexing at all, but this does not always \ ...@@ -29,7 +24,7 @@ original. We make some headers not indexing at all, but this does not always \
result in less bits on the wire.''' result in less bits on the wire.'''
} }
cases = [] cases = []
deflater = nghttp2.HDDeflater(side, deflate_table_size) deflater = nghttp2.HDDeflater(deflate_table_size)
deflater.change_table_size(table_size) deflater.change_table_size(table_size)
for casenum, item in enumerate(testdata['cases']): for casenum, item in enumerate(testdata['cases']):
outitem = { outitem = {
......
...@@ -26,9 +26,6 @@ from libc.stdlib cimport malloc, free ...@@ -26,9 +26,6 @@ from libc.stdlib cimport malloc, free
from libc.string cimport memcpy, memset from libc.string cimport memcpy, memset
from libc.stdint cimport uint8_t, uint16_t, uint32_t, int32_t from libc.stdint cimport uint8_t, uint16_t, uint32_t, int32_t
HD_SIDE_REQUEST = cnghttp2.NGHTTP2_HD_SIDE_REQUEST
HD_SIDE_RESPONSE = cnghttp2.NGHTTP2_HD_SIDE_RESPONSE
HD_DEFLATE_HD_TABLE_BUFSIZE_MAX = 4096 HD_DEFLATE_HD_TABLE_BUFSIZE_MAX = 4096
HD_ENTRY_OVERHEAD = cnghttp2.NGHTTP2_HD_ENTRY_OVERHEAD HD_ENTRY_OVERHEAD = cnghttp2.NGHTTP2_HD_ENTRY_OVERHEAD
...@@ -45,12 +42,6 @@ class HDTableEntry: ...@@ -45,12 +42,6 @@ class HDTableEntry:
def space(self): def space(self):
return self.namelen + self.valuelen + HD_ENTRY_OVERHEAD return self.namelen + self.valuelen + HD_ENTRY_OVERHEAD
cdef _change_table_size(cnghttp2.nghttp2_hd_context *ctx, hd_table_bufsize_max):
cdef int rv
rv = cnghttp2.nghttp2_hd_change_table_size(ctx, hd_table_bufsize_max)
if rv != 0:
raise Exception(_strerror(rv))
cdef _get_hd_table(cnghttp2.nghttp2_hd_context *ctx): cdef _get_hd_table(cnghttp2.nghttp2_hd_context *ctx):
cdef int length = ctx.hd_table.len cdef int length = ctx.hd_table.len
cdef cnghttp2.nghttp2_hd_entry *entry cdef cnghttp2.nghttp2_hd_entry *entry
...@@ -65,35 +56,25 @@ cdef _get_hd_table(cnghttp2.nghttp2_hd_context *ctx): ...@@ -65,35 +56,25 @@ cdef _get_hd_table(cnghttp2.nghttp2_hd_context *ctx):
return res return res
cdef _get_pybytes(uint8_t *b, uint16_t blen): cdef _get_pybytes(uint8_t *b, uint16_t blen):
# While the |blen| is positive, the |b| could be NULL. This is return b[:blen]
# because deflater may deallocate the byte strings its local table
# space.
if b == NULL and blen > 0:
val = None
else:
val = b[:blen]
return val
cdef class HDDeflater: cdef class HDDeflater:
'''Performs header compression. The header compression algorithm has '''Performs header compression. The constructor takes
to know the header set to be compressed is request headers or |hd_table_bufsize_max| parameter, which limits the usage of header
response headers. It is indicated by |side| parameter in the table in the given amount of bytes. This is necessary because the
constructor. The constructor also takes |hd_table_bufsize_max| header compressor and decompressor has to share the same amount of
parameter, which limits the usage of header table in the given header table and the decompressor decides that number. The
amount of bytes. This is necessary because the header compressor compressor may not want to use all header table size because of
and decompressor has to share the same amount of header table and limited memory availability. In that case, the
the decompressor decides that number. The compressor may not want |hd_table_bufsize_max| can be used to cap the upper limit of table
to use all header table size because of limited memory size whatever the header table size is chosen by the decompressor.
availability. In that case, the |hd_table_bufsize_max| can be used The default value of |hd_table_bufsize_max| is 4096 bytes.
to cap the upper limit of talbe size whatever the header table
size is chosen. The default value of |hd_table_bufsize_max| is
4096 bytes.
The following example shows how to compress request header sets: The following example shows how to compress request header sets:
import binascii, nghttp2 import binascii, nghttp2
deflater = nghttp2.HDDeflater(nghttp2.HD_SIDE_REQUEST) deflater = nghttp2.HDDeflater()
res = deflater.deflate([(b'foo', b'bar'), res = deflater.deflate([(b'foo', b'bar'),
(b'baz', b'buz')]) (b'baz', b'buz')])
print(binascii.b2a_hex(res)) print(binascii.b2a_hex(res))
...@@ -102,17 +83,13 @@ cdef class HDDeflater: ...@@ -102,17 +83,13 @@ cdef class HDDeflater:
cdef cnghttp2.nghttp2_hd_deflater _deflater cdef cnghttp2.nghttp2_hd_deflater _deflater
def __cinit__(self, side, def __cinit__(self,
hd_table_bufsize_max = HD_DEFLATE_HD_TABLE_BUFSIZE_MAX): hd_table_bufsize_max = HD_DEFLATE_HD_TABLE_BUFSIZE_MAX):
rv = cnghttp2.nghttp2_hd_deflate_init2(&self._deflater, side, rv = cnghttp2.nghttp2_hd_deflate_init2(&self._deflater,
hd_table_bufsize_max) hd_table_bufsize_max)
if rv != 0: if rv != 0:
raise Exception(_strerror(rv)) raise Exception(_strerror(rv))
def __init__(self, side,
hd_table_bufsize_max = HD_DEFLATE_HD_TABLE_BUFSIZE_MAX):
super(HDDeflater, self).__init__()
def __dealloc__(self): def __dealloc__(self):
cnghttp2.nghttp2_hd_deflate_free(&self._deflater) cnghttp2.nghttp2_hd_deflate_free(&self._deflater)
...@@ -165,7 +142,11 @@ cdef class HDDeflater: ...@@ -165,7 +142,11 @@ cdef class HDDeflater:
An exception will be raised on error. An exception will be raised on error.
''' '''
_change_table_size(&self._deflater.ctx, hd_table_bufsize_max) cdef int rv
rv = cnghttp2.nghttp2_hd_deflate_change_table_size(&self._deflater,
hd_table_bufsize_max)
if rv != 0:
raise Exception(_strerror(rv))
def get_hd_table(self,): def get_hd_table(self,):
'''Returns copy of current dynamic header table.''' '''Returns copy of current dynamic header table.'''
...@@ -177,7 +158,7 @@ cdef class HDInflater: ...@@ -177,7 +158,7 @@ cdef class HDInflater:
The following example shows how to compress request header sets: The following example shows how to compress request header sets:
data = b'0082c5ad82bd0f000362617a0362757a' data = b'0082c5ad82bd0f000362617a0362757a'
inflater = nghttp2.HDInflater(nghttp2.HD_SIDE_REQUEST) inflater = nghttp2.HDInflater()
hdrs = inflater.inflate(data) hdrs = inflater.inflate(data)
print(hdrs) print(hdrs)
...@@ -185,14 +166,11 @@ cdef class HDInflater: ...@@ -185,14 +166,11 @@ cdef class HDInflater:
cdef cnghttp2.nghttp2_hd_inflater _inflater cdef cnghttp2.nghttp2_hd_inflater _inflater
def __cinit__(self, side): def __cinit__(self):
rv = cnghttp2.nghttp2_hd_inflate_init(&self._inflater, side) rv = cnghttp2.nghttp2_hd_inflate_init(&self._inflater)
if rv != 0: if rv != 0:
raise Exception(_strerror(rv)) raise Exception(_strerror(rv))
def __init__(self, side):
super(HDInflater, self).__init__()
def __dealloc__(self): def __dealloc__(self):
cnghttp2.nghttp2_hd_inflate_free(&self._inflater) cnghttp2.nghttp2_hd_inflate_free(&self._inflater)
...@@ -231,7 +209,11 @@ cdef class HDInflater: ...@@ -231,7 +209,11 @@ cdef class HDInflater:
An exception will be raised on error. An exception will be raised on error.
''' '''
_change_table_size(&self._inflater.ctx, hd_table_bufsize_max) cdef int rv
rv = cnghttp2.nghttp2_hd_inflate_change_table_size(&self._inflater,
hd_table_bufsize_max)
if rv != 0:
raise Exception(_strerror(rv))
def get_hd_table(self): def get_hd_table(self):
'''Returns copy of current dynamic header table.''' '''Returns copy of current dynamic header table.'''
...@@ -255,5 +237,5 @@ def print_hd_table(hdtable): ...@@ -255,5 +237,5 @@ def print_hd_table(hdtable):
print('[{}] (s={}) (r={}) {}: {}'\ print('[{}] (s={}) (r={}) {}: {}'\
.format(idx, entry.space(), .format(idx, entry.space(),
'y' if entry.ref else 'n', 'y' if entry.ref else 'n',
'**DEALLOCATED**' if entry.name is None else entry.name.decode('utf-8'), entry.name.decode('utf-8'),
'**DEALLOCATED**' if entry.value is None else entry.value.decode('utf-8'))) entry.value.decode('utf-8')))
...@@ -27,11 +27,7 @@ ...@@ -27,11 +27,7 @@
static void dump_val(json_t *jent, const char *key, uint8_t *val, size_t len) static void dump_val(json_t *jent, const char *key, uint8_t *val, size_t len)
{ {
if(val == NULL && len > 0) { json_object_set_new(jent, key, json_pack("s#", val, len));
json_object_set_new(jent, key, json_string("**DEALLOCATED**"));
} else {
json_object_set_new(jent, key, json_pack("s#", val, len));
}
} }
json_t* dump_header_table(nghttp2_hd_context *context) json_t* dump_header_table(nghttp2_hd_context *context)
...@@ -58,12 +54,6 @@ json_t* dump_header_table(nghttp2_hd_context *context) ...@@ -58,12 +54,6 @@ json_t* dump_header_table(nghttp2_hd_context *context)
json_object_set_new(obj, "size", json_integer(context->hd_table_bufsize)); json_object_set_new(obj, "size", json_integer(context->hd_table_bufsize));
json_object_set_new(obj, "max_size", json_object_set_new(obj, "max_size",
json_integer(context->hd_table_bufsize_max)); json_integer(context->hd_table_bufsize_max));
if(context->role == NGHTTP2_HD_ROLE_DEFLATE) {
json_object_set_new(obj, "deflate_size",
json_integer(context->deflate_hd_table_bufsize));
json_object_set_new(obj, "max_deflate_size",
json_integer(context->deflate_hd_table_bufsize_max));
}
return obj; return obj;
} }
...@@ -93,13 +83,11 @@ json_t* dump_headers(const nghttp2_nv *nva, size_t nvlen) ...@@ -93,13 +83,11 @@ json_t* dump_headers(const nghttp2_nv *nva, size_t nvlen)
return headers; return headers;
} }
void output_json_header(int side) void output_json_header(void)
{ {
printf("{\n" printf("{\n"
" \"context\": \"%s\",\n"
" \"cases\":\n" " \"cases\":\n"
" [\n", " [\n");
(side == NGHTTP2_HD_SIDE_REQUEST ? "request" : "response"));
} }
void output_json_footer(void) void output_json_footer(void)
......
...@@ -40,7 +40,7 @@ json_t* dump_header(const uint8_t *name, size_t namelen, ...@@ -40,7 +40,7 @@ json_t* dump_header(const uint8_t *name, size_t namelen,
json_t* dump_headers(const nghttp2_nv *nva, size_t nvlen); json_t* dump_headers(const nghttp2_nv *nva, size_t nvlen);
void output_json_header(int side); void output_json_header(void);
void output_json_footer(void); void output_json_footer(void);
......
...@@ -44,7 +44,6 @@ ...@@ -44,7 +44,6 @@
typedef struct { typedef struct {
size_t table_size; size_t table_size;
size_t deflate_table_size; size_t deflate_table_size;
nghttp2_hd_side side;
int http1text; int http1text;
int dump_header_table; int dump_header_table;
int no_refset; int no_refset;
...@@ -174,11 +173,11 @@ static int deflate_hd_json(json_t *obj, nghttp2_hd_deflater *deflater, int seq) ...@@ -174,11 +173,11 @@ static int deflate_hd_json(json_t *obj, nghttp2_hd_deflater *deflater, int seq)
return 0; return 0;
} }
static void init_deflater(nghttp2_hd_deflater *deflater, nghttp2_hd_side side) static void init_deflater(nghttp2_hd_deflater *deflater)
{ {
nghttp2_hd_deflate_init2(deflater, side, config.deflate_table_size); nghttp2_hd_deflate_init2(deflater, config.deflate_table_size);
nghttp2_hd_deflate_set_no_refset(deflater, config.no_refset); nghttp2_hd_deflate_set_no_refset(deflater, config.no_refset);
nghttp2_hd_change_table_size(&deflater->ctx, config.table_size); nghttp2_hd_deflate_change_table_size(deflater, config.table_size);
} }
static void deinit_deflater(nghttp2_hd_deflater *deflater) static void deinit_deflater(nghttp2_hd_deflater *deflater)
...@@ -193,19 +192,12 @@ static int perform(void) ...@@ -193,19 +192,12 @@ static int perform(void)
json_error_t error; json_error_t error;
size_t len; size_t len;
nghttp2_hd_deflater deflater; nghttp2_hd_deflater deflater;
nghttp2_hd_side side;
json = json_loadf(stdin, 0, &error); json = json_loadf(stdin, 0, &error);
if(json == NULL) { if(json == NULL) {
fprintf(stderr, "JSON loading failed\n"); fprintf(stderr, "JSON loading failed\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(strcmp("request", json_string_value(json_object_get(json, "context")))
== 0) {
side = NGHTTP2_HD_SIDE_REQUEST;
} else {
side = NGHTTP2_HD_SIDE_RESPONSE;
}
cases = json_object_get(json, "cases"); cases = json_object_get(json, "cases");
if(cases == NULL) { if(cases == NULL) {
fprintf(stderr, "Missing 'cases' key in root object\n"); fprintf(stderr, "Missing 'cases' key in root object\n");
...@@ -215,8 +207,8 @@ static int perform(void) ...@@ -215,8 +207,8 @@ static int perform(void)
fprintf(stderr, "'cases' must be JSON array\n"); fprintf(stderr, "'cases' must be JSON array\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
init_deflater(&deflater, side); init_deflater(&deflater);
output_json_header(side); output_json_header();
len = json_array_size(cases); len = json_array_size(cases);
for(i = 0; i < len; ++i) { for(i = 0; i < len; ++i) {
json_t *obj = json_array_get(cases, i); json_t *obj = json_array_get(cases, i);
...@@ -244,8 +236,8 @@ static int perform_from_http1text(void) ...@@ -244,8 +236,8 @@ static int perform_from_http1text(void)
nghttp2_nv nva[256]; nghttp2_nv nva[256];
int seq = 0; int seq = 0;
nghttp2_hd_deflater deflater; nghttp2_hd_deflater deflater;
init_deflater(&deflater, config.side); init_deflater(&deflater);
output_json_header(config.side); output_json_header();
for(;;) { for(;;) {
size_t nvlen = 0; size_t nvlen = 0;
int end = 0; int end = 0;
...@@ -355,10 +347,6 @@ static void print_help(void) ...@@ -355,10 +347,6 @@ static void print_help(void)
"The output of this program can be used as input for inflatehd.\n" "The output of this program can be used as input for inflatehd.\n"
"\n" "\n"
"OPTIONS:\n" "OPTIONS:\n"
" -r, --response Use response compression context instead of\n"
" request if -t is used. For JSON input, it is\n"
" determined by inspecting \"context\" key in\n"
" root JSON object.\n"
" -t, --http1text Use HTTP/1 style header field text as input.\n" " -t, --http1text Use HTTP/1 style header field text as input.\n"
" Each header set is delimited by single empty\n" " Each header set is delimited by single empty\n"
" line.\n" " line.\n"
...@@ -377,7 +365,6 @@ static void print_help(void) ...@@ -377,7 +365,6 @@ static void print_help(void)
} }
static struct option long_options[] = { static struct option long_options[] = {
{"response", no_argument, NULL, 'r'},
{"http1text", no_argument, NULL, 't'}, {"http1text", no_argument, NULL, 't'},
{"table-size", required_argument, NULL, 's'}, {"table-size", required_argument, NULL, 's'},
{"deflate-table-size", required_argument, NULL, 'S'}, {"deflate-table-size", required_argument, NULL, 'S'},
...@@ -390,7 +377,6 @@ int main(int argc, char **argv) ...@@ -390,7 +377,6 @@ int main(int argc, char **argv)
{ {
char *end; char *end;
config.side = NGHTTP2_HD_SIDE_REQUEST;
config.table_size = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE; config.table_size = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE;
config.deflate_table_size = NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE; config.deflate_table_size = NGHTTP2_HD_DEFAULT_MAX_DEFLATE_BUFFER_SIZE;
config.http1text = 0; config.http1text = 0;
...@@ -398,15 +384,11 @@ int main(int argc, char **argv) ...@@ -398,15 +384,11 @@ int main(int argc, char **argv)
config.no_refset = 0; config.no_refset = 0;
while(1) { while(1) {
int option_index = 0; int option_index = 0;
int c = getopt_long(argc, argv, "S:cdhrs:t", long_options, &option_index); int c = getopt_long(argc, argv, "S:cdhs:t", long_options, &option_index);
if(c == -1) { if(c == -1) {
break; break;
} }
switch(c) { switch(c) {
case 'r':
/* --response */
config.side = NGHTTP2_HD_SIDE_RESPONSE;
break;
case 'h': case 'h':
print_help(); print_help();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
......
...@@ -42,7 +42,6 @@ ...@@ -42,7 +42,6 @@
#include "comp_helper.h" #include "comp_helper.h"
typedef struct { typedef struct {
size_t table_size;
int dump_header_table; int dump_header_table;
} inflate_config; } inflate_config;
...@@ -110,8 +109,8 @@ static int inflate_hd(json_t *obj, nghttp2_hd_inflater *inflater, int seq) ...@@ -110,8 +109,8 @@ static int inflate_hd(json_t *obj, nghttp2_hd_inflater *inflater, int seq)
seq); seq);
return -1; return -1;
} }
rv = nghttp2_hd_change_table_size(&inflater->ctx, rv = nghttp2_hd_inflate_change_table_size(inflater,
json_integer_value(table_size)); json_integer_value(table_size));
if(rv != 0) { if(rv != 0) {
fprintf(stderr, fprintf(stderr,
"nghttp2_hd_change_table_size() failed with error %s at %d\n", "nghttp2_hd_change_table_size() failed with error %s at %d\n",
...@@ -163,19 +162,12 @@ static int perform(void) ...@@ -163,19 +162,12 @@ static int perform(void)
json_t *json, *cases; json_t *json, *cases;
json_error_t error; json_error_t error;
size_t len; size_t len;
nghttp2_hd_side side;
json = json_loadf(stdin, 0, &error); json = json_loadf(stdin, 0, &error);
if(json == NULL) { if(json == NULL) {
fprintf(stderr, "JSON loading failed\n"); fprintf(stderr, "JSON loading failed\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
if(strcmp("request", json_string_value(json_object_get(json, "context")))
== 0) {
side = NGHTTP2_HD_SIDE_REQUEST;
} else {
side = NGHTTP2_HD_SIDE_RESPONSE;
}
cases = json_object_get(json, "cases"); cases = json_object_get(json, "cases");
if(cases == NULL) { if(cases == NULL) {
fprintf(stderr, "Missing 'cases' key in root object\n"); fprintf(stderr, "Missing 'cases' key in root object\n");
...@@ -185,10 +177,8 @@ static int perform(void) ...@@ -185,10 +177,8 @@ static int perform(void)
fprintf(stderr, "'cases' must be JSON array\n"); fprintf(stderr, "'cases' must be JSON array\n");
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
} }
nghttp2_hd_inflate_init(&inflater, side); nghttp2_hd_inflate_init(&inflater);
nghttp2_hd_change_table_size(&inflater.ctx, config.table_size); output_json_header();
output_json_header(side);
len = json_array_size(cases); len = json_array_size(cases);
for(i = 0; i < len; ++i) { for(i = 0; i < len; ++i) {
json_t *obj = json_array_get(cases, i); json_t *obj = json_array_get(cases, i);
...@@ -241,29 +231,21 @@ static void print_help(void) ...@@ -241,29 +231,21 @@ static void print_help(void)
"The output of this program can be used as input for deflatehd.\n" "The output of this program can be used as input for deflatehd.\n"
"\n" "\n"
"OPTIONS:\n" "OPTIONS:\n"
" -s, --table-size=<N>\n"
" Set dynamic table size. In the HPACK\n"
" specification, this value is denoted by\n"
" SETTINGS_HEADER_TABLE_SIZE.\n"
" Default: 4096\n"
" -d, --dump-header-table\n" " -d, --dump-header-table\n"
" Output dynamic header table.\n"); " Output dynamic header table.\n");
} }
static struct option long_options[] = { static struct option long_options[] = {
{"table-size", required_argument, NULL, 's'},
{"dump-header-table", no_argument, NULL, 'd'}, {"dump-header-table", no_argument, NULL, 'd'},
{NULL, 0, NULL, 0 } {NULL, 0, NULL, 0 }
}; };
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
char *end;
config.table_size = NGHTTP2_HD_DEFAULT_MAX_BUFFER_SIZE;
config.dump_header_table = 0; config.dump_header_table = 0;
while(1) { while(1) {
int option_index = 0; int option_index = 0;
int c = getopt_long(argc, argv, "dhs:", long_options, &option_index); int c = getopt_long(argc, argv, "dh", long_options, &option_index);
if(c == -1) { if(c == -1) {
break; break;
} }
...@@ -271,15 +253,6 @@ int main(int argc, char **argv) ...@@ -271,15 +253,6 @@ int main(int argc, char **argv)
case 'h': case 'h':
print_help(); print_help();
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
case 's':
/* --table-size */
errno = 0;
config.table_size = strtoul(optarg, &end, 10);
if(errno == ERANGE || *end != '\0') {
fprintf(stderr, "-s: Bad option value\n");
exit(EXIT_FAILURE);
}
break;
case 'd': case 'd':
/* --dump-header-table */ /* --dump-header-table */
config.dump_header_table = 1; config.dump_header_table = 1;
......
...@@ -225,8 +225,6 @@ int main(int argc, char* argv[]) ...@@ -225,8 +225,6 @@ int main(int argc, char* argv[])
test_nghttp2_hd_deflate_same_indexed_repr) || test_nghttp2_hd_deflate_same_indexed_repr) ||
!CU_add_test(pSuite, "hd_deflate_common_header_eviction", !CU_add_test(pSuite, "hd_deflate_common_header_eviction",
test_nghttp2_hd_deflate_common_header_eviction) || test_nghttp2_hd_deflate_common_header_eviction) ||
!CU_add_test(pSuite, "hd_deflate_deflate_buffer",
test_nghttp2_hd_deflate_deflate_buffer) ||
!CU_add_test(pSuite, "hd_deflate_clear_refset", !CU_add_test(pSuite, "hd_deflate_clear_refset",
test_nghttp2_hd_deflate_clear_refset) || test_nghttp2_hd_deflate_clear_refset) ||
!CU_add_test(pSuite, "hd_inflate_indname_noinc", !CU_add_test(pSuite, "hd_inflate_indname_noinc",
......
...@@ -82,8 +82,8 @@ void test_nghttp2_frame_pack_headers() ...@@ -82,8 +82,8 @@ void test_nghttp2_frame_pack_headers()
ssize_t nv_offset; ssize_t nv_offset;
nva_out_init(&out); nva_out_init(&out);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_inflate_init(&inflater);
nva = headers(); nva = headers();
nvlen = HEADERS_LENGTH; nvlen = HEADERS_LENGTH;
...@@ -171,7 +171,7 @@ void test_nghttp2_frame_pack_headers_frame_too_large(void) ...@@ -171,7 +171,7 @@ void test_nghttp2_frame_pack_headers_frame_too_large(void)
} }
nvlen = nghttp2_nv_array_copy(&nva, big_hds, big_hdslen); nvlen = nghttp2_nv_array_copy(&nva, big_hds, big_hdslen);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nghttp2_frame_headers_init(&frame, nghttp2_frame_headers_init(&frame,
NGHTTP2_FLAG_END_STREAM|NGHTTP2_FLAG_END_HEADERS, NGHTTP2_FLAG_END_STREAM|NGHTTP2_FLAG_END_HEADERS,
1000000007, 1000000007,
...@@ -269,8 +269,8 @@ void test_nghttp2_frame_pack_push_promise() ...@@ -269,8 +269,8 @@ void test_nghttp2_frame_pack_push_promise()
nva_out out; nva_out out;
nva_out_init(&out); nva_out_init(&out);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_RESPONSE); nghttp2_hd_deflate_init(&deflater);
nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_RESPONSE); nghttp2_hd_inflate_init(&inflater);
nva = headers(); nva = headers();
nvlen = HEADERS_LENGTH; nvlen = HEADERS_LENGTH;
......
This diff is collapsed.
...@@ -28,7 +28,6 @@ ...@@ -28,7 +28,6 @@
void test_nghttp2_hd_deflate(void); void test_nghttp2_hd_deflate(void);
void test_nghttp2_hd_deflate_same_indexed_repr(void); void test_nghttp2_hd_deflate_same_indexed_repr(void);
void test_nghttp2_hd_deflate_common_header_eviction(void); void test_nghttp2_hd_deflate_common_header_eviction(void);
void test_nghttp2_hd_deflate_deflate_buffer(void);
void test_nghttp2_hd_deflate_clear_refset(void); void test_nghttp2_hd_deflate_clear_refset(void);
void test_nghttp2_hd_inflate_indname_noinc(void); void test_nghttp2_hd_inflate_indname_noinc(void);
void test_nghttp2_hd_inflate_indname_inc(void); void test_nghttp2_hd_inflate_indname_inc(void);
......
...@@ -363,7 +363,7 @@ void test_nghttp2_session_recv(void) ...@@ -363,7 +363,7 @@ void test_nghttp2_session_recv(void)
callbacks.on_frame_recv_callback = on_frame_recv_callback; callbacks.on_frame_recv_callback = on_frame_recv_callback;
user_data.df = &df; user_data.df = &df;
nghttp2_session_server_new(&session, &callbacks, &user_data); nghttp2_session_server_new(&session, &callbacks, &user_data);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nvlen = nghttp2_nv_array_copy(&nva, nv, ARRLEN(nv)); nvlen = nghttp2_nv_array_copy(&nva, nv, ARRLEN(nv));
nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS,
...@@ -446,7 +446,7 @@ void test_nghttp2_session_recv_invalid_stream_id(void) ...@@ -446,7 +446,7 @@ void test_nghttp2_session_recv_invalid_stream_id(void)
user_data.df = &df; user_data.df = &df;
user_data.invalid_frame_recv_cb_called = 0; user_data.invalid_frame_recv_cb_called = 0;
nghttp2_session_server_new(&session, &callbacks, &user_data); nghttp2_session_server_new(&session, &callbacks, &user_data);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, 2, nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, 2,
NGHTTP2_PRI_DEFAULT, NULL, 0); NGHTTP2_PRI_DEFAULT, NULL, 0);
...@@ -491,7 +491,7 @@ void test_nghttp2_session_recv_invalid_frame(void) ...@@ -491,7 +491,7 @@ void test_nghttp2_session_recv_invalid_frame(void)
user_data.df = &df; user_data.df = &df;
user_data.frame_send_cb_called = 0; user_data.frame_send_cb_called = 0;
nghttp2_session_server_new(&session, &callbacks, &user_data); nghttp2_session_server_new(&session, &callbacks, &user_data);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nvlen = nghttp2_nv_array_copy(&nva, nv, ARRLEN(nv)); nvlen = nghttp2_nv_array_copy(&nva, nv, ARRLEN(nv));
nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, 1, nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, 1,
NGHTTP2_PRI_DEFAULT, nva, nvlen); NGHTTP2_PRI_DEFAULT, nva, nvlen);
...@@ -690,7 +690,7 @@ void test_nghttp2_session_recv_continuation(void) ...@@ -690,7 +690,7 @@ void test_nghttp2_session_recv_continuation(void)
nghttp2_session_server_new(&session, &callbacks, &ud); nghttp2_session_server_new(&session, &callbacks, &ud);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
/* Make 1 HEADERS and insert CONTINUATION header */ /* Make 1 HEADERS and insert CONTINUATION header */
nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1)); nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1));
...@@ -746,7 +746,7 @@ void test_nghttp2_session_recv_continuation(void) ...@@ -746,7 +746,7 @@ void test_nghttp2_session_recv_continuation(void)
/* Expecting CONTINUATION, but get the other frame */ /* Expecting CONTINUATION, but get the other frame */
nghttp2_session_server_new(&session, &callbacks, &ud); nghttp2_session_server_new(&session, &callbacks, &ud);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
/* HEADERS without END_HEADERS flag */ /* HEADERS without END_HEADERS flag */
nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1)); nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1));
...@@ -803,7 +803,7 @@ void test_nghttp2_session_recv_premature_headers(void) ...@@ -803,7 +803,7 @@ void test_nghttp2_session_recv_premature_headers(void)
nghttp2_session_server_new(&session, &callbacks, &ud); nghttp2_session_server_new(&session, &callbacks, &ud);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1)); nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1));
nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS, nghttp2_frame_headers_init(&frame.headers, NGHTTP2_FLAG_END_HEADERS,
...@@ -867,7 +867,7 @@ void test_nghttp2_session_continue(void) ...@@ -867,7 +867,7 @@ void test_nghttp2_session_continue(void)
nghttp2_session_server_new(&session, &callbacks, &user_data); nghttp2_session_server_new(&session, &callbacks, &user_data);
nghttp2_hd_deflate_init(&deflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_deflate_init(&deflater);
/* Make 2 HEADERS frames */ /* Make 2 HEADERS frames */
nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1)); nvlen = nghttp2_nv_array_copy(&nva, nv1, ARRLEN(nv1));
...@@ -2255,7 +2255,7 @@ void test_nghttp2_submit_request_without_data(void) ...@@ -2255,7 +2255,7 @@ void test_nghttp2_submit_request_without_data(void)
callbacks.send_callback = accumulator_send_callback; callbacks.send_callback = accumulator_send_callback;
CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, &ud)); CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, &ud));
nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_inflate_init(&inflater);
CU_ASSERT(0 == nghttp2_submit_request(session, NGHTTP2_PRI_DEFAULT, CU_ASSERT(0 == nghttp2_submit_request(session, NGHTTP2_PRI_DEFAULT,
nva, ARRLEN(nva), &data_prd, NULL)); nva, ARRLEN(nva), &data_prd, NULL));
item = nghttp2_session_get_next_ob_item(session); item = nghttp2_session_get_next_ob_item(session);
...@@ -2327,7 +2327,7 @@ void test_nghttp2_submit_response_without_data(void) ...@@ -2327,7 +2327,7 @@ void test_nghttp2_submit_response_without_data(void)
callbacks.send_callback = accumulator_send_callback; callbacks.send_callback = accumulator_send_callback;
CU_ASSERT(0 == nghttp2_session_server_new(&session, &callbacks, &ud)); CU_ASSERT(0 == nghttp2_session_server_new(&session, &callbacks, &ud));
nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_RESPONSE); nghttp2_hd_inflate_init(&inflater);
nghttp2_session_open_stream(session, 1, NGHTTP2_FLAG_END_STREAM, nghttp2_session_open_stream(session, 1, NGHTTP2_FLAG_END_STREAM,
NGHTTP2_PRI_DEFAULT, NGHTTP2_PRI_DEFAULT,
NGHTTP2_STREAM_OPENING, NULL); NGHTTP2_STREAM_OPENING, NULL);
...@@ -2499,7 +2499,7 @@ void test_nghttp2_submit_headers(void) ...@@ -2499,7 +2499,7 @@ void test_nghttp2_submit_headers(void)
CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, &ud)); CU_ASSERT(0 == nghttp2_session_client_new(&session, &callbacks, &ud));
nghttp2_hd_inflate_init(&inflater, NGHTTP2_HD_SIDE_REQUEST); nghttp2_hd_inflate_init(&inflater);
CU_ASSERT(0 == nghttp2_submit_headers(session, CU_ASSERT(0 == nghttp2_submit_headers(session,
NGHTTP2_FLAG_END_STREAM, NGHTTP2_FLAG_END_STREAM,
1, NGHTTP2_PRI_DEFAULT, 1, NGHTTP2_PRI_DEFAULT,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment