| 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));
|
| + }
|
| + 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);
|
|
|