| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "googleurl/src/gurl.h" | 8 #include "googleurl/src/gurl.h" |
| 9 #include "net/base/auth.h" | 9 #include "net/base/auth.h" |
| 10 #include "net/base/host_port_pair.h" | 10 #include "net/base/host_port_pair.h" |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 46 | 46 |
| 47 request_headers->MergeFrom(authorization_headers); | 47 request_headers->MergeFrom(authorization_headers); |
| 48 } | 48 } |
| 49 | 49 |
| 50 } // namespace | 50 } // namespace |
| 51 | 51 |
| 52 HttpProxyClientSocket::HttpProxyClientSocket( | 52 HttpProxyClientSocket::HttpProxyClientSocket( |
| 53 ClientSocketHandle* transport_socket, const GURL& request_url, | 53 ClientSocketHandle* transport_socket, const GURL& request_url, |
| 54 const std::string& user_agent, const HostPortPair& endpoint, | 54 const std::string& user_agent, const HostPortPair& endpoint, |
| 55 const HostPortPair& proxy_server, | 55 const HostPortPair& proxy_server, |
| 56 const scoped_refptr<HttpNetworkSession>& session, bool tunnel) | 56 const scoped_refptr<HttpNetworkSession>& session, bool tunnel, |
| 57 bool using_spdy) |
| 57 : ALLOW_THIS_IN_INITIALIZER_LIST( | 58 : ALLOW_THIS_IN_INITIALIZER_LIST( |
| 58 io_callback_(this, &HttpProxyClientSocket::OnIOComplete)), | 59 io_callback_(this, &HttpProxyClientSocket::OnIOComplete)), |
| 59 next_state_(STATE_NONE), | 60 next_state_(STATE_NONE), |
| 60 user_callback_(NULL), | 61 user_callback_(NULL), |
| 61 transport_(transport_socket), | 62 transport_(transport_socket), |
| 62 endpoint_(endpoint), | 63 endpoint_(endpoint), |
| 63 auth_(tunnel ? | 64 auth_(tunnel ? |
| 64 new HttpAuthController(HttpAuth::AUTH_PROXY, | 65 new HttpAuthController(HttpAuth::AUTH_PROXY, |
| 65 GURL("http://" + proxy_server.ToString()), | 66 GURL("http://" + proxy_server.ToString()), |
| 66 session) : NULL), | 67 session) : NULL), |
| 67 tunnel_(tunnel), | 68 tunnel_(tunnel), |
| 69 using_spdy_(using_spdy), |
| 68 net_log_(transport_socket->socket()->NetLog()) { | 70 net_log_(transport_socket->socket()->NetLog()) { |
| 69 // Synthesize the bits of a request that we actually use. | 71 // Synthesize the bits of a request that we actually use. |
| 70 request_.url = request_url; | 72 request_.url = request_url; |
| 71 request_.method = "GET"; | 73 request_.method = "GET"; |
| 72 if (!user_agent.empty()) | 74 if (!user_agent.empty()) |
| 73 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, | 75 request_.extra_headers.SetHeader(HttpRequestHeaders::kUserAgent, |
| 74 user_agent); | 76 user_agent); |
| 75 } | 77 } |
| 76 | 78 |
| 77 HttpProxyClientSocket::~HttpProxyClientSocket() { | 79 HttpProxyClientSocket::~HttpProxyClientSocket() { |
| 78 Disconnect(); | 80 Disconnect(); |
| 79 } | 81 } |
| 80 | 82 |
| 81 int HttpProxyClientSocket::Connect(CompletionCallback* callback) { | 83 int HttpProxyClientSocket::Connect(CompletionCallback* callback) { |
| 82 DCHECK(transport_.get()); | 84 DCHECK(transport_.get()); |
| 83 DCHECK(transport_->socket()); | 85 DCHECK(transport_->socket()); |
| 84 DCHECK(!user_callback_); | 86 DCHECK(!user_callback_); |
| 85 | 87 |
| 86 if (!tunnel_) | 88 // TODO(rch): figure out the right way to set up a tunnel with SPDY. |
| 89 // This approach sends the complete HTTPS request to the proxy |
| 90 // which allows the proxy to see "private" data. Instead, we should |
| 91 // create an SSL tunnel to the origin server using the CONNECT method |
| 92 // inside a single SPDY stream. |
| 93 if (using_spdy_ || !tunnel_) |
| 87 next_state_ = STATE_DONE; | 94 next_state_ = STATE_DONE; |
| 88 if (next_state_ == STATE_DONE) | 95 if (next_state_ == STATE_DONE) |
| 89 return OK; | 96 return OK; |
| 90 | 97 |
| 91 DCHECK_EQ(STATE_NONE, next_state_); | 98 DCHECK_EQ(STATE_NONE, next_state_); |
| 92 next_state_ = STATE_GENERATE_AUTH_TOKEN; | 99 next_state_ = STATE_GENERATE_AUTH_TOKEN; |
| 93 | 100 |
| 94 int rv = DoLoop(OK); | 101 int rv = DoLoop(OK); |
| 95 if (rv == ERR_IO_PENDING) | 102 if (rv == ERR_IO_PENDING) |
| 96 user_callback_ = callback; | 103 user_callback_ = callback; |
| (...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 451 | 458 |
| 452 int rv = auth_->HandleAuthChallenge(response_.headers, false, true, net_log_); | 459 int rv = auth_->HandleAuthChallenge(response_.headers, false, true, net_log_); |
| 453 response_.auth_challenge = auth_->auth_info(); | 460 response_.auth_challenge = auth_->auth_info(); |
| 454 if (rv == OK) | 461 if (rv == OK) |
| 455 return ERR_PROXY_AUTH_REQUESTED; | 462 return ERR_PROXY_AUTH_REQUESTED; |
| 456 | 463 |
| 457 return rv; | 464 return rv; |
| 458 } | 465 } |
| 459 | 466 |
| 460 } // namespace net | 467 } // namespace net |
| OLD | NEW |