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;