Chromium Code Reviews| Index: net/tools/quic/spdy_utils.cc |
| diff --git a/net/tools/quic/spdy_utils.cc b/net/tools/quic/spdy_utils.cc |
| index 8fc5991d7441c93ef5f8b479af47d5f46bfbb64d..c2b61740d9f56238e35dab5a3e220250506a386f 100644 |
| --- a/net/tools/quic/spdy_utils.cc |
| +++ b/net/tools/quic/spdy_utils.cc |
| @@ -17,12 +17,15 @@ |
| #include "url/gurl.h" |
| using base::StringPiece; |
| +using std::make_pair; |
| using std::pair; |
| using std::string; |
| namespace net { |
| namespace tools { |
| +const char* const kV4Host = ":authority"; |
| + |
| const char* const kV3Host = ":host"; |
| const char* const kV3Path = ":path"; |
| const char* const kV3Scheme = ":scheme"; |
| @@ -83,6 +86,30 @@ void PopulateSpdy3RequestHeaderBlock(const BalsaHeaders& headers, |
| } |
| } |
| +void PopulateSpdy4RequestHeaderBlock(const BalsaHeaders& headers, |
| + const string& scheme, |
| + const string& host_and_port, |
| + const string& path, |
| + SpdyHeaderBlock* block) { |
| + PopulateSpdyHeaderBlock(headers, block, true); |
| + StringPiece host_header = headers.GetHeader("Host"); |
| + if (!host_header.empty()) { |
| + DCHECK(host_and_port.empty() || host_header == host_and_port); |
| + block->insert(make_pair(kV4Host, host_header.as_string())); |
| + // PopulateSpdyHeaderBlock already added the "host" header, |
| + // which is invalid for SPDY4. |
| + block->erase("host"); |
| + } else { |
| + block->insert(make_pair(kV4Host, host_and_port)); |
|
ramant (doing other things)
2015/01/13 01:35:47
rjshade: Is this right? Are we sending SPDY4 heade
rjshade
2015/01/13 15:22:36
See my other comment reply, but we aren't actually
|
| + } |
| + block->insert(make_pair(kV3Path, path)); |
| + block->insert(make_pair(kV3Scheme, scheme)); |
| + |
| + if (!headers.request_method().empty()) { |
| + block->insert(make_pair(kV3Method, headers.request_method().as_string())); |
| + } |
| +} |
| + |
| void PopulateSpdyResponseHeaderBlock(const BalsaHeaders& headers, |
| SpdyHeaderBlock* block) { |
| string status = headers.response_code().as_string(); |
| @@ -134,6 +161,43 @@ SpdyHeaderBlock SpdyUtils::RequestHeadersToSpdyHeaders( |
| } |
| // static |
| +SpdyHeaderBlock SpdyUtils::RequestHeadersToSpdy4Headers( |
| + const BalsaHeaders& request_headers) { |
| + string scheme; |
| + string host_and_port; |
| + string path; |
| + |
| + string url = request_headers.request_uri().as_string(); |
| + if (url.empty() || url[0] == '/') { |
| + path = url; |
| + } else { |
| + GURL request_uri(url); |
| + if (request_headers.request_method() == "CONNECT") { |
| + path = url; |
| + } else { |
| + path = request_uri.path(); |
| + if (!request_uri.query().empty()) { |
| + path = path + "?" + request_uri.query(); |
| + } |
| + host_and_port = request_uri.host(); |
| + scheme = request_uri.scheme(); |
| + } |
| + } |
| + |
| + DCHECK(!scheme.empty()); |
| + DCHECK(!host_and_port.empty()); |
| + DCHECK(!path.empty()); |
| + |
| + SpdyHeaderBlock block; |
| + PopulateSpdy4RequestHeaderBlock(request_headers, scheme, host_and_port, path, |
| + &block); |
| + if (block.find("host") != block.end()) { |
| + block.erase(block.find("host")); |
| + } |
| + return block; |
| +} |
| + |
| +// static |
| string SpdyUtils::SerializeRequestHeaders(const BalsaHeaders& request_headers) { |
| SpdyHeaderBlock block = RequestHeadersToSpdyHeaders(request_headers); |
| return SerializeUncompressedHeaders(block); |