summaryrefslogtreecommitdiffstats
path: root/net/http/http_network_transaction.cc
diff options
context:
space:
mode:
authorBen Murdoch <benm@google.com>2010-11-18 18:32:45 +0000
committerBen Murdoch <benm@google.com>2010-11-18 18:38:07 +0000
commit513209b27ff55e2841eac0e4120199c23acce758 (patch)
treeaeba30bb08c5f47c57003544e378a377c297eee6 /net/http/http_network_transaction.cc
parent164f7496de0fbee436b385a79ead9e3cb81a50c1 (diff)
downloadexternal_chromium-513209b27ff55e2841eac0e4120199c23acce758.zip
external_chromium-513209b27ff55e2841eac0e4120199c23acce758.tar.gz
external_chromium-513209b27ff55e2841eac0e4120199c23acce758.tar.bz2
Merge Chromium at r65505: Initial merge by git.
Change-Id: I31d8f1d8cd33caaf7f47ffa7350aef42d5fbdb45
Diffstat (limited to 'net/http/http_network_transaction.cc')
-rw-r--r--net/http/http_network_transaction.cc55
1 files changed, 22 insertions, 33 deletions
diff --git a/net/http/http_network_transaction.cc b/net/http/http_network_transaction.cc
index e0b9c39..bc2d322 100644
--- a/net/http/http_network_transaction.cc
+++ b/net/http/http_network_transaction.cc
@@ -89,6 +89,7 @@ HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session)
request_(NULL),
headers_valid_(false),
logged_response_time_(false),
+ request_headers_(),
read_buf_len_(0),
next_state_(STATE_NONE),
establishing_tunnel_(false) {
@@ -284,7 +285,7 @@ int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len,
State next_state = STATE_NONE;
- scoped_refptr<HttpResponseHeaders> headers = GetResponseHeaders();
+ scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders());
if (headers_valid_ && headers.get() && stream_request_.get()) {
// We're trying to read the body of the response but we're still trying
// to establish an SSL tunnel through the proxy. We can't read these
@@ -535,6 +536,8 @@ int HttpNetworkTransaction::DoCreateStreamComplete(int result) {
if (result == OK) {
next_state_ = STATE_INIT_STREAM;
DCHECK(stream_.get());
+ } else if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED) {
+ result = HandleCertificateRequest(result);
}
// At this point we are done with the stream_request_.
@@ -552,9 +555,6 @@ int HttpNetworkTransaction::DoInitStreamComplete(int result) {
if (result == OK) {
next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN;
} else {
- if (result == ERR_SSL_CLIENT_AUTH_CERT_NEEDED)
- result = HandleCertificateRequest(result);
-
if (result < 0)
result = HandleIOError(result);
@@ -624,38 +624,22 @@ int HttpNetworkTransaction::DoSendRequest() {
// This is constructed lazily (instead of within our Start method), so that
// we have proxy info available.
- if (request_headers_.empty() && !response_.was_fetched_via_spdy) {
+ if (request_headers_.IsEmpty()) {
bool using_proxy = (proxy_info_.is_http()|| proxy_info_.is_https()) &&
!is_https_request();
- const std::string path = using_proxy ?
- HttpUtil::SpecForRequest(request_->url) :
- HttpUtil::PathForRequest(request_->url);
- std::string request_line = base::StringPrintf(
- "%s %s HTTP/1.1\r\n", request_->method.c_str(), path.c_str());
-
- HttpRequestHeaders request_headers;
HttpUtil::BuildRequestHeaders(request_, request_body, auth_controllers_,
ShouldApplyServerAuth(),
ShouldApplyProxyAuth(), using_proxy,
- &request_headers);
+ &request_headers_);
if (session_->network_delegate())
- session_->network_delegate()->OnSendHttpRequest(&request_headers);
-
- if (net_log_.IsLoggingAllEvents()) {
- net_log_.AddEvent(
- NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS,
- new NetLogHttpRequestParameter(request_line, request_headers));
- }
-
- request_headers_ = request_line + request_headers.ToString();
- } else {
- if (net_log_.IsLoggingAllEvents()) {
- net_log_.AddEvent(
- NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS,
- new NetLogHttpRequestParameter(request_->url.spec(),
- request_->extra_headers));
- }
+ session_->network_delegate()->OnSendHttpRequest(&request_headers_);
+ }
+ if (net_log_.IsLoggingAllEvents()) {
+ net_log_.AddEvent(
+ NetLog::TYPE_HTTP_TRANSACTION_SEND_REQUEST_HEADERS,
+ make_scoped_refptr(new NetLogHttpRequestParameter(
+ request_->url.spec(), request_->extra_headers)));
}
headers_valid_ = false;
@@ -748,7 +732,7 @@ int HttpNetworkTransaction::DoReadHeadersComplete(int result) {
if (net_log_.IsLoggingAllEvents()) {
net_log_.AddEvent(
NetLog::TYPE_HTTP_TRANSACTION_READ_RESPONSE_HEADERS,
- new NetLogHttpResponseParameter(response_.headers));
+ make_scoped_refptr(new NetLogHttpResponseParameter(response_.headers)));
}
if (response_.headers->GetParsedHttpVersion() < HttpVersion(1, 0)) {
@@ -1050,7 +1034,7 @@ void HttpNetworkTransaction::ResetStateForAuthRestart() {
read_buf_ = NULL;
read_buf_len_ = 0;
headers_valid_ = false;
- request_headers_.clear();
+ request_headers_.Clear();
response_ = HttpResponseInfo();
establishing_tunnel_ = false;
}
@@ -1080,7 +1064,7 @@ void HttpNetworkTransaction::ResetConnectionAndRequestForResend() {
// We need to clear request_headers_ because it contains the real request
// headers, but we may need to resend the CONNECT request first to recreate
// the SSL tunnel.
- request_headers_.clear();
+ request_headers_.Clear();
next_state_ = STATE_CREATE_STREAM; // Resend the request.
}
@@ -1094,7 +1078,7 @@ bool HttpNetworkTransaction::ShouldApplyServerAuth() const {
}
int HttpNetworkTransaction::HandleAuthChallenge() {
- scoped_refptr<HttpResponseHeaders> headers = GetResponseHeaders();
+ scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders());
DCHECK(headers);
int status = headers->response_code();
@@ -1105,6 +1089,11 @@ int HttpNetworkTransaction::HandleAuthChallenge() {
if (target == HttpAuth::AUTH_PROXY && proxy_info_.is_direct())
return ERR_UNEXPECTED_PROXY_AUTH;
+ // This case can trigger when an HTTPS server responds with a 407 status
+ // code through a non-authenticating proxy.
+ if (!auth_controllers_[target].get())
+ return ERR_UNEXPECTED_PROXY_AUTH;
+
int rv = auth_controllers_[target]->HandleAuthChallenge(
headers, (request_->load_flags & LOAD_DO_NOT_SEND_AUTH_DATA) != 0, false,
net_log_);