Commit 5ca0cfa0 authored by Tatsuhiro Tsujikawa's avatar Tatsuhiro Tsujikawa

nghttp2_hd: Search hd table once

parent 12144acf
...@@ -912,43 +912,55 @@ static nghttp2_hd_entry* add_hd_table_incremental(nghttp2_hd_context *context, ...@@ -912,43 +912,55 @@ static nghttp2_hd_entry* add_hd_table_incremental(nghttp2_hd_context *context,
return new_ent; return new_ent;
} }
static ssize_t find_in_hd_table(nghttp2_hd_context *context, nghttp2_nv *nv) static int name_eq(const nghttp2_nv *a, const nghttp2_nv *b)
{ {
size_t i; return a->namelen == b->namelen && memcmp(a->name, b->name, a->namelen) == 0;
for(i = 0; i < context->deflate_hd_tablelen; ++i) {
nghttp2_hd_entry *ent = nghttp2_hd_ringbuf_get(&context->hd_table, i);
if(nghttp2_nv_equal(&ent->nv, nv)) {
return i;
}
}
for(i = 0; i < STATIC_TABLE_LENGTH; ++i) {
nghttp2_hd_entry *ent = &static_table[i];
if(nghttp2_nv_equal(&ent->nv, nv)) {
return context->hd_table.len + i;
}
}
return -1;
} }
static ssize_t find_name_in_hd_table(nghttp2_hd_context *context, static int value_eq(const nghttp2_nv *a, const nghttp2_nv *b)
{
return a->valuelen == b->valuelen &&
memcmp(a->value, b->value, a->valuelen) == 0;
}
typedef struct {
ssize_t index;
/* Nonzero if both name and value are matched. */
uint8_t name_value_match;
} search_result;
static search_result search_hd_table(nghttp2_hd_context *context,
nghttp2_nv *nv) nghttp2_nv *nv)
{ {
search_result res = { -1, 0 };
size_t i; size_t i;
for(i = 0; i < context->deflate_hd_tablelen; ++i) { for(i = 0; i < context->deflate_hd_tablelen; ++i) {
nghttp2_hd_entry *ent = nghttp2_hd_ringbuf_get(&context->hd_table, i); nghttp2_hd_entry *ent = nghttp2_hd_ringbuf_get(&context->hd_table, i);
if(ent->nv.namelen == nv->namelen && if(name_eq(&ent->nv, nv)) {
memcmp(ent->nv.name, nv->name, nv->namelen) == 0) { if(res.index == -1) {
return i; res.index = i;
}
if(value_eq(&ent->nv, nv)) {
res.index = i;
res.name_value_match = 1;
return res;
}
} }
} }
for(i = 0; i < STATIC_TABLE_LENGTH; ++i) { for(i = 0; i < STATIC_TABLE_LENGTH; ++i) {
nghttp2_hd_entry *ent = &static_table[i]; nghttp2_hd_entry *ent = &static_table[i];
if(ent->nv.namelen == nv->namelen && if(name_eq(&ent->nv, nv)) {
memcmp(ent->nv.name, nv->name, nv->namelen) == 0) { if(res.index == -1) {
return context->hd_table.len + i; res.index = context->hd_table.len + i;
}
if(value_eq(&ent->nv, nv)) {
res.index = context->hd_table.len + i;
res.name_value_match = 1;
return res;
}
} }
} }
return -1; return res;
} }
int nghttp2_hd_change_table_size(nghttp2_hd_context *context, int nghttp2_hd_change_table_size(nghttp2_hd_context *context,
...@@ -1033,9 +1045,10 @@ static int deflate_nv(nghttp2_hd_context *deflater, ...@@ -1033,9 +1045,10 @@ static int deflate_nv(nghttp2_hd_context *deflater,
{ {
int rv; int rv;
nghttp2_hd_entry *ent; nghttp2_hd_entry *ent;
rv = find_in_hd_table(deflater, nv); search_result res;
if(rv != -1) { res = search_hd_table(deflater, nv);
size_t index = rv; if(res.index != -1 && res.name_value_match) {
size_t index = res.index;
ent = nghttp2_hd_table_get(deflater, index); ent = nghttp2_hd_table_get(deflater, index);
if(index >= deflater->hd_table.len) { if(index >= deflater->hd_table.len) {
nghttp2_hd_entry *new_ent; nghttp2_hd_entry *new_ent;
...@@ -1102,9 +1115,8 @@ static int deflate_nv(nghttp2_hd_context *deflater, ...@@ -1102,9 +1115,8 @@ static int deflate_nv(nghttp2_hd_context *deflater,
} else { } else {
ssize_t index = -1; ssize_t index = -1;
int incidx = 0; int incidx = 0;
rv = find_name_in_hd_table(deflater, nv); if(res.index != -1) {
if(rv != -1) { index = res.index;
index = rv;
} }
if(should_indexing(nv) && if(should_indexing(nv) &&
entry_room(nv->namelen, nv->valuelen) <= NGHTTP2_HD_MAX_ENTRY_SIZE) { entry_room(nv->namelen, nv->valuelen) <= NGHTTP2_HD_MAX_ENTRY_SIZE) {
......
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