| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_proxy_client_socket.h" | 5 #include "net/http/http_proxy_client_socket.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/bind_helpers.h" | 8 #include "base/bind_helpers.h" |
| 9 #include "base/strings/string_util.h" | 9 #include "base/strings/string_util.h" |
| 10 #include "base/strings/stringprintf.h" | 10 #include "base/strings/stringprintf.h" |
| 11 #include "net/base/auth.h" | 11 #include "net/base/auth.h" |
| 12 #include "net/base/host_port_pair.h" | 12 #include "net/base/host_port_pair.h" |
| 13 #include "net/base/io_buffer.h" | 13 #include "net/base/io_buffer.h" |
| 14 #include "net/base/net_log.h" | 14 #include "net/base/net_log.h" |
| 15 #include "net/base/net_util.h" | 15 #include "net/base/net_util.h" |
| 16 #include "net/base/proxy_delegate.h" |
| 16 #include "net/http/http_basic_stream.h" | 17 #include "net/http/http_basic_stream.h" |
| 17 #include "net/http/http_network_session.h" | 18 #include "net/http/http_network_session.h" |
| 18 #include "net/http/http_request_info.h" | 19 #include "net/http/http_request_info.h" |
| 19 #include "net/http/http_response_headers.h" | 20 #include "net/http/http_response_headers.h" |
| 20 #include "net/http/http_stream_parser.h" | 21 #include "net/http/http_stream_parser.h" |
| 21 #include "net/http/proxy_connect_redirect_http_stream.h" | 22 #include "net/http/proxy_connect_redirect_http_stream.h" |
| 22 #include "net/socket/client_socket_handle.h" | 23 #include "net/socket/client_socket_handle.h" |
| 23 #include "url/gurl.h" | 24 #include "url/gurl.h" |
| 24 | 25 |
| 25 namespace net { | 26 namespace net { |
| 26 | 27 |
| 27 HttpProxyClientSocket::HttpProxyClientSocket( | 28 HttpProxyClientSocket::HttpProxyClientSocket( |
| 28 ClientSocketHandle* transport_socket, | 29 ClientSocketHandle* transport_socket, |
| 29 const GURL& request_url, | 30 const GURL& request_url, |
| 30 const std::string& user_agent, | 31 const std::string& user_agent, |
| 31 const HostPortPair& endpoint, | 32 const HostPortPair& endpoint, |
| 32 const HostPortPair& proxy_server, | 33 const HostPortPair& proxy_server, |
| 33 HttpAuthCache* http_auth_cache, | 34 HttpAuthCache* http_auth_cache, |
| 34 HttpAuthHandlerFactory* http_auth_handler_factory, | 35 HttpAuthHandlerFactory* http_auth_handler_factory, |
| 35 bool tunnel, | 36 bool tunnel, |
| 36 bool using_spdy, | 37 bool using_spdy, |
| 37 NextProto protocol_negotiated, | 38 NextProto protocol_negotiated, |
| 39 ProxyDelegate* proxy_delegate, |
| 38 bool is_https_proxy) | 40 bool is_https_proxy) |
| 39 : io_callback_(base::Bind(&HttpProxyClientSocket::OnIOComplete, | 41 : io_callback_(base::Bind(&HttpProxyClientSocket::OnIOComplete, |
| 40 base::Unretained(this))), | 42 base::Unretained(this))), |
| 41 next_state_(STATE_NONE), | 43 next_state_(STATE_NONE), |
| 42 transport_(transport_socket), | 44 transport_(transport_socket), |
| 43 endpoint_(endpoint), | 45 endpoint_(endpoint), |
| 44 auth_(tunnel ? | 46 auth_(tunnel ? |
| 45 new HttpAuthController(HttpAuth::AUTH_PROXY, | 47 new HttpAuthController(HttpAuth::AUTH_PROXY, |
| 46 GURL((is_https_proxy ? "https://" : "http://") | 48 GURL((is_https_proxy ? "https://" : "http://") |
| 47 + proxy_server.ToString()), | 49 + proxy_server.ToString()), |
| 48 http_auth_cache, | 50 http_auth_cache, |
| 49 http_auth_handler_factory) | 51 http_auth_handler_factory) |
| 50 : NULL), | 52 : NULL), |
| 51 tunnel_(tunnel), | 53 tunnel_(tunnel), |
| 52 using_spdy_(using_spdy), | 54 using_spdy_(using_spdy), |
| 53 protocol_negotiated_(protocol_negotiated), | 55 protocol_negotiated_(protocol_negotiated), |
| 54 is_https_proxy_(is_https_proxy), | 56 is_https_proxy_(is_https_proxy), |
| 55 redirect_has_load_timing_info_(false), | 57 redirect_has_load_timing_info_(false), |
| 58 proxy_server_(proxy_server), |
| 59 proxy_delegate_(proxy_delegate), |
| 56 net_log_(transport_socket->socket()->NetLog()) { | 60 net_log_(transport_socket->socket()->NetLog()) { |
| 57 // Synthesize the bits of a request that we actually use. | 61 // Synthesize the bits of a request that we actually use. |
| 58 request_.url = request_url; | 62 request_.url = request_url; |
| 59 request_.method = "GET"; | 63 request_.method = "GET"; |
| 60 if (!user_agent.empty()) | 64 if (!user_agent.empty()) |
| 61 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, | 65 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, |
| 62 user_agent); | 66 user_agent); |
| 63 } | 67 } |
| 64 | 68 |
| 65 HttpProxyClientSocket::~HttpProxyClientSocket() { | 69 HttpProxyClientSocket::~HttpProxyClientSocket() { |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 398 int HttpProxyClientSocket::DoSendRequest() { | 402 int HttpProxyClientSocket::DoSendRequest() { |
| 399 next_state_ = STATE_SEND_REQUEST_COMPLETE; | 403 next_state_ = STATE_SEND_REQUEST_COMPLETE; |
| 400 | 404 |
| 401 // This is constructed lazily (instead of within our Start method), so that | 405 // This is constructed lazily (instead of within our Start method), so that |
| 402 // we have proxy info available. | 406 // we have proxy info available. |
| 403 if (request_line_.empty()) { | 407 if (request_line_.empty()) { |
| 404 DCHECK(request_headers_.IsEmpty()); | 408 DCHECK(request_headers_.IsEmpty()); |
| 405 HttpRequestHeaders authorization_headers; | 409 HttpRequestHeaders authorization_headers; |
| 406 if (auth_->HaveAuth()) | 410 if (auth_->HaveAuth()) |
| 407 auth_->AddAuthorizationHeader(&authorization_headers); | 411 auth_->AddAuthorizationHeader(&authorization_headers); |
| 412 if (proxy_delegate_) { |
| 413 proxy_delegate_->OnBeforeTunnelRequest(proxy_server_, |
| 414 &authorization_headers); |
| 415 } |
| 408 BuildTunnelRequest(request_, authorization_headers, endpoint_, | 416 BuildTunnelRequest(request_, authorization_headers, endpoint_, |
| 409 &request_line_, &request_headers_); | 417 &request_line_, &request_headers_); |
| 410 | 418 |
| 411 net_log_.AddEvent( | 419 net_log_.AddEvent( |
| 412 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, | 420 NetLog::TYPE_HTTP_TRANSACTION_SEND_TUNNEL_HEADERS, |
| 413 base::Bind(&HttpRequestHeaders::NetLogCallback, | 421 base::Bind(&HttpRequestHeaders::NetLogCallback, |
| 414 base::Unretained(&request_headers_), | 422 base::Unretained(&request_headers_), |
| 415 &request_line_)); | 423 &request_line_)); |
| 416 } | 424 } |
| 417 | 425 |
| (...skipping 22 matching lines...) Expand all Loading... |
| 440 return result; | 448 return result; |
| 441 | 449 |
| 442 // Require the "HTTP/1.x" status line for SSL CONNECT. | 450 // Require the "HTTP/1.x" status line for SSL CONNECT. |
| 443 if (response_.headers->GetParsedHttpVersion() < HttpVersion(1, 0)) | 451 if (response_.headers->GetParsedHttpVersion() < HttpVersion(1, 0)) |
| 444 return ERR_TUNNEL_CONNECTION_FAILED; | 452 return ERR_TUNNEL_CONNECTION_FAILED; |
| 445 | 453 |
| 446 net_log_.AddEvent( | 454 net_log_.AddEvent( |
| 447 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, | 455 NetLog::TYPE_HTTP_TRANSACTION_READ_TUNNEL_RESPONSE_HEADERS, |
| 448 base::Bind(&HttpResponseHeaders::NetLogCallback, response_.headers)); | 456 base::Bind(&HttpResponseHeaders::NetLogCallback, response_.headers)); |
| 449 | 457 |
| 458 if (proxy_delegate_) { |
| 459 proxy_delegate_->OnTunnelHeadersReceived( |
| 460 HostPortPair::FromURL(request_.url), |
| 461 proxy_server_, |
| 462 *response_.headers); |
| 463 } |
| 464 |
| 450 switch (response_.headers->response_code()) { | 465 switch (response_.headers->response_code()) { |
| 451 case 200: // OK | 466 case 200: // OK |
| 452 if (http_stream_parser_->IsMoreDataBuffered()) | 467 if (http_stream_parser_->IsMoreDataBuffered()) |
| 453 // The proxy sent extraneous data after the headers. | 468 // The proxy sent extraneous data after the headers. |
| 454 return ERR_TUNNEL_CONNECTION_FAILED; | 469 return ERR_TUNNEL_CONNECTION_FAILED; |
| 455 | 470 |
| 456 next_state_ = STATE_DONE; | 471 next_state_ = STATE_DONE; |
| 457 return OK; | 472 return OK; |
| 458 | 473 |
| 459 // We aren't able to CONNECT to the remote host through the proxy. We | 474 // We aren't able to CONNECT to the remote host through the proxy. We |
| (...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 529 | 544 |
| 530 int HttpProxyClientSocket::DoTCPRestartComplete(int result) { | 545 int HttpProxyClientSocket::DoTCPRestartComplete(int result) { |
| 531 if (result != OK) | 546 if (result != OK) |
| 532 return result; | 547 return result; |
| 533 | 548 |
| 534 next_state_ = STATE_GENERATE_AUTH_TOKEN; | 549 next_state_ = STATE_GENERATE_AUTH_TOKEN; |
| 535 return result; | 550 return result; |
| 536 } | 551 } |
| 537 | 552 |
| 538 } // namespace net | 553 } // namespace net |
| OLD | NEW |