You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by bc...@apache.org on 2015/11/20 01:43:04 UTC

trafficserver git commit: TS-3963: Response headers are not completely transferred

Repository: trafficserver
Updated Branches:
  refs/heads/6.0.x 2d4b9189e -> 13190b9e5


TS-3963: Response headers are not completely transferred

(cherry picked from commit 713121065c8a6bcccc6fb6e51d49017a4daff8e5)


Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/13190b9e
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/13190b9e
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/13190b9e

Branch: refs/heads/6.0.x
Commit: 13190b9e5f7660c759a9b08b74f1333a9290055c
Parents: 2d4b918
Author: Bryan Call <bc...@apache.org>
Authored: Wed Oct 28 14:51:56 2015 -0700
Committer: Bryan Call <bc...@apache.org>
Committed: Thu Nov 19 16:42:59 2015 -0800

----------------------------------------------------------------------
 proxy/hdrs/MIME.h                   | 16 ++++++++++++----
 proxy/http2/HTTP2.cc                |  8 +++++---
 proxy/http2/Http2ConnectionState.cc |  4 ++--
 3 files changed, 19 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/trafficserver/blob/13190b9e/proxy/hdrs/MIME.h
----------------------------------------------------------------------
diff --git a/proxy/hdrs/MIME.h b/proxy/hdrs/MIME.h
index 5ad5717..903bfc3 100644
--- a/proxy/hdrs/MIME.h
+++ b/proxy/hdrs/MIME.h
@@ -907,6 +907,7 @@ public:
   void field_delete(const char *name, int name_length);
 
   MIMEField *iter_get_first(MIMEFieldIter *iter);
+  MIMEField *iter_get(MIMEFieldIter *iter);
   MIMEField *iter_get_next(MIMEFieldIter *iter);
 
   uint64_t presence(uint64_t mask);
@@ -1143,17 +1144,17 @@ inline MIMEField *
 MIMEHdr::iter_get_first(MIMEFieldIter *iter)
 {
   iter->m_block = &m_mime->m_first_fblock;
-  iter->m_slot = (unsigned int)-1;
-  return iter_get_next(iter);
+  iter->m_slot = 0;
+  return iter_get(iter);
 }
 
 inline MIMEField *
-MIMEHdr::iter_get_next(MIMEFieldIter *iter)
+MIMEHdr::iter_get(MIMEFieldIter *iter)
 {
   MIMEField *f;
   MIMEFieldBlockImpl *b = iter->m_block;
 
-  int slot = iter->m_slot + 1;
+  int slot = iter->m_slot;
 
   while (b) {
     for (; slot < (int)b->m_freetop; slot++) {
@@ -1172,6 +1173,13 @@ MIMEHdr::iter_get_next(MIMEFieldIter *iter)
   return NULL;
 }
 
+inline MIMEField *
+MIMEHdr::iter_get_next(MIMEFieldIter *iter)
+{
+  iter->m_slot++;
+  return iter_get(iter);
+}
+
 /*-------------------------------------------------------------------------
   -------------------------------------------------------------------------*/
 

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/13190b9e/proxy/http2/HTTP2.cc
----------------------------------------------------------------------
diff --git a/proxy/http2/HTTP2.cc b/proxy/http2/HTTP2.cc
index 0929def..5108685 100644
--- a/proxy/http2/HTTP2.cc
+++ b/proxy/http2/HTTP2.cc
@@ -596,7 +596,7 @@ http2_write_header_fragment(HTTPHdr *in, MIMEFieldIter &field_iter, uint8_t *out
   if (!field_iter.m_block) {
     field = in->iter_get_first(&field_iter);
   } else {
-    field = in->iter_get_next(&field_iter);
+    field = in->iter_get(&field_iter);
   }
 
   // Set mime headers
@@ -613,13 +613,15 @@ http2_write_header_fragment(HTTPHdr *in, MIMEFieldIter &field_iter, uint8_t *out
       continue;
     }
 
-    MIMEFieldIter current_iter = field_iter;
     MIMEFieldWrapper header(field, in->m_heap, in->m_http->m_fields_impl);
     if ((len = encode_literal_header_field(p, end, header, HPACK_FIELD_INDEXED_LITERAL)) == -1) {
+      if (p == out) {
+        // no progress was made, header was too big for the buffer, skipping for now
+        continue;
+      }
       if (!cont) {
         // Parsing a part of headers is done
         cont = true;
-        field_iter = current_iter;
         return p - out;
       } else {
         // Parse error

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/13190b9e/proxy/http2/Http2ConnectionState.cc
----------------------------------------------------------------------
diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc
index a0fff63..634b145 100644
--- a/proxy/http2/Http2ConnectionState.cc
+++ b/proxy/http2/Http2ConnectionState.cc
@@ -34,7 +34,7 @@ typedef Http2Error (*http2_frame_dispatch)(Http2ClientSession &, Http2Connection
 
 static const int buffer_size_index[HTTP2_FRAME_TYPE_MAX] = {
   BUFFER_SIZE_INDEX_8K,  // HTTP2_FRAME_TYPE_DATA
-  BUFFER_SIZE_INDEX_4K,  // HTTP2_FRAME_TYPE_HEADERS
+  BUFFER_SIZE_INDEX_16K, // HTTP2_FRAME_TYPE_HEADERS
   -1,                    // HTTP2_FRAME_TYPE_PRIORITY
   BUFFER_SIZE_INDEX_128, // HTTP2_FRAME_TYPE_RST_STREAM
   BUFFER_SIZE_INDEX_128, // HTTP2_FRAME_TYPE_SETTINGS
@@ -42,7 +42,7 @@ static const int buffer_size_index[HTTP2_FRAME_TYPE_MAX] = {
   BUFFER_SIZE_INDEX_128, // HTTP2_FRAME_TYPE_PING
   BUFFER_SIZE_INDEX_128, // HTTP2_FRAME_TYPE_GOAWAY
   BUFFER_SIZE_INDEX_128, // HTTP2_FRAME_TYPE_WINDOW_UPDATE
-  BUFFER_SIZE_INDEX_4K,  // HTTP2_FRAME_TYPE_CONTINUATION
+  BUFFER_SIZE_INDEX_16K, // HTTP2_FRAME_TYPE_CONTINUATION
 };
 
 inline static unsigned