Chromium Code Reviews| Index: net/spdy/spdy_http_utils.cc |
| diff --git a/net/spdy/spdy_http_utils.cc b/net/spdy/spdy_http_utils.cc |
| index 448c82ffd3ca9a2fc06f947f706e6082c36f8956..edd42a4bb4dcea4521c1243e5eebddcb2491d182 100644 |
| --- a/net/spdy/spdy_http_utils.cc |
| +++ b/net/spdy/spdy_http_utils.cc |
| @@ -14,12 +14,25 @@ |
| #include "net/base/net_util.h" |
| #include "net/http/http_request_headers.h" |
| #include "net/http/http_request_info.h" |
| -#include "net/http/http_response_headers.h" |
| #include "net/http/http_response_info.h" |
| #include "net/http/http_util.h" |
| namespace net { |
| +namespace { |
| + |
| +void AddSpdyHeader(SpdyHeaderBlock* headers, |
|
wtc
2014/06/25 22:22:25
Nit: |headers| is an output parameter, so it shoul
dmziegler
2014/06/26 01:23:30
It's really an in-out parameter that is modified -
wtc
2014/06/26 21:23:16
Yes, I would list an in-out parameter after pure-i
|
| + const std::string& name, |
| + const std::string& value) { |
| + if (headers->find(name) == headers->end()) { |
| + (*headers)[name] = value; |
| + } else { |
| + (*headers)[name] += '\0' + value; |
|
wtc
2014/06/25 22:22:25
IMPORTANT: Is the use of '\0' correct? Are you usi
dmziegler
2014/06/26 01:23:29
Yes. I intentionally used '\0' and not "\0".
|
| + } |
| +} |
| + |
| +} // namespace |
| + |
| bool SpdyHeadersToHttpResponse(const SpdyHeaderBlock& headers, |
| SpdyMajorVersion protocol_version, |
| HttpResponseInfo* response) { |
| @@ -83,11 +96,35 @@ bool SpdyHeadersToHttpResponse(const SpdyHeaderBlock& headers, |
| return true; |
| } |
| +void CreateSpdyHeadersFromHttpResponse( |
| + scoped_refptr<HttpResponseHeaders> response_headers, |
| + SpdyMajorVersion protocol_version, |
| + SpdyHeaderBlock* headers) { |
| + std::string status_key = (protocol_version >= SPDY3) ? ":status" : "status"; |
| + std::string version_key = |
| + (protocol_version >= SPDY3) ? ":version" : "version"; |
| + |
| + std::string status_line = response_headers->GetStatusLine(); |
| + std::string::iterator after_version = |
|
wtc
2014/06/25 22:22:25
Use a const_iterator.
dmziegler
2014/06/26 01:23:30
Done.
|
| + std::find(status_line.begin(), status_line.end(), ' '); |
| + if (protocol_version < SPDY4) { |
|
wtc
2014/06/25 23:17:32
The internal version tests version <= SPDY3. I thi
dmziegler
2014/06/26 01:23:30
Okay. I am simply inverting SpdyHeadersToHttpRespo
|
| + (*headers)[version_key] = std::string(status_line.begin(), after_version); |
| + } |
| + (*headers)[status_key] = std::string(after_version + 1, status_line.end()); |
| + |
| + void* iter = NULL; |
| + std::string raw_name, value; |
| + while (response_headers->EnumerateHeaderLines(&iter, &raw_name, &value)) { |
| + std::string name = StringToLowerASCII(raw_name); |
| + AddSpdyHeader(headers, name, value); |
| + } |
| +} |
| + |
| void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info, |
| const HttpRequestHeaders& request_headers, |
| - SpdyHeaderBlock* headers, |
| SpdyMajorVersion protocol_version, |
| - bool direct) { |
| + bool direct, |
| + SpdyHeaderBlock* headers) { |
| HttpRequestHeaders::Iterator it(request_headers); |
| while (it.GetNext()) { |
| @@ -96,14 +133,7 @@ void CreateSpdyHeadersFromHttpRequest(const HttpRequestInfo& info, |
| name == "transfer-encoding" || name == "host") { |
| continue; |
| } |
| - if (headers->find(name) == headers->end()) { |
| - (*headers)[name] = it.value(); |
| - } else { |
| - std::string new_value = (*headers)[name]; |
| - new_value.append(1, '\0'); // +=() doesn't append 0's |
| - new_value += it.value(); |
| - (*headers)[name] = new_value; |
| - } |
| + AddSpdyHeader(headers, name, it.value()); |
| } |
| static const char kHttpProtocolVersion[] = "HTTP/1.1"; |