| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/http/http_network_transaction.h" | 5 #include "net/http/http_network_transaction.h" |
| 6 | 6 |
| 7 #include <set> | 7 #include <set> |
| 8 #include <vector> | 8 #include <vector> |
| 9 | 9 |
| 10 #include "base/bind.h" |
| 11 #include "base/bind_helpers.h" |
| 10 #include "base/compiler_specific.h" | 12 #include "base/compiler_specific.h" |
| 11 #include "base/format_macros.h" | 13 #include "base/format_macros.h" |
| 12 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 13 #include "base/metrics/field_trial.h" | 15 #include "base/metrics/field_trial.h" |
| 14 #include "base/metrics/histogram.h" | 16 #include "base/metrics/histogram.h" |
| 15 #include "base/metrics/stats_counters.h" | 17 #include "base/metrics/stats_counters.h" |
| 16 #include "base/stl_util.h" | 18 #include "base/stl_util.h" |
| 17 #include "base/string_number_conversions.h" | 19 #include "base/string_number_conversions.h" |
| 18 #include "base/string_util.h" | 20 #include "base/string_util.h" |
| 19 #include "base/stringprintf.h" | 21 #include "base/stringprintf.h" |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 return false; | 91 return false; |
| 90 } | 92 } |
| 91 } | 93 } |
| 92 | 94 |
| 93 } // namespace | 95 } // namespace |
| 94 | 96 |
| 95 //----------------------------------------------------------------------------- | 97 //----------------------------------------------------------------------------- |
| 96 | 98 |
| 97 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) | 99 HttpNetworkTransaction::HttpNetworkTransaction(HttpNetworkSession* session) |
| 98 : pending_auth_target_(HttpAuth::AUTH_NONE), | 100 : pending_auth_target_(HttpAuth::AUTH_NONE), |
| 99 ALLOW_THIS_IN_INITIALIZER_LIST( | 101 ALLOW_THIS_IN_INITIALIZER_LIST(io_callback_( |
| 100 io_callback_(this, &HttpNetworkTransaction::OnIOComplete)), | 102 base::Bind(&HttpNetworkTransaction::OnIOComplete, |
| 101 user_callback_(NULL), | 103 base::Unretained(this)))), |
| 102 session_(session), | 104 session_(session), |
| 103 request_(NULL), | 105 request_(NULL), |
| 104 headers_valid_(false), | 106 headers_valid_(false), |
| 105 logged_response_time_(false), | 107 logged_response_time_(false), |
| 106 request_headers_(), | 108 request_headers_(), |
| 107 read_buf_len_(0), | 109 read_buf_len_(0), |
| 108 next_state_(STATE_NONE), | 110 next_state_(STATE_NONE), |
| 109 establishing_tunnel_(false) { | 111 establishing_tunnel_(false) { |
| 110 session->ssl_config_service()->GetSSLConfig(&server_ssl_config_); | 112 session->ssl_config_service()->GetSSLConfig(&server_ssl_config_); |
| 111 if (session->http_stream_factory()->has_next_protos()) { | 113 if (session->http_stream_factory()->has_next_protos()) { |
| (...skipping 25 matching lines...) Expand all Loading... |
| 137 } else { | 139 } else { |
| 138 // Otherwise, we try to drain the response body. | 140 // Otherwise, we try to drain the response body. |
| 139 HttpStream* stream = stream_.release(); | 141 HttpStream* stream = stream_.release(); |
| 140 stream->Drain(session_); | 142 stream->Drain(session_); |
| 141 } | 143 } |
| 142 } | 144 } |
| 143 } | 145 } |
| 144 } | 146 } |
| 145 | 147 |
| 146 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, | 148 int HttpNetworkTransaction::Start(const HttpRequestInfo* request_info, |
| 147 OldCompletionCallback* callback, | 149 const CompletionCallback& callback, |
| 148 const BoundNetLog& net_log) { | 150 const BoundNetLog& net_log) { |
| 149 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); | 151 SIMPLE_STATS_COUNTER("HttpNetworkTransaction.Count"); |
| 150 | 152 |
| 151 net_log_ = net_log; | 153 net_log_ = net_log; |
| 152 request_ = request_info; | 154 request_ = request_info; |
| 153 start_time_ = base::Time::Now(); | 155 start_time_ = base::Time::Now(); |
| 154 | 156 |
| 155 if (request_->load_flags & LOAD_DISABLE_CERT_REVOCATION_CHECKING) { | 157 if (request_->load_flags & LOAD_DISABLE_CERT_REVOCATION_CHECKING) { |
| 156 server_ssl_config_.rev_checking_enabled = false; | 158 server_ssl_config_.rev_checking_enabled = false; |
| 157 proxy_ssl_config_.rev_checking_enabled = false; | 159 proxy_ssl_config_.rev_checking_enabled = false; |
| 158 } | 160 } |
| 159 | 161 |
| 160 next_state_ = STATE_CREATE_STREAM; | 162 next_state_ = STATE_CREATE_STREAM; |
| 161 int rv = DoLoop(OK); | 163 int rv = DoLoop(OK); |
| 162 if (rv == ERR_IO_PENDING) | 164 if (rv == ERR_IO_PENDING) |
| 163 user_callback_ = callback; | 165 callback_ = callback; |
| 164 return rv; | 166 return rv; |
| 165 } | 167 } |
| 166 | 168 |
| 167 int HttpNetworkTransaction::RestartIgnoringLastError( | 169 int HttpNetworkTransaction::RestartIgnoringLastError( |
| 168 OldCompletionCallback* callback) { | 170 const CompletionCallback& callback) { |
| 169 DCHECK(!stream_.get()); | 171 DCHECK(!stream_.get()); |
| 170 DCHECK(!stream_request_.get()); | 172 DCHECK(!stream_request_.get()); |
| 171 DCHECK_EQ(STATE_NONE, next_state_); | 173 DCHECK_EQ(STATE_NONE, next_state_); |
| 172 | 174 |
| 173 next_state_ = STATE_CREATE_STREAM; | 175 next_state_ = STATE_CREATE_STREAM; |
| 174 | 176 |
| 175 int rv = DoLoop(OK); | 177 int rv = DoLoop(OK); |
| 176 if (rv == ERR_IO_PENDING) | 178 if (rv == ERR_IO_PENDING) |
| 177 user_callback_ = callback; | 179 callback_ = callback; |
| 178 return rv; | 180 return rv; |
| 179 } | 181 } |
| 180 | 182 |
| 181 int HttpNetworkTransaction::RestartWithCertificate( | 183 int HttpNetworkTransaction::RestartWithCertificate( |
| 182 X509Certificate* client_cert, | 184 X509Certificate* client_cert, const CompletionCallback& callback) { |
| 183 OldCompletionCallback* callback) { | |
| 184 // In HandleCertificateRequest(), we always tear down existing stream | 185 // In HandleCertificateRequest(), we always tear down existing stream |
| 185 // requests to force a new connection. So we shouldn't have one here. | 186 // requests to force a new connection. So we shouldn't have one here. |
| 186 DCHECK(!stream_request_.get()); | 187 DCHECK(!stream_request_.get()); |
| 187 DCHECK(!stream_.get()); | 188 DCHECK(!stream_.get()); |
| 188 DCHECK_EQ(STATE_NONE, next_state_); | 189 DCHECK_EQ(STATE_NONE, next_state_); |
| 189 | 190 |
| 190 SSLConfig* ssl_config = response_.cert_request_info->is_proxy ? | 191 SSLConfig* ssl_config = response_.cert_request_info->is_proxy ? |
| 191 &proxy_ssl_config_ : &server_ssl_config_; | 192 &proxy_ssl_config_ : &server_ssl_config_; |
| 192 ssl_config->send_client_cert = true; | 193 ssl_config->send_client_cert = true; |
| 193 ssl_config->client_cert = client_cert; | 194 ssl_config->client_cert = client_cert; |
| 194 session_->ssl_client_auth_cache()->Add( | 195 session_->ssl_client_auth_cache()->Add( |
| 195 response_.cert_request_info->host_and_port, client_cert); | 196 response_.cert_request_info->host_and_port, client_cert); |
| 196 // Reset the other member variables. | 197 // Reset the other member variables. |
| 197 // Note: this is necessary only with SSL renegotiation. | 198 // Note: this is necessary only with SSL renegotiation. |
| 198 ResetStateForRestart(); | 199 ResetStateForRestart(); |
| 199 next_state_ = STATE_CREATE_STREAM; | 200 next_state_ = STATE_CREATE_STREAM; |
| 200 int rv = DoLoop(OK); | 201 int rv = DoLoop(OK); |
| 201 if (rv == ERR_IO_PENDING) | 202 if (rv == ERR_IO_PENDING) |
| 202 user_callback_ = callback; | 203 callback_ = callback; |
| 203 return rv; | 204 return rv; |
| 204 } | 205 } |
| 205 | 206 |
| 206 int HttpNetworkTransaction::RestartWithAuth(const AuthCredentials& credentials, | 207 int HttpNetworkTransaction::RestartWithAuth( |
| 207 OldCompletionCallback* callback) { | 208 const AuthCredentials& credentials, const CompletionCallback& callback) { |
| 208 HttpAuth::Target target = pending_auth_target_; | 209 HttpAuth::Target target = pending_auth_target_; |
| 209 if (target == HttpAuth::AUTH_NONE) { | 210 if (target == HttpAuth::AUTH_NONE) { |
| 210 NOTREACHED(); | 211 NOTREACHED(); |
| 211 return ERR_UNEXPECTED; | 212 return ERR_UNEXPECTED; |
| 212 } | 213 } |
| 213 pending_auth_target_ = HttpAuth::AUTH_NONE; | 214 pending_auth_target_ = HttpAuth::AUTH_NONE; |
| 214 | 215 |
| 215 auth_controllers_[target]->ResetAuth(credentials); | 216 auth_controllers_[target]->ResetAuth(credentials); |
| 216 | 217 |
| 217 DCHECK(user_callback_ == NULL); | 218 DCHECK(callback_.is_null()); |
| 218 | 219 |
| 219 int rv = OK; | 220 int rv = OK; |
| 220 if (target == HttpAuth::AUTH_PROXY && establishing_tunnel_) { | 221 if (target == HttpAuth::AUTH_PROXY && establishing_tunnel_) { |
| 221 // In this case, we've gathered credentials for use with proxy | 222 // In this case, we've gathered credentials for use with proxy |
| 222 // authentication of a tunnel. | 223 // authentication of a tunnel. |
| 223 DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_); | 224 DCHECK_EQ(STATE_CREATE_STREAM_COMPLETE, next_state_); |
| 224 DCHECK(stream_request_ != NULL); | 225 DCHECK(stream_request_ != NULL); |
| 225 auth_controllers_[target] = NULL; | 226 auth_controllers_[target] = NULL; |
| 226 ResetStateForRestart(); | 227 ResetStateForRestart(); |
| 227 rv = stream_request_->RestartTunnelWithProxyAuth(credentials); | 228 rv = stream_request_->RestartTunnelWithProxyAuth(credentials); |
| 228 } else { | 229 } else { |
| 229 // In this case, we've gathered credentials for the server or the proxy | 230 // In this case, we've gathered credentials for the server or the proxy |
| 230 // but it is not during the tunneling phase. | 231 // but it is not during the tunneling phase. |
| 231 DCHECK(stream_request_ == NULL); | 232 DCHECK(stream_request_ == NULL); |
| 232 PrepareForAuthRestart(target); | 233 PrepareForAuthRestart(target); |
| 233 rv = DoLoop(OK); | 234 rv = DoLoop(OK); |
| 234 } | 235 } |
| 235 | 236 |
| 236 if (rv == ERR_IO_PENDING) | 237 if (rv == ERR_IO_PENDING) |
| 237 user_callback_ = callback; | 238 callback_ = callback; |
| 238 return rv; | 239 return rv; |
| 239 } | 240 } |
| 240 | 241 |
| 241 void HttpNetworkTransaction::PrepareForAuthRestart(HttpAuth::Target target) { | 242 void HttpNetworkTransaction::PrepareForAuthRestart(HttpAuth::Target target) { |
| 242 DCHECK(HaveAuth(target)); | 243 DCHECK(HaveAuth(target)); |
| 243 DCHECK(!stream_request_.get()); | 244 DCHECK(!stream_request_.get()); |
| 244 | 245 |
| 245 bool keep_alive = false; | 246 bool keep_alive = false; |
| 246 // Even if the server says the connection is keep-alive, we have to be | 247 // Even if the server says the connection is keep-alive, we have to be |
| 247 // able to find the end of each response in order to reuse the connection. | 248 // able to find the end of each response in order to reuse the connection. |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 // Reset the other member variables. | 291 // Reset the other member variables. |
| 291 ResetStateForAuthRestart(); | 292 ResetStateForAuthRestart(); |
| 292 } | 293 } |
| 293 | 294 |
| 294 bool HttpNetworkTransaction::IsReadyToRestartForAuth() { | 295 bool HttpNetworkTransaction::IsReadyToRestartForAuth() { |
| 295 return pending_auth_target_ != HttpAuth::AUTH_NONE && | 296 return pending_auth_target_ != HttpAuth::AUTH_NONE && |
| 296 HaveAuth(pending_auth_target_); | 297 HaveAuth(pending_auth_target_); |
| 297 } | 298 } |
| 298 | 299 |
| 299 int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len, | 300 int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len, |
| 300 OldCompletionCallback* callback) { | 301 const CompletionCallback& callback) { |
| 301 DCHECK(buf); | 302 DCHECK(buf); |
| 302 DCHECK_LT(0, buf_len); | 303 DCHECK_LT(0, buf_len); |
| 303 | 304 |
| 304 State next_state = STATE_NONE; | 305 State next_state = STATE_NONE; |
| 305 | 306 |
| 306 scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders()); | 307 scoped_refptr<HttpResponseHeaders> headers(GetResponseHeaders()); |
| 307 if (headers_valid_ && headers.get() && stream_request_.get()) { | 308 if (headers_valid_ && headers.get() && stream_request_.get()) { |
| 308 // We're trying to read the body of the response but we're still trying | 309 // We're trying to read the body of the response but we're still trying |
| 309 // to establish an SSL tunnel through an HTTP proxy. We can't read these | 310 // to establish an SSL tunnel through an HTTP proxy. We can't read these |
| 310 // bytes when establishing a tunnel because they might be controlled by | 311 // bytes when establishing a tunnel because they might be controlled by |
| (...skipping 13 matching lines...) Expand all Loading... |
| 324 | 325 |
| 325 // Are we using SPDY or HTTP? | 326 // Are we using SPDY or HTTP? |
| 326 next_state = STATE_READ_BODY; | 327 next_state = STATE_READ_BODY; |
| 327 | 328 |
| 328 read_buf_ = buf; | 329 read_buf_ = buf; |
| 329 read_buf_len_ = buf_len; | 330 read_buf_len_ = buf_len; |
| 330 | 331 |
| 331 next_state_ = next_state; | 332 next_state_ = next_state; |
| 332 int rv = DoLoop(OK); | 333 int rv = DoLoop(OK); |
| 333 if (rv == ERR_IO_PENDING) | 334 if (rv == ERR_IO_PENDING) |
| 334 user_callback_ = callback; | 335 callback_ = callback; |
| 335 return rv; | 336 return rv; |
| 336 } | 337 } |
| 337 | 338 |
| 338 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { | 339 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { |
| 339 return ((headers_valid_ && response_.headers) || response_.ssl_info.cert || | 340 return ((headers_valid_ && response_.headers) || response_.ssl_info.cert || |
| 340 response_.cert_request_info) ? &response_ : NULL; | 341 response_.cert_request_info) ? &response_ : NULL; |
| 341 } | 342 } |
| 342 | 343 |
| 343 LoadState HttpNetworkTransaction::GetLoadState() const { | 344 LoadState HttpNetworkTransaction::GetLoadState() const { |
| 344 // TODO(wtc): Define a new LoadState value for the | 345 // TODO(wtc): Define a new LoadState value for the |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 460 stream_request_.reset(); // we're done with the stream request | 461 stream_request_.reset(); // we're done with the stream request |
| 461 OnIOComplete(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); | 462 OnIOComplete(ERR_HTTPS_PROXY_TUNNEL_RESPONSE); |
| 462 } | 463 } |
| 463 | 464 |
| 464 bool HttpNetworkTransaction::is_https_request() const { | 465 bool HttpNetworkTransaction::is_https_request() const { |
| 465 return request_->url.SchemeIs("https"); | 466 return request_->url.SchemeIs("https"); |
| 466 } | 467 } |
| 467 | 468 |
| 468 void HttpNetworkTransaction::DoCallback(int rv) { | 469 void HttpNetworkTransaction::DoCallback(int rv) { |
| 469 DCHECK_NE(rv, ERR_IO_PENDING); | 470 DCHECK_NE(rv, ERR_IO_PENDING); |
| 470 DCHECK(user_callback_); | 471 DCHECK(!callback_.is_null()); |
| 471 | 472 |
| 472 // Since Run may result in Read being called, clear user_callback_ up front. | 473 // Since Run may result in Read being called, clear user_callback_ up front. |
| 473 OldCompletionCallback* c = user_callback_; | 474 CompletionCallback c = callback_; |
| 474 user_callback_ = NULL; | 475 callback_.Reset(); |
| 475 c->Run(rv); | 476 c.Run(rv); |
| 476 } | 477 } |
| 477 | 478 |
| 478 void HttpNetworkTransaction::OnIOComplete(int result) { | 479 void HttpNetworkTransaction::OnIOComplete(int result) { |
| 479 int rv = DoLoop(result); | 480 int rv = DoLoop(result); |
| 480 if (rv != ERR_IO_PENDING) | 481 if (rv != ERR_IO_PENDING) |
| 481 DoCallback(rv); | 482 DoCallback(rv); |
| 482 } | 483 } |
| 483 | 484 |
| 484 int HttpNetworkTransaction::DoLoop(int result) { | 485 int HttpNetworkTransaction::DoLoop(int result) { |
| 485 DCHECK(next_state_ != STATE_NONE); | 486 DCHECK(next_state_ != STATE_NONE); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 606 result = HandleSSLHandshakeError(result); | 607 result = HandleSSLHandshakeError(result); |
| 607 | 608 |
| 608 // At this point we are done with the stream_request_. | 609 // At this point we are done with the stream_request_. |
| 609 stream_request_.reset(); | 610 stream_request_.reset(); |
| 610 return result; | 611 return result; |
| 611 } | 612 } |
| 612 | 613 |
| 613 int HttpNetworkTransaction::DoInitStream() { | 614 int HttpNetworkTransaction::DoInitStream() { |
| 614 DCHECK(stream_.get()); | 615 DCHECK(stream_.get()); |
| 615 next_state_ = STATE_INIT_STREAM_COMPLETE; | 616 next_state_ = STATE_INIT_STREAM_COMPLETE; |
| 616 return stream_->InitializeStream(request_, net_log_, &io_callback_); | 617 return stream_->InitializeStream(request_, net_log_, io_callback_); |
| 617 } | 618 } |
| 618 | 619 |
| 619 int HttpNetworkTransaction::DoInitStreamComplete(int result) { | 620 int HttpNetworkTransaction::DoInitStreamComplete(int result) { |
| 620 if (result == OK) { | 621 if (result == OK) { |
| 621 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; | 622 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN; |
| 622 } else { | 623 } else { |
| 623 if (result < 0) | 624 if (result < 0) |
| 624 result = HandleIOError(result); | 625 result = HandleIOError(result); |
| 625 | 626 |
| 626 // The stream initialization failed, so this stream will never be useful. | 627 // The stream initialization failed, so this stream will never be useful. |
| 627 stream_.reset(); | 628 stream_.reset(); |
| 628 } | 629 } |
| 629 | 630 |
| 630 return result; | 631 return result; |
| 631 } | 632 } |
| 632 | 633 |
| 633 int HttpNetworkTransaction::DoGenerateProxyAuthToken() { | 634 int HttpNetworkTransaction::DoGenerateProxyAuthToken() { |
| 634 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE; | 635 next_state_ = STATE_GENERATE_PROXY_AUTH_TOKEN_COMPLETE; |
| 635 if (!ShouldApplyProxyAuth()) | 636 if (!ShouldApplyProxyAuth()) |
| 636 return OK; | 637 return OK; |
| 637 HttpAuth::Target target = HttpAuth::AUTH_PROXY; | 638 HttpAuth::Target target = HttpAuth::AUTH_PROXY; |
| 638 if (!auth_controllers_[target].get()) | 639 if (!auth_controllers_[target].get()) |
| 639 auth_controllers_[target] = | 640 auth_controllers_[target] = |
| 640 new HttpAuthController(target, | 641 new HttpAuthController(target, |
| 641 AuthURL(target), | 642 AuthURL(target), |
| 642 session_->http_auth_cache(), | 643 session_->http_auth_cache(), |
| 643 session_->http_auth_handler_factory()); | 644 session_->http_auth_handler_factory()); |
| 644 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, | 645 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, |
| 645 &io_callback_, | 646 io_callback_, |
| 646 net_log_); | 647 net_log_); |
| 647 } | 648 } |
| 648 | 649 |
| 649 int HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete(int rv) { | 650 int HttpNetworkTransaction::DoGenerateProxyAuthTokenComplete(int rv) { |
| 650 DCHECK_NE(ERR_IO_PENDING, rv); | 651 DCHECK_NE(ERR_IO_PENDING, rv); |
| 651 if (rv == OK) | 652 if (rv == OK) |
| 652 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN; | 653 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN; |
| 653 return rv; | 654 return rv; |
| 654 } | 655 } |
| 655 | 656 |
| 656 int HttpNetworkTransaction::DoGenerateServerAuthToken() { | 657 int HttpNetworkTransaction::DoGenerateServerAuthToken() { |
| 657 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE; | 658 next_state_ = STATE_GENERATE_SERVER_AUTH_TOKEN_COMPLETE; |
| 658 HttpAuth::Target target = HttpAuth::AUTH_SERVER; | 659 HttpAuth::Target target = HttpAuth::AUTH_SERVER; |
| 659 if (!auth_controllers_[target].get()) | 660 if (!auth_controllers_[target].get()) |
| 660 auth_controllers_[target] = | 661 auth_controllers_[target] = |
| 661 new HttpAuthController(target, | 662 new HttpAuthController(target, |
| 662 AuthURL(target), | 663 AuthURL(target), |
| 663 session_->http_auth_cache(), | 664 session_->http_auth_cache(), |
| 664 session_->http_auth_handler_factory()); | 665 session_->http_auth_handler_factory()); |
| 665 if (!ShouldApplyServerAuth()) | 666 if (!ShouldApplyServerAuth()) |
| 666 return OK; | 667 return OK; |
| 667 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, | 668 return auth_controllers_[target]->MaybeGenerateAuthToken(request_, |
| 668 &io_callback_, | 669 io_callback_, |
| 669 net_log_); | 670 net_log_); |
| 670 } | 671 } |
| 671 | 672 |
| 672 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { | 673 int HttpNetworkTransaction::DoGenerateServerAuthTokenComplete(int rv) { |
| 673 DCHECK_NE(ERR_IO_PENDING, rv); | 674 DCHECK_NE(ERR_IO_PENDING, rv); |
| 674 if (rv == OK) | 675 if (rv == OK) |
| 675 next_state_ = STATE_BUILD_REQUEST; | 676 next_state_ = STATE_BUILD_REQUEST; |
| 676 return rv; | 677 return rv; |
| 677 } | 678 } |
| 678 | 679 |
| (...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 752 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { | 753 int HttpNetworkTransaction::DoBuildRequestComplete(int result) { |
| 753 if (result == OK) | 754 if (result == OK) |
| 754 next_state_ = STATE_SEND_REQUEST; | 755 next_state_ = STATE_SEND_REQUEST; |
| 755 return result; | 756 return result; |
| 756 } | 757 } |
| 757 | 758 |
| 758 int HttpNetworkTransaction::DoSendRequest() { | 759 int HttpNetworkTransaction::DoSendRequest() { |
| 759 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 760 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
| 760 | 761 |
| 761 return stream_->SendRequest( | 762 return stream_->SendRequest( |
| 762 request_headers_, request_body_.release(), &response_, &io_callback_); | 763 request_headers_, request_body_.release(), &response_, io_callback_); |
| 763 } | 764 } |
| 764 | 765 |
| 765 int HttpNetworkTransaction::DoSendRequestComplete(int result) { | 766 int HttpNetworkTransaction::DoSendRequestComplete(int result) { |
| 766 if (result < 0) | 767 if (result < 0) |
| 767 return HandleIOError(result); | 768 return HandleIOError(result); |
| 768 next_state_ = STATE_READ_HEADERS; | 769 next_state_ = STATE_READ_HEADERS; |
| 769 return OK; | 770 return OK; |
| 770 } | 771 } |
| 771 | 772 |
| 772 int HttpNetworkTransaction::DoReadHeaders() { | 773 int HttpNetworkTransaction::DoReadHeaders() { |
| 773 next_state_ = STATE_READ_HEADERS_COMPLETE; | 774 next_state_ = STATE_READ_HEADERS_COMPLETE; |
| 774 return stream_->ReadResponseHeaders(&io_callback_); | 775 return stream_->ReadResponseHeaders(io_callback_); |
| 775 } | 776 } |
| 776 | 777 |
| 777 int HttpNetworkTransaction::HandleConnectionClosedBeforeEndOfHeaders() { | 778 int HttpNetworkTransaction::HandleConnectionClosedBeforeEndOfHeaders() { |
| 778 if (!response_.headers && !stream_->IsConnectionReused()) { | 779 if (!response_.headers && !stream_->IsConnectionReused()) { |
| 779 // The connection was closed before any data was sent. Likely an error | 780 // The connection was closed before any data was sent. Likely an error |
| 780 // rather than empty HTTP/0.9 response. | 781 // rather than empty HTTP/0.9 response. |
| 781 return ERR_EMPTY_RESPONSE; | 782 return ERR_EMPTY_RESPONSE; |
| 782 } | 783 } |
| 783 | 784 |
| 784 return OK; | 785 return OK; |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 869 headers_valid_ = true; | 870 headers_valid_ = true; |
| 870 return OK; | 871 return OK; |
| 871 } | 872 } |
| 872 | 873 |
| 873 int HttpNetworkTransaction::DoReadBody() { | 874 int HttpNetworkTransaction::DoReadBody() { |
| 874 DCHECK(read_buf_); | 875 DCHECK(read_buf_); |
| 875 DCHECK_GT(read_buf_len_, 0); | 876 DCHECK_GT(read_buf_len_, 0); |
| 876 DCHECK(stream_ != NULL); | 877 DCHECK(stream_ != NULL); |
| 877 | 878 |
| 878 next_state_ = STATE_READ_BODY_COMPLETE; | 879 next_state_ = STATE_READ_BODY_COMPLETE; |
| 879 return stream_->ReadResponseBody(read_buf_, read_buf_len_, &io_callback_); | 880 return stream_->ReadResponseBody(read_buf_, read_buf_len_, io_callback_); |
| 880 } | 881 } |
| 881 | 882 |
| 882 int HttpNetworkTransaction::DoReadBodyComplete(int result) { | 883 int HttpNetworkTransaction::DoReadBodyComplete(int result) { |
| 883 // We are done with the Read call. | 884 // We are done with the Read call. |
| 884 bool done = false; | 885 bool done = false; |
| 885 if (result <= 0) { | 886 if (result <= 0) { |
| 886 DCHECK_NE(ERR_IO_PENDING, result); | 887 DCHECK_NE(ERR_IO_PENDING, result); |
| 887 done = true; | 888 done = true; |
| 888 } | 889 } |
| 889 | 890 |
| (...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1348 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, | 1349 description = base::StringPrintf("Unknown state 0x%08X (%u)", state, |
| 1349 state); | 1350 state); |
| 1350 break; | 1351 break; |
| 1351 } | 1352 } |
| 1352 return description; | 1353 return description; |
| 1353 } | 1354 } |
| 1354 | 1355 |
| 1355 #undef STATE_CASE | 1356 #undef STATE_CASE |
| 1356 | 1357 |
| 1357 } // namespace net | 1358 } // namespace net |
| OLD | NEW |