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;
 


Reply via email to