Author: rhuijben
Date: Wed Nov 4 17:39:29 2015
New Revision: 1712595
URL: http://svn.apache.org/viewvc?rev=1712595&view=rev
Log:
Following up on r1712574, start applying one of the forms of header
compression: the hpack huffman encoding. In general this should remove
a few bytes from every header processed.
* buckets/hpack_buckets.c
(serialize): Store keys and values encoded if that takes less bytes.
Modified:
serf/trunk/buckets/hpack_buckets.c
Modified: serf/trunk/buckets/hpack_buckets.c
URL:
http://svn.apache.org/viewvc/serf/trunk/buckets/hpack_buckets.c?rev=1712595&r1=1712594&r2=1712595&view=diff
==============================================================================
--- serf/trunk/buckets/hpack_buckets.c (original)
+++ serf/trunk/buckets/hpack_buckets.c Wed Nov 4 17:39:29 2015
@@ -810,6 +810,7 @@ serialize(serf_bucket_t *bucket)
for (entry = ctx->first; entry; entry = next)
{
+ apr_status_t status;
apr_size_t len;
next = entry->next;
@@ -835,21 +836,68 @@ serialize(serf_bucket_t *bucket)
hpack_int(0x40, 6, 0, buffer+offset, &len);
offset += len;
- /* Name is literal, no huffman encoding */
- hpack_int(0, 7, entry->key_len, buffer+offset, &len);
- offset += len;
+ /* ### TODO: Check if we can refer key or key+value by index */
+
+ /* To huff or not... */
+ status = serf__hpack_huffman_encode(entry->key, entry->key_len,
+ 0, NULL, &len);
+ if (!status && len < entry->key_len)
+ {
+ apr_size_t int_len;
- memcpy(buffer + offset, entry->key, entry->key_len);
- offset += entry->key_len;
+ /* It is more efficient to huffman encode */
+ hpack_int(0x80, 7, len, buffer + offset, &int_len);
+ offset += int_len;
+
+ status = serf__hpack_huffman_encode(entry->key, entry->key_len,
+ len,
+ (void*)(buffer + offset), &len);
+ offset += len;
- /* Value is literal, no huffman encoding */
- hpack_int(0, 7, entry->value_len, buffer+offset, &len);
- offset += len;
+ if (status)
+ return status;
+ }
+ else
+ {
+ /* It is more efficient not to encode */
+ hpack_int(0, 7, entry->key_len, buffer + offset, &len);
+ offset += len;
+
+ memcpy(buffer + offset, entry->key, entry->key_len);
+ offset += entry->key_len;
+ }
- memcpy(buffer + offset, entry->value, entry->value_len);
- offset += entry->value_len;
+ /* To huff or not... */
+ status = serf__hpack_huffman_encode(entry->value, entry->value_len,
+ 0, NULL, &len);
+ if (!status && len < entry->key_len)
+ {
+ apr_size_t int_len;
+
+ /* It is more efficient to huffman encode */
+ hpack_int(0x80, 7, len, buffer + offset, &int_len);
+ offset += int_len;
+
+ status = serf__hpack_huffman_encode(entry->value, entry->value_len,
+ len,
+ (void*)(buffer + offset), &len);
+ offset += len;
+
+ if (status)
+ return status;
+ }
+ else
+ {
+ /* It is more efficient not to encode */
+ hpack_int(0, 7, entry->value_len, buffer + offset, &len);
+ offset += len;
+
+ memcpy(buffer + offset, entry->value, entry->value_len);
+ offset += entry->value_len;
+ }
- hpack_free_entry(entry, bucket->allocator);
+ /* And now free the item */
+ hpack_free_entry(entry, alloc);
}
ctx->first = ctx->last = NULL;