OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "base/scoped_ptr.h" | 7 #include "base/scoped_ptr.h" |
8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
9 #include "base/field_trial.h" | 9 #include "base/field_trial.h" |
10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 if (rv == ERR_IO_PENDING) | 169 if (rv == ERR_IO_PENDING) |
170 user_callback_ = callback; | 170 user_callback_ = callback; |
171 return rv; | 171 return rv; |
172 } | 172 } |
173 | 173 |
174 int HttpNetworkTransaction::RestartIgnoringLastError( | 174 int HttpNetworkTransaction::RestartIgnoringLastError( |
175 CompletionCallback* callback) { | 175 CompletionCallback* callback) { |
176 if (connection_.socket()->IsConnected()) { | 176 if (connection_.socket()->IsConnected()) { |
177 next_state_ = STATE_WRITE_HEADERS; | 177 next_state_ = STATE_WRITE_HEADERS; |
178 } else { | 178 } else { |
179 connection_.socket()->Disconnect(); | 179 connection_.set_socket(NULL); |
180 connection_.Reset(); | 180 connection_.Reset(); |
181 next_state_ = STATE_INIT_CONNECTION; | 181 next_state_ = STATE_INIT_CONNECTION; |
182 } | 182 } |
183 int rv = DoLoop(OK); | 183 int rv = DoLoop(OK); |
184 if (rv == ERR_IO_PENDING) | 184 if (rv == ERR_IO_PENDING) |
185 user_callback_ = callback; | 185 user_callback_ = callback; |
186 return rv; | 186 return rv; |
187 } | 187 } |
188 | 188 |
189 int HttpNetworkTransaction::RestartWithAuth( | 189 int HttpNetworkTransaction::RestartWithAuth( |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
293 // the response body. | 293 // the response body. |
294 DidDrainBodyForAuthRestart(keep_alive); | 294 DidDrainBodyForAuthRestart(keep_alive); |
295 } | 295 } |
296 | 296 |
297 void HttpNetworkTransaction::DidDrainBodyForAuthRestart(bool keep_alive) { | 297 void HttpNetworkTransaction::DidDrainBodyForAuthRestart(bool keep_alive) { |
298 if (keep_alive) { | 298 if (keep_alive) { |
299 next_state_ = STATE_WRITE_HEADERS; | 299 next_state_ = STATE_WRITE_HEADERS; |
300 reused_socket_ = true; | 300 reused_socket_ = true; |
301 } else { | 301 } else { |
302 next_state_ = STATE_INIT_CONNECTION; | 302 next_state_ = STATE_INIT_CONNECTION; |
303 connection_.socket()->Disconnect(); | 303 connection_.set_socket(NULL); |
304 connection_.Reset(); | 304 connection_.Reset(); |
305 } | 305 } |
306 | 306 |
307 // Reset the other member variables. | 307 // Reset the other member variables. |
308 ResetStateForRestart(); | 308 ResetStateForRestart(); |
309 } | 309 } |
310 | 310 |
311 int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len, | 311 int HttpNetworkTransaction::Read(IOBuffer* buf, int buf_len, |
312 CompletionCallback* callback) { | 312 CompletionCallback* callback) { |
313 DCHECK(response_.headers); | 313 DCHECK(response_.headers); |
(...skipping 29 matching lines...) Expand all Loading... |
343 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { | 343 const HttpResponseInfo* HttpNetworkTransaction::GetResponseInfo() const { |
344 return (response_.headers || response_.ssl_info.cert) ? &response_ : NULL; | 344 return (response_.headers || response_.ssl_info.cert) ? &response_ : NULL; |
345 } | 345 } |
346 | 346 |
347 LoadState HttpNetworkTransaction::GetLoadState() const { | 347 LoadState HttpNetworkTransaction::GetLoadState() const { |
348 // TODO(wtc): Define a new LoadState value for the | 348 // TODO(wtc): Define a new LoadState value for the |
349 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request. | 349 // STATE_INIT_CONNECTION_COMPLETE state, which delays the HTTP request. |
350 switch (next_state_) { | 350 switch (next_state_) { |
351 case STATE_RESOLVE_PROXY_COMPLETE: | 351 case STATE_RESOLVE_PROXY_COMPLETE: |
352 return LOAD_STATE_RESOLVING_PROXY_FOR_URL; | 352 return LOAD_STATE_RESOLVING_PROXY_FOR_URL; |
353 case STATE_INIT_CONNECTION_COMPLETE: | 353 case STATE_RESOLVE_HOST_COMPLETE: |
354 return connection_.GetLoadState(); | 354 return LOAD_STATE_RESOLVING_HOST; |
| 355 case STATE_TCP_CONNECT_COMPLETE: |
| 356 return LOAD_STATE_CONNECTING; |
355 case STATE_WRITE_HEADERS_COMPLETE: | 357 case STATE_WRITE_HEADERS_COMPLETE: |
356 case STATE_WRITE_BODY_COMPLETE: | 358 case STATE_WRITE_BODY_COMPLETE: |
357 return LOAD_STATE_SENDING_REQUEST; | 359 return LOAD_STATE_SENDING_REQUEST; |
358 case STATE_READ_HEADERS_COMPLETE: | 360 case STATE_READ_HEADERS_COMPLETE: |
359 return LOAD_STATE_WAITING_FOR_RESPONSE; | 361 return LOAD_STATE_WAITING_FOR_RESPONSE; |
360 case STATE_READ_BODY_COMPLETE: | 362 case STATE_READ_BODY_COMPLETE: |
361 return LOAD_STATE_READING_RESPONSE; | 363 return LOAD_STATE_READING_RESPONSE; |
362 default: | 364 default: |
363 return LOAD_STATE_IDLE; | 365 return LOAD_STATE_IDLE; |
364 } | 366 } |
365 } | 367 } |
366 | 368 |
367 uint64 HttpNetworkTransaction::GetUploadProgress() const { | 369 uint64 HttpNetworkTransaction::GetUploadProgress() const { |
368 if (!request_body_stream_.get()) | 370 if (!request_body_stream_.get()) |
369 return 0; | 371 return 0; |
370 | 372 |
371 return request_body_stream_->position(); | 373 return request_body_stream_->position(); |
372 } | 374 } |
373 | 375 |
374 HttpNetworkTransaction::~HttpNetworkTransaction() { | 376 HttpNetworkTransaction::~HttpNetworkTransaction() { |
375 // If we still have an open socket, then make sure to disconnect it so we | 377 // If we still have an open socket, then make sure to close it so we don't |
376 // don't try to reuse it later on. | 378 // try to reuse it later on. |
377 if (connection_.is_initialized()) | 379 if (connection_.is_initialized()) |
378 connection_.socket()->Disconnect(); | 380 connection_.set_socket(NULL); |
379 | 381 |
380 if (pac_request_) | 382 if (pac_request_) |
381 session_->proxy_service()->CancelPacRequest(pac_request_); | 383 session_->proxy_service()->CancelPacRequest(pac_request_); |
382 } | 384 } |
383 | 385 |
384 void HttpNetworkTransaction::DoCallback(int rv) { | 386 void HttpNetworkTransaction::DoCallback(int rv) { |
385 DCHECK(rv != ERR_IO_PENDING); | 387 DCHECK(rv != ERR_IO_PENDING); |
386 DCHECK(user_callback_); | 388 DCHECK(user_callback_); |
387 | 389 |
388 // Since Run may result in Read being called, clear user_callback_ up front. | 390 // Since Run may result in Read being called, clear user_callback_ up front. |
(...skipping 27 matching lines...) Expand all Loading... |
416 break; | 418 break; |
417 case STATE_INIT_CONNECTION: | 419 case STATE_INIT_CONNECTION: |
418 DCHECK_EQ(OK, rv); | 420 DCHECK_EQ(OK, rv); |
419 TRACE_EVENT_BEGIN("http.init_conn", request_, request_->url.spec()); | 421 TRACE_EVENT_BEGIN("http.init_conn", request_, request_->url.spec()); |
420 rv = DoInitConnection(); | 422 rv = DoInitConnection(); |
421 break; | 423 break; |
422 case STATE_INIT_CONNECTION_COMPLETE: | 424 case STATE_INIT_CONNECTION_COMPLETE: |
423 rv = DoInitConnectionComplete(rv); | 425 rv = DoInitConnectionComplete(rv); |
424 TRACE_EVENT_END("http.init_conn", request_, request_->url.spec()); | 426 TRACE_EVENT_END("http.init_conn", request_, request_->url.spec()); |
425 break; | 427 break; |
| 428 case STATE_RESOLVE_HOST: |
| 429 DCHECK_EQ(OK, rv); |
| 430 TRACE_EVENT_BEGIN("http.resolve_host", request_, request_->url.spec()); |
| 431 rv = DoResolveHost(); |
| 432 break; |
| 433 case STATE_RESOLVE_HOST_COMPLETE: |
| 434 rv = DoResolveHostComplete(rv); |
| 435 TRACE_EVENT_END("http.resolve_host", request_, request_->url.spec()); |
| 436 break; |
| 437 case STATE_TCP_CONNECT: |
| 438 DCHECK_EQ(OK, rv); |
| 439 TRACE_EVENT_BEGIN("http.connect", request_, request_->url.spec()); |
| 440 rv = DoTCPConnect(); |
| 441 break; |
| 442 case STATE_TCP_CONNECT_COMPLETE: |
| 443 rv = DoTCPConnectComplete(rv); |
| 444 TRACE_EVENT_END("http.connect", request_, request_->url.spec()); |
| 445 break; |
426 case STATE_SSL_CONNECT: | 446 case STATE_SSL_CONNECT: |
427 DCHECK_EQ(OK, rv); | 447 DCHECK_EQ(OK, rv); |
428 TRACE_EVENT_BEGIN("http.ssl_connect", request_, request_->url.spec()); | 448 TRACE_EVENT_BEGIN("http.ssl_connect", request_, request_->url.spec()); |
429 rv = DoSSLConnect(); | 449 rv = DoSSLConnect(); |
430 break; | 450 break; |
431 case STATE_SSL_CONNECT_COMPLETE: | 451 case STATE_SSL_CONNECT_COMPLETE: |
432 rv = DoSSLConnectComplete(rv); | 452 rv = DoSSLConnectComplete(rv); |
433 TRACE_EVENT_END("http.ssl_connect", request_, request_->url.spec()); | 453 TRACE_EVENT_END("http.ssl_connect", request_, request_->url.spec()); |
434 break; | 454 break; |
435 case STATE_WRITE_HEADERS: | 455 case STATE_WRITE_HEADERS: |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 DCHECK(!connection_.is_initialized()); | 545 DCHECK(!connection_.is_initialized()); |
526 | 546 |
527 next_state_ = STATE_INIT_CONNECTION_COMPLETE; | 547 next_state_ = STATE_INIT_CONNECTION_COMPLETE; |
528 | 548 |
529 using_ssl_ = request_->url.SchemeIs("https"); | 549 using_ssl_ = request_->url.SchemeIs("https"); |
530 using_proxy_ = !proxy_info_.is_direct() && !using_ssl_; | 550 using_proxy_ = !proxy_info_.is_direct() && !using_ssl_; |
531 using_tunnel_ = !proxy_info_.is_direct() && using_ssl_; | 551 using_tunnel_ = !proxy_info_.is_direct() && using_ssl_; |
532 | 552 |
533 // Build the string used to uniquely identify connections of this type. | 553 // Build the string used to uniquely identify connections of this type. |
534 std::string connection_group; | 554 std::string connection_group; |
535 std::string host; | 555 if (using_proxy_ || using_tunnel_) |
536 int port; | 556 connection_group = "proxy/" + proxy_info_.proxy_server().ToURI() + "/"; |
537 if (using_proxy_ || using_tunnel_) { | |
538 ProxyServer proxy_server = proxy_info_.proxy_server(); | |
539 connection_group = "proxy/" + proxy_server.ToURI() + "/"; | |
540 host = proxy_server.HostNoBrackets(); | |
541 port = proxy_server.port(); | |
542 } else { | |
543 host = request_->url.HostNoBrackets(); | |
544 port = request_->url.EffectiveIntPort(); | |
545 } | |
546 if (!using_proxy_) | 557 if (!using_proxy_) |
547 connection_group.append(request_->url.GetOrigin().spec()); | 558 connection_group.append(request_->url.GetOrigin().spec()); |
548 | 559 |
549 DCHECK(!connection_group.empty()); | 560 DCHECK(!connection_group.empty()); |
550 int rv = connection_.Init(connection_group, host, port, request_->priority, | 561 return connection_.Init(connection_group, request_->priority, &io_callback_); |
551 &io_callback_); | |
552 return rv; | |
553 } | 562 } |
554 | 563 |
555 int HttpNetworkTransaction::DoInitConnectionComplete(int result) { | 564 int HttpNetworkTransaction::DoInitConnectionComplete(int result) { |
556 if (result < 0) | 565 if (result < 0) |
557 return ReconsiderProxyAfterError(result); | 566 return result; |
558 | 567 |
559 DCHECK(connection_.is_initialized()); | 568 DCHECK(connection_.is_initialized()); |
560 | 569 |
561 // Set the reused_socket_ flag to indicate that we are using a keep-alive | 570 // Set the reused_socket_ flag to indicate that we are using a keep-alive |
562 // connection. This flag is used to handle errors that occur while we are | 571 // connection. This flag is used to handle errors that occur while we are |
563 // trying to reuse a keep-alive connection. | 572 // trying to reuse a keep-alive connection. |
564 reused_socket_ = connection_.is_reused(); | 573 reused_socket_ = (connection_.socket() != NULL); |
565 if (reused_socket_) { | 574 if (reused_socket_) { |
566 next_state_ = STATE_WRITE_HEADERS; | 575 next_state_ = STATE_WRITE_HEADERS; |
567 } else { | 576 } else { |
568 // Now we have a TCP connected socket. Perform other connection setup as | 577 next_state_ = STATE_RESOLVE_HOST; |
569 // needed. | 578 } |
| 579 return OK; |
| 580 } |
| 581 |
| 582 int HttpNetworkTransaction::DoResolveHost() { |
| 583 next_state_ = STATE_RESOLVE_HOST_COMPLETE; |
| 584 |
| 585 std::string host; |
| 586 int port; |
| 587 |
| 588 // Determine the host and port to connect to. |
| 589 if (using_proxy_ || using_tunnel_) { |
| 590 ProxyServer proxy_server = proxy_info_.proxy_server(); |
| 591 host = proxy_server.HostNoBrackets(); |
| 592 port = proxy_server.port(); |
| 593 } else { |
| 594 // Direct connection |
| 595 host = request_->url.HostNoBrackets(); |
| 596 port = request_->url.EffectiveIntPort(); |
| 597 } |
| 598 |
| 599 host_resolution_start_time_ = base::Time::Now(); |
| 600 |
| 601 DidStartDnsResolution(host, this); |
| 602 return resolver_.Resolve(host, port, &addresses_, &io_callback_); |
| 603 } |
| 604 |
| 605 int HttpNetworkTransaction::DoResolveHostComplete(int result) { |
| 606 bool ok = (result == OK); |
| 607 DidFinishDnsResolutionWithStatus(ok, request_->referrer, this); |
| 608 if (ok) { |
| 609 next_state_ = STATE_TCP_CONNECT; |
| 610 } else { |
| 611 result = ReconsiderProxyAfterError(result); |
| 612 } |
| 613 return result; |
| 614 } |
| 615 |
| 616 int HttpNetworkTransaction::DoTCPConnect() { |
| 617 next_state_ = STATE_TCP_CONNECT_COMPLETE; |
| 618 |
| 619 DCHECK(!connection_.socket()); |
| 620 |
| 621 connect_start_time_ = base::Time::Now(); |
| 622 |
| 623 ClientSocket* s = socket_factory_->CreateTCPClientSocket(addresses_); |
| 624 connection_.set_socket(s); |
| 625 return connection_.socket()->Connect(&io_callback_); |
| 626 } |
| 627 |
| 628 int HttpNetworkTransaction::DoTCPConnectComplete(int result) { |
| 629 // If we are using a direct SSL connection, then go ahead and establish the |
| 630 // SSL connection, now. Otherwise, we need to first issue a CONNECT request. |
| 631 if (result == OK) { |
570 LogTCPConnectedMetrics(); | 632 LogTCPConnectedMetrics(); |
571 if (using_ssl_ && !using_tunnel_) { | 633 if (using_ssl_ && !using_tunnel_) { |
572 next_state_ = STATE_SSL_CONNECT; | 634 next_state_ = STATE_SSL_CONNECT; |
573 } else { | 635 } else { |
574 next_state_ = STATE_WRITE_HEADERS; | 636 next_state_ = STATE_WRITE_HEADERS; |
575 if (using_tunnel_) | 637 if (using_tunnel_) |
576 establishing_tunnel_ = true; | 638 establishing_tunnel_ = true; |
577 } | 639 } |
| 640 } else { |
| 641 result = ReconsiderProxyAfterError(result); |
578 } | 642 } |
579 return OK; | 643 return result; |
580 } | 644 } |
581 | 645 |
582 int HttpNetworkTransaction::DoSSLConnect() { | 646 int HttpNetworkTransaction::DoSSLConnect() { |
583 next_state_ = STATE_SSL_CONNECT_COMPLETE; | 647 next_state_ = STATE_SSL_CONNECT_COMPLETE; |
584 | 648 |
585 // Add a SSL socket on top of our existing transport socket. | 649 // Add a SSL socket on top of our existing transport socket. |
586 ClientSocket* s = connection_.release_socket(); | 650 ClientSocket* s = connection_.release_socket(); |
587 s = socket_factory_->CreateSSLClientSocket( | 651 s = socket_factory_->CreateSSLClientSocket( |
588 s, request_->url.HostNoBrackets(), ssl_config_); | 652 s, request_->url.HostNoBrackets(), ssl_config_); |
589 connection_.set_socket(s); | 653 connection_.set_socket(s); |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
870 (response_body_length_ != -1 && | 934 (response_body_length_ != -1 && |
871 response_body_read_ > response_body_length_)) | 935 response_body_read_ > response_body_length_)) |
872 keep_alive = false; | 936 keep_alive = false; |
873 } | 937 } |
874 } | 938 } |
875 | 939 |
876 // Clean up connection_ if we are done. | 940 // Clean up connection_ if we are done. |
877 if (done) { | 941 if (done) { |
878 LogTransactionMetrics(); | 942 LogTransactionMetrics(); |
879 if (!keep_alive) | 943 if (!keep_alive) |
880 connection_.socket()->Disconnect(); | 944 connection_.set_socket(NULL); |
881 connection_.Reset(); | 945 connection_.Reset(); |
882 // The next Read call will return 0 (EOF). | 946 // The next Read call will return 0 (EOF). |
883 } | 947 } |
884 | 948 |
885 // Clear these to avoid leaving around old state. | 949 // Clear these to avoid leaving around old state. |
886 read_buf_ = NULL; | 950 read_buf_ = NULL; |
887 read_buf_len_ = 0; | 951 read_buf_len_ = 0; |
888 | 952 |
889 return result; | 953 return result; |
890 } | 954 } |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 DidDrainBodyForAuthRestart(keep_alive); | 1006 DidDrainBodyForAuthRestart(keep_alive); |
943 } else { | 1007 } else { |
944 // Keep draining. | 1008 // Keep draining. |
945 next_state_ = STATE_DRAIN_BODY_FOR_AUTH_RESTART; | 1009 next_state_ = STATE_DRAIN_BODY_FOR_AUTH_RESTART; |
946 } | 1010 } |
947 | 1011 |
948 return OK; | 1012 return OK; |
949 } | 1013 } |
950 | 1014 |
951 void HttpNetworkTransaction::LogTCPConnectedMetrics() const { | 1015 void HttpNetworkTransaction::LogTCPConnectedMetrics() const { |
| 1016 DCHECK(connect_start_time_ != base::Time()); |
| 1017 base::TimeDelta connect_duration = |
| 1018 base::Time::Now() - connect_start_time_; |
| 1019 |
| 1020 UMA_HISTOGRAM_CLIPPED_TIMES(FieldTrial::MakeName( |
| 1021 "Net.TCP_Connection_Latency", "DnsImpact").data(), connect_duration, |
| 1022 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), |
| 1023 100); |
| 1024 |
952 base::TimeDelta host_resolution_and_tcp_connection_latency = | 1025 base::TimeDelta host_resolution_and_tcp_connection_latency = |
953 base::Time::Now() - host_resolution_start_time_; | 1026 base::Time::Now() - host_resolution_start_time_; |
954 | 1027 |
955 UMA_HISTOGRAM_CLIPPED_TIMES( | 1028 UMA_HISTOGRAM_CLIPPED_TIMES( |
956 FieldTrial::MakeName( | 1029 FieldTrial::MakeName( |
957 "Net.Dns_Resolution_And_TCP_Connection_Latency", "DnsImpact").data(), | 1030 "Net.Dns_Resolution_And_TCP_Connection_Latency", "DnsImpact").data(), |
958 host_resolution_and_tcp_connection_latency, | 1031 host_resolution_and_tcp_connection_latency, |
959 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), | 1032 base::TimeDelta::FromMilliseconds(1), base::TimeDelta::FromMinutes(10), |
960 100); | 1033 100); |
961 | 1034 |
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1214 } | 1287 } |
1215 | 1288 |
1216 int HttpNetworkTransaction::HandleSSLHandshakeError(int error) { | 1289 int HttpNetworkTransaction::HandleSSLHandshakeError(int error) { |
1217 switch (error) { | 1290 switch (error) { |
1218 case ERR_SSL_PROTOCOL_ERROR: | 1291 case ERR_SSL_PROTOCOL_ERROR: |
1219 case ERR_SSL_VERSION_OR_CIPHER_MISMATCH: | 1292 case ERR_SSL_VERSION_OR_CIPHER_MISMATCH: |
1220 if (ssl_config_.tls1_enabled) { | 1293 if (ssl_config_.tls1_enabled) { |
1221 // This could be a TLS-intolerant server or an SSL 3.0 server that | 1294 // This could be a TLS-intolerant server or an SSL 3.0 server that |
1222 // chose a TLS-only cipher suite. Turn off TLS 1.0 and retry. | 1295 // chose a TLS-only cipher suite. Turn off TLS 1.0 and retry. |
1223 ssl_config_.tls1_enabled = false; | 1296 ssl_config_.tls1_enabled = false; |
1224 connection_.socket()->Disconnect(); | 1297 connection_.set_socket(NULL); |
1225 connection_.Reset(); | 1298 connection_.Reset(); |
1226 next_state_ = STATE_INIT_CONNECTION; | 1299 next_state_ = STATE_INIT_CONNECTION; |
1227 error = OK; | 1300 error = OK; |
1228 } | 1301 } |
1229 break; | 1302 break; |
1230 } | 1303 } |
1231 return error; | 1304 return error; |
1232 } | 1305 } |
1233 | 1306 |
1234 // This method determines whether it is safe to resend the request after an | 1307 // This method determines whether it is safe to resend the request after an |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1277 // out of the cached keep-alive connections eventually. | 1350 // out of the cached keep-alive connections eventually. |
1278 if (establishing_tunnel_ || | 1351 if (establishing_tunnel_ || |
1279 !reused_socket_ || // We didn't reuse a keep-alive connection. | 1352 !reused_socket_ || // We didn't reuse a keep-alive connection. |
1280 header_buf_len_) { // We have received some response headers. | 1353 header_buf_len_) { // We have received some response headers. |
1281 return false; | 1354 return false; |
1282 } | 1355 } |
1283 return true; | 1356 return true; |
1284 } | 1357 } |
1285 | 1358 |
1286 void HttpNetworkTransaction::ResetConnectionAndRequestForResend() { | 1359 void HttpNetworkTransaction::ResetConnectionAndRequestForResend() { |
1287 connection_.socket()->Disconnect(); | 1360 connection_.set_socket(NULL); |
1288 connection_.Reset(); | 1361 connection_.Reset(); |
1289 // There are two reasons we need to clear request_headers_. 1) It contains | 1362 // There are two reasons we need to clear request_headers_. 1) It contains |
1290 // the real request headers, but we may need to resend the CONNECT request | 1363 // the real request headers, but we may need to resend the CONNECT request |
1291 // first to recreate the SSL tunnel. 2) An empty request_headers_ causes | 1364 // first to recreate the SSL tunnel. 2) An empty request_headers_ causes |
1292 // BuildRequestHeaders to be called, which rewinds request_body_stream_ to | 1365 // BuildRequestHeaders to be called, which rewinds request_body_stream_ to |
1293 // the beginning of request_->upload_data. | 1366 // the beginning of request_->upload_data. |
1294 request_headers_->headers_.clear(); | 1367 request_headers_->headers_.clear(); |
1295 request_headers_bytes_sent_ = 0; | 1368 request_headers_bytes_sent_ = 0; |
1296 next_state_ = STATE_INIT_CONNECTION; // Resend the request. | 1369 next_state_ = STATE_INIT_CONNECTION; // Resend the request. |
1297 } | 1370 } |
(...skipping 24 matching lines...) Expand all Loading... |
1322 return error; | 1395 return error; |
1323 } | 1396 } |
1324 | 1397 |
1325 if (request_->load_flags & LOAD_BYPASS_PROXY) { | 1398 if (request_->load_flags & LOAD_BYPASS_PROXY) { |
1326 return error; | 1399 return error; |
1327 } | 1400 } |
1328 | 1401 |
1329 int rv = session_->proxy_service()->ReconsiderProxyAfterError( | 1402 int rv = session_->proxy_service()->ReconsiderProxyAfterError( |
1330 request_->url, &proxy_info_, &io_callback_, &pac_request_); | 1403 request_->url, &proxy_info_, &io_callback_, &pac_request_); |
1331 if (rv == OK || rv == ERR_IO_PENDING) { | 1404 if (rv == OK || rv == ERR_IO_PENDING) { |
1332 connection_.socket()->Disconnect(); | 1405 connection_.set_socket(NULL); |
1333 connection_.Reset(); | 1406 connection_.Reset(); |
1334 DCHECK(!request_headers_bytes_sent_); | 1407 DCHECK(!request_headers_bytes_sent_); |
1335 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; | 1408 next_state_ = STATE_RESOLVE_PROXY_COMPLETE; |
1336 } else { | 1409 } else { |
1337 rv = error; | 1410 rv = error; |
1338 } | 1411 } |
1339 | 1412 |
1340 return rv; | 1413 return rv; |
1341 } | 1414 } |
1342 | 1415 |
(...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1605 host_and_port = proxy_info_.proxy_server().host_and_port(); | 1678 host_and_port = proxy_info_.proxy_server().host_and_port(); |
1606 } else { | 1679 } else { |
1607 DCHECK(target == HttpAuth::AUTH_SERVER); | 1680 DCHECK(target == HttpAuth::AUTH_SERVER); |
1608 host_and_port = GetHostAndPort(request_->url); | 1681 host_and_port = GetHostAndPort(request_->url); |
1609 } | 1682 } |
1610 auth_info->host_and_port = ASCIIToWide(host_and_port); | 1683 auth_info->host_and_port = ASCIIToWide(host_and_port); |
1611 response_.auth_challenge = auth_info; | 1684 response_.auth_challenge = auth_info; |
1612 } | 1685 } |
1613 | 1686 |
1614 } // namespace net | 1687 } // namespace net |
OLD | NEW |