Author: rhuijben
Date: Thu Nov 19 17:18:49 2015
New Revision: 1715220

URL: http://svn.apache.org/viewvc?rev=1715220&view=rev
Log:
Simplify the hpack table state a bit by using the same variable as start
and first index. It appears the table is continuously updated instead of
only per full hpack blob.

This solves some weird header problems I found when testing with Subversion
over http/2.

* buckets/hpack_buckets.c
  (serf_hpack_table_t): Remove start and indexable values.
  (cleanup_hpack_table): Update init.
  (hpack_shrink_table): Remove start handling.
  (serf__hpack_table_set_max_table_size,
   hpack_table_size_update): Update caller.
  (hpack_table_get): Start looking from first.
  (hpack_process): Update caller.

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=1715220&r1=1715219&r2=1715220&view=diff
==============================================================================
--- serf/trunk/buckets/hpack_buckets.c (original)
+++ serf/trunk/buckets/hpack_buckets.c Thu Nov 19 17:18:49 2015
@@ -289,16 +289,14 @@ struct serf_hpack_table_t
     char send_tablesize_update;
 
     /* The local -> remote 'encoder' list */
-    serf_hpack_entry_t *lr_first, *lr_last, *lr_start;
-    unsigned int lr_count; /* Number of items (first..last) */
-    unsigned int lr_indexable; /* Number of items (start..last) */
+    serf_hpack_entry_t *lr_first, *lr_last;
+    unsigned int lr_count; /* Number of items */
     apr_size_t lr_size; /* 'Bytes' in list, calculated by HPACK_ENTRY_SIZE() */
     apr_size_t lr_max_table_size;
     apr_size_t lr_sys_table_size;
 
-    serf_hpack_entry_t *rl_first, *rl_last, *rl_start;
-    unsigned int rl_count; /* Number of items (first..last) */
-    unsigned int rl_indexable; /* Number of items (start..last) */
+    serf_hpack_entry_t *rl_first, *rl_last;
+    unsigned int rl_count; /* Number of items */
     apr_size_t rl_size; /* 'Bytes' in list, calculated by HPACK_ENTRY_SIZE() */
     apr_size_t rl_max_table_size;
     apr_size_t rl_sys_table_size;
@@ -392,7 +390,7 @@ cleanup_hpack_table(void *data)
 
         hpack_free_entry(hi, tbl->alloc);
     }
-    tbl->lr_first = tbl->lr_start = tbl->lr_last = NULL;
+    tbl->lr_first = tbl->lr_last = NULL;
     tbl->lr_size = 0;
 
     for (hi = tbl->rl_first; hi; hi = next)
@@ -401,7 +399,7 @@ cleanup_hpack_table(void *data)
 
         hpack_free_entry(hi, tbl->alloc);
     }
-    tbl->rl_first = tbl->rl_start = tbl->rl_last = NULL;
+    tbl->rl_first = tbl->rl_last = NULL;
     tbl->rl_size = 0;
 #endif
     return APR_SUCCESS;
@@ -444,7 +442,6 @@ serf__hpack_table_create(int for_http2,
 
 static void
 hpack_shrink_table(serf_hpack_entry_t **first,
-                   serf_hpack_entry_t **start,
                    serf_hpack_entry_t **last,
                    apr_size_t *size,
                    apr_size_t max_size,
@@ -456,8 +453,6 @@ hpack_shrink_table(serf_hpack_entry_t **
 
         *last = entry->prev;
 
-        if (start && (*start == entry))
-            *start = NULL;
         if (first && (*first == entry))
             *first = NULL;
 
@@ -489,7 +484,7 @@ serf__hpack_table_set_max_table_size(ser
         if (max_encoder_size < hpack_tbl->lr_max_table_size)
             hpack_tbl->send_tablesize_update = TRUE;
 
-        hpack_shrink_table(&hpack_tbl->lr_first, &hpack_tbl->lr_start,
+        hpack_shrink_table(&hpack_tbl->lr_first,
                            &hpack_tbl->lr_last, &hpack_tbl->lr_size,
                            hpack_tbl->lr_max_table_size, hpack_tbl->alloc);
     }
@@ -503,7 +498,7 @@ hpack_table_size_update(serf_hpack_table
     {
         hpack_tbl->rl_max_table_size = size;
 
-        hpack_shrink_table(&hpack_tbl->rl_first, &hpack_tbl->rl_start,
+        hpack_shrink_table(&hpack_tbl->rl_first,
                            &hpack_tbl->rl_last, &hpack_tbl->rl_size,
                            hpack_tbl->rl_max_table_size, hpack_tbl->alloc);
     }
@@ -533,7 +528,7 @@ hpack_table_get(apr_uint32_t v,
         serf_hpack_entry_t *i;
         v -= sizeof(hpack_static_table) / sizeof(hpack_static_table[0]);
 
-        for (i = tbl->rl_start; i; i = i->next)
+        for (i = tbl->rl_first; i; i = i->next)
         {
             if (!v)
             {
@@ -1152,10 +1147,6 @@ serf__bucket_hpack_decode_create(serf_bu
         ctx->agg = serf_bucket_aggregate_create(alloc);
     }
 
-  /* Prepare TBL for decoding */
-    ctx->tbl->rl_start = ctx->tbl->rl_first;
-    ctx->tbl->rl_indexable = ctx->tbl->rl_count;
-
     return serf_bucket_create(&serf_bucket_type__hpack_decode, alloc, ctx);
 }
 
@@ -1849,7 +1840,7 @@ hpack_process(serf_bucket_t *bucket)
             serf_hpack_table_t *tbl = ctx->tbl;
             ctx->hit_eof = TRUE;
 
-            hpack_shrink_table(&tbl->rl_first, &tbl->rl_start,
+            hpack_shrink_table(&tbl->rl_first,
                                &tbl->rl_last, &tbl->rl_size,
                                tbl->rl_max_table_size, tbl->alloc);
 


Reply via email to