Repository: trafficserver Updated Branches: refs/heads/master d3d903aa8 -> 713121065
TS-3963: Response headers are not completely transferred Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/71312106 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/71312106 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/71312106 Branch: refs/heads/master Commit: 713121065c8a6bcccc6fb6e51d49017a4daff8e5 Parents: d3d903a Author: Bryan Call <[email protected]> Authored: Wed Oct 28 14:51:56 2015 -0700 Committer: Bryan Call <[email protected]> Committed: Wed Oct 28 14:51:56 2015 -0700 ---------------------------------------------------------------------- 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/71312106/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/71312106/proxy/http2/HTTP2.cc ---------------------------------------------------------------------- diff --git a/proxy/http2/HTTP2.cc b/proxy/http2/HTTP2.cc index 79cd212..ef33e6b 100644 --- a/proxy/http2/HTTP2.cc +++ b/proxy/http2/HTTP2.cc @@ -536,7 +536,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 @@ -553,13 +553,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/71312106/proxy/http2/Http2ConnectionState.cc ---------------------------------------------------------------------- diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc index ce89046..283f8ed 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
