You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by sh...@apache.org on 2015/03/04 17:56:36 UTC
trafficserver git commit: TS-3415: H2 sending FIN stream too early
Repository: trafficserver
Updated Branches:
refs/heads/master 9f7cdf8d1 -> 789d2946c
TS-3415: H2 sending FIN stream too early
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo
Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/789d2946
Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/789d2946
Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/789d2946
Branch: refs/heads/master
Commit: 789d2946cb903bbf089b402fee34d65f71cecec7
Parents: 9f7cdf8
Author: Ryo Okubo <ro...@yahoo-corp.jp>
Authored: Wed Mar 4 10:49:34 2015 -0600
Committer: shinrich <sh...@yahoo-inc.com>
Committed: Wed Mar 4 10:55:29 2015 -0600
----------------------------------------------------------------------
CHANGES | 2 ++
proxy/http2/HTTP2.cc | 30 +++++++++++++-----------------
proxy/http2/HTTP2.h | 3 ---
proxy/http2/Http2ConnectionState.cc | 7 +++----
4 files changed, 18 insertions(+), 24 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/789d2946/CHANGES
----------------------------------------------------------------------
diff --git a/CHANGES b/CHANGES
index 93feb3b..005351a 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,6 +1,8 @@
-*- coding: utf-8 -*-
Changes with Apache Traffic Server 5.3.0
+ *) [TS-3415] Http/2 sending FIN stream too early.
+
*) [TS-3414] Add new TS API TSHttpTxnOutgoingAddrGet
*) [TS-3421] Add a "-t range" option for proxyauth plugin, which similar to
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/789d2946/proxy/http2/HTTP2.cc
----------------------------------------------------------------------
diff --git a/proxy/http2/HTTP2.cc b/proxy/http2/HTTP2.cc
index 5db603d..530186b 100644
--- a/proxy/http2/HTTP2.cc
+++ b/proxy/http2/HTTP2.cc
@@ -542,20 +542,6 @@ convert_from_2_to_1_1_header(HTTPHdr* headers)
return PARSE_DONE;
}
-void
-convert_headers_from_1_1_to_2(HTTPHdr* in)
-{
- // Intermediaries SHOULD also remove other connection-
- // specific header fields, such as Keep-Alive, Proxy-Connection,
- // Transfer-Encoding and Upgrade, even if they are not nominated by
- // Connection.
- in->field_delete(MIME_FIELD_CONNECTION, MIME_LEN_CONNECTION);
- in->field_delete(MIME_FIELD_KEEP_ALIVE, MIME_LEN_KEEP_ALIVE);
- in->field_delete(MIME_FIELD_PROXY_CONNECTION, MIME_LEN_PROXY_CONNECTION);
- in->field_delete(MIME_FIELD_TRANSFER_ENCODING, MIME_LEN_TRANSFER_ENCODING);
- in->field_delete(MIME_FIELD_UPGRADE, MIME_LEN_UPGRADE);
-}
-
int64_t
http2_write_psuedo_headers(HTTPHdr* in, uint8_t* out, uint64_t out_len, Http2DynamicTable& /* dynamic_table */)
{
@@ -615,7 +601,19 @@ http2_write_header_fragment(HTTPHdr* in, MIMEFieldIter& field_iter, uint8_t* out
// Set mime headers
cont = false;
- while (field) {
+ for (; field != NULL; field = in->iter_get_next(&field_iter)) {
+
+ // Intermediaries SHOULD remove connection-specific header fields.
+ int name_len;
+ const char* name = field->name_get(&name_len);
+ if ((name_len == MIME_LEN_CONNECTION && strncasecmp(name, MIME_FIELD_CONNECTION, name_len) == 0) ||
+ (name_len == MIME_LEN_KEEP_ALIVE && strncasecmp(name, MIME_FIELD_KEEP_ALIVE, name_len) == 0) ||
+ (name_len == MIME_LEN_PROXY_CONNECTION && strncasecmp(name, MIME_FIELD_PROXY_CONNECTION, name_len) == 0) ||
+ (name_len == MIME_LEN_TRANSFER_ENCODING && strncasecmp(name, MIME_FIELD_TRANSFER_ENCODING, name_len) == 0) ||
+ (name_len == MIME_LEN_UPGRADE && strncasecmp(name, MIME_FIELD_UPGRADE, name_len) == 0)) {
+ continue;
+ }
+
MIMEFieldIter current_iter = field_iter;
do {
MIMEFieldWrapper header(field, in->m_heap, in->m_http->m_fields_impl);
@@ -632,7 +630,6 @@ http2_write_header_fragment(HTTPHdr* in, MIMEFieldIter& field_iter, uint8_t* out
}
p += len;
} while (field->has_dups() && (field = field->m_next_dup) != NULL);
- field = in->iter_get_next(&field_iter);
}
// Parsing all headers is done
@@ -960,7 +957,6 @@ REGRESSION_TEST(HPACK_Encode)(RegressionTest * t, int, int *pstatus)
}
memset(buf, 0, BUFSIZE_FOR_REGRESSION_TEST);
- convert_headers_from_1_1_to_2(headers);
uint64_t buf_len = BUFSIZE_FOR_REGRESSION_TEST;
int64_t len = http2_write_psuedo_headers(headers, buf, buf_len, dynamic_table);
buf_len -= len;
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/789d2946/proxy/http2/HTTP2.h
----------------------------------------------------------------------
diff --git a/proxy/http2/HTTP2.h b/proxy/http2/HTTP2.h
index 555186d..da490fc 100644
--- a/proxy/http2/HTTP2.h
+++ b/proxy/http2/HTTP2.h
@@ -318,9 +318,6 @@ http2_parse_header_fragment(HTTPHdr *, IOVec, Http2DynamicTable&, bool);
MIMEParseResult
convert_from_2_to_1_1_header(HTTPHdr *);
-void
-convert_headers_from_1_1_to_2(HTTPHdr*);
-
int64_t
http2_write_psuedo_headers(HTTPHdr*, uint8_t*, uint64_t, Http2DynamicTable&);
http://git-wip-us.apache.org/repos/asf/trafficserver/blob/789d2946/proxy/http2/Http2ConnectionState.cc
----------------------------------------------------------------------
diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc
index 7f02c45..7f8ebbe 100644
--- a/proxy/http2/Http2ConnectionState.cc
+++ b/proxy/http2/Http2ConnectionState.cc
@@ -880,15 +880,14 @@ Http2ConnectionState::send_headers_frame(FetchSM *fetch_sm)
Http2Stream* stream = static_cast<Http2Stream*>(fetch_sm->ext_get_user_data());
HTTPHdr* resp_header = reinterpret_cast<HTTPHdr*>(fetch_sm->resp_hdr_bufp());
- // Convert header fields to HTTP/2 format
- convert_headers_from_1_1_to_2(resp_header);
-
// Write psuedo headers
payload_length += http2_write_psuedo_headers(resp_header, payload_buffer,
buf_len, *(this->remote_dynamic_table));
// If response body is empry, set END_STREAM flag to HEADERS frame
- if (resp_header->get_content_length() == 0) {
+ // Must check to ensure content-length is there. Otherwise the value defaults to 0
+ if (resp_header->presence(MIME_PRESENCE_CONTENT_LENGTH) &&
+ resp_header->get_content_length() == 0) {
flags |= HTTP2_FLAGS_HEADERS_END_STREAM;
}