diff options
-rw-r--r-- | chrome/browser/resources/net_internals/logviewpainter.js | 23 | ||||
-rw-r--r-- | net/base/net_log_event_type_list.h | 15 | ||||
-rw-r--r-- | net/http/http_network_transaction.cc | 40 | ||||
-rw-r--r-- | net/http/http_network_transaction_unittest.cc | 16 |
4 files changed, 92 insertions, 2 deletions
diff --git a/chrome/browser/resources/net_internals/logviewpainter.js b/chrome/browser/resources/net_internals/logviewpainter.js index 158339f..dd1e3d4 100644 --- a/chrome/browser/resources/net_internals/logviewpainter.js +++ b/chrome/browser/resources/net_internals/logviewpainter.js @@ -109,6 +109,10 @@ function getTextForExtraParams(entry) { case LogEventType.HTTP_TRANSACTION_SEND_TUNNEL_HEADERS: return getTextForRequestHeadersExtraParam(entry); + case LogEventType.HTTP_TRANSACTION_READ_RESPONSE_HEADERS: + case LogEventType.HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS: + return getTextForResponseHeadersExtraParam(entry); + default: var out = []; for (var k in entry.extra_parameters) { @@ -139,6 +143,25 @@ function getTextForRequestHeadersExtraParam(entry) { return out.join("\n"); } +function getTextForResponseHeadersExtraParam(entry) { + var headers = entry.extra_parameters.headers; + + // We prepend spaces to each line to make it line up with the arrow. + var firstLinePrefix = " --> " + var prefix = " "; + + var out = []; + + if (headers.length > 0) + out.push(firstLinePrefix + headers[0]) + + // Concatenate all the rest of the header lines. + for (var i = 1; i < headers.length; ++i) + out.push(prefix + headers[i]); + + return out.join("\n"); +} + function getTextForEvent(entry) { var text = ''; diff --git a/net/base/net_log_event_type_list.h b/net/base/net_log_event_type_list.h index 5d9e312..8fdcf80 100644 --- a/net/base/net_log_event_type_list.h +++ b/net/base/net_log_event_type_list.h @@ -321,6 +321,21 @@ EVENT_TYPE(HTTP_TRANSACTION_SEND_TUNNEL_HEADERS) // Measures the time to read HTTP response headers from the server. EVENT_TYPE(HTTP_TRANSACTION_READ_HEADERS) +// This event is sent on receipt of the HTTP response headers. +// The following parameters are attached: +// { +// "headers": <The list of header:value pairs> +// } +EVENT_TYPE(HTTP_TRANSACTION_READ_RESPONSE_HEADERS) + +// This event is sent on receipt of the HTTP response headers to a tunnel +// request. +// The following parameters are attached: +// { +// "headers": <The list of header:value pairs> +// } +EVENT_TYPE(HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS) + // Measures the time to resolve the canonical name for HTTP Negotiate // authentication scheme. EVENT_TYPE(HTTP_TRANSACTION_RESOLVE_CANONICAL_NAME) diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc index acb16ca..34a0027 100644 --- a/net/http/http_network_transaction.cc +++ b/net/http/http_network_transaction.cc @@ -238,6 +238,34 @@ class NetLogHttpRequestParameter : public NetLog::EventParameters { DISALLOW_COPY_AND_ASSIGN(NetLogHttpRequestParameter); }; +class NetLogHttpResponseParameter : public NetLog::EventParameters { + public: + explicit NetLogHttpResponseParameter( + const scoped_refptr<HttpResponseHeaders>& headers) + : headers_(headers) {} + + Value* ToValue() const { + DictionaryValue* dict = new DictionaryValue(); + ListValue* headers = new ListValue(); + void* iterator = NULL; + std::string name; + std::string value; + while (headers_->EnumerateHeaderLines(&iterator, &name, &value)) { + headers->Append( + new StringValue(StringPrintf("%s: %s", name.c_str(), value.c_str()))); + } + dict->Set(L"headers", headers); + return dict; + } + + private: + ~NetLogHttpResponseParameter() {} + + const scoped_refptr<HttpResponseHeaders> headers_; + + DISALLOW_COPY_AND_ASSIGN(NetLogHttpResponseParameter); +}; + } // namespace //----------------------------------------------------------------------------- @@ -1128,6 +1156,18 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) { return rv; } + if (net_log_.HasListener()) { + if (establishing_tunnel_) { + net_log_.AddEvent( + NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, + new NetLogHttpResponseParameter(response_.headers)); + } else { + net_log_.AddEvent( + NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS, + new NetLogHttpResponseParameter(response_.headers)); + } + } + if (response_.headers->GetParsedHttpVersion() < HttpVersion(1, 0)) { // Require the "HTTP/1.x" status line for SSL CONNECT. if (establishing_tunnel_) diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 5d343eb..6581201 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc @@ -172,9 +172,13 @@ class HttpNetworkTransactionTest : public PlatformTest { rv = ReadTransaction(trans.get(), &out.response_data); EXPECT_EQ(OK, rv); - ExpectLogContainsSomewhere( + size_t pos = ExpectLogContainsSomewhere( log.entries(), 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS, NetLog::PHASE_NONE); + ExpectLogContainsSomewhere( + log.entries(), pos, + NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS, + NetLog::PHASE_NONE); return out; } @@ -1285,11 +1289,19 @@ TEST_F(HttpNetworkTransactionTest, BasicAuthProxyKeepAlive) { TestCompletionCallback callback1; - int rv = trans->Start(&request, &callback1, BoundNetLog()); + CapturingBoundNetLog log(CapturingNetLog::kUnbounded); + int rv = trans->Start(&request, &callback1, log.bound()); EXPECT_EQ(ERR_IO_PENDING, rv); rv = callback1.WaitForResult(); EXPECT_EQ(OK, rv); + size_t pos = ExpectLogContainsSomewhere( + log.entries(), 0, NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, + NetLog::PHASE_NONE); + ExpectLogContainsSomewhere( + log.entries(), pos, + NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, + NetLog::PHASE_NONE); const HttpResponseInfo* response = trans->GetResponseInfo(); EXPECT_FALSE(response == NULL); |