OLD | NEW |
1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/socket/socks_client_socket.h" | 5 #include "net/socket/socks_client_socket.h" |
6 | 6 |
7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
8 #include "build/build_config.h" | 8 #include "build/build_config.h" |
9 #if defined(OS_WIN) | 9 #if defined(OS_WIN) |
10 #include <ws2tcpip.h> | 10 #include <ws2tcpip.h> |
11 #elif defined(OS_POSIX) | 11 #elif defined(OS_POSIX) |
12 #include <netdb.h> | 12 #include <netdb.h> |
13 #endif | 13 #endif |
14 #include "base/compiler_specific.h" | 14 #include "base/compiler_specific.h" |
15 #include "base/trace_event.h" | 15 #include "base/trace_event.h" |
16 #include "net/base/io_buffer.h" | 16 #include "net/base/io_buffer.h" |
| 17 #include "net/base/load_log.h" |
17 #include "net/base/net_util.h" | 18 #include "net/base/net_util.h" |
18 | 19 |
19 namespace net { | 20 namespace net { |
20 | 21 |
21 // Every SOCKS server requests a user-id from the client. It is optional | 22 // Every SOCKS server requests a user-id from the client. It is optional |
22 // and we send an empty string. | 23 // and we send an empty string. |
23 static const char kEmptyUserId[] = ""; | 24 static const char kEmptyUserId[] = ""; |
24 | 25 |
25 // The SOCKS4a implementation suggests to use an invalid IP in case the DNS | 26 // The SOCKS4a implementation suggests to use an invalid IP in case the DNS |
26 // resolution at client fails. | 27 // resolution at client fails. |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
76 bytes_sent_(0), | 77 bytes_sent_(0), |
77 bytes_received_(0), | 78 bytes_received_(0), |
78 host_resolver_(host_resolver), | 79 host_resolver_(host_resolver), |
79 host_request_info_(req_info) { | 80 host_request_info_(req_info) { |
80 } | 81 } |
81 | 82 |
82 SOCKSClientSocket::~SOCKSClientSocket() { | 83 SOCKSClientSocket::~SOCKSClientSocket() { |
83 Disconnect(); | 84 Disconnect(); |
84 } | 85 } |
85 | 86 |
86 int SOCKSClientSocket::Connect(CompletionCallback* callback) { | 87 int SOCKSClientSocket::Connect(CompletionCallback* callback, |
| 88 LoadLog* load_log) { |
87 DCHECK(transport_.get()); | 89 DCHECK(transport_.get()); |
88 DCHECK(transport_->IsConnected()); | 90 DCHECK(transport_->IsConnected()); |
89 DCHECK_EQ(STATE_NONE, next_state_); | 91 DCHECK_EQ(STATE_NONE, next_state_); |
90 DCHECK(!user_callback_); | 92 DCHECK(!user_callback_); |
91 | 93 |
92 // If already connected, then just return OK. | 94 // If already connected, then just return OK. |
93 if (completed_handshake_) | 95 if (completed_handshake_) |
94 return OK; | 96 return OK; |
95 | 97 |
96 next_state_ = STATE_RESOLVE_HOST; | 98 next_state_ = STATE_RESOLVE_HOST; |
| 99 load_log_ = load_log; |
| 100 |
| 101 LoadLog::BeginEvent(load_log, LoadLog::TYPE_SOCKS_CONNECT); |
97 | 102 |
98 int rv = DoLoop(OK); | 103 int rv = DoLoop(OK); |
99 if (rv == ERR_IO_PENDING) | 104 if (rv == ERR_IO_PENDING) { |
100 user_callback_ = callback; | 105 user_callback_ = callback; |
| 106 } else { |
| 107 LoadLog::EndEvent(load_log, LoadLog::TYPE_SOCKS_CONNECT); |
| 108 load_log_ = NULL; |
| 109 } |
101 return rv; | 110 return rv; |
102 } | 111 } |
103 | 112 |
104 void SOCKSClientSocket::Disconnect() { | 113 void SOCKSClientSocket::Disconnect() { |
105 completed_handshake_ = false; | 114 completed_handshake_ = false; |
106 transport_->Disconnect(); | 115 transport_->Disconnect(); |
107 } | 116 } |
108 | 117 |
109 bool SOCKSClientSocket::IsConnected() const { | 118 bool SOCKSClientSocket::IsConnected() const { |
110 return completed_handshake_ && transport_->IsConnected(); | 119 return completed_handshake_ && transport_->IsConnected(); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 // clear user_callback_ up front. | 161 // clear user_callback_ up front. |
153 CompletionCallback* c = user_callback_; | 162 CompletionCallback* c = user_callback_; |
154 user_callback_ = NULL; | 163 user_callback_ = NULL; |
155 DLOG(INFO) << "Finished setting up SOCKS handshake"; | 164 DLOG(INFO) << "Finished setting up SOCKS handshake"; |
156 c->Run(result); | 165 c->Run(result); |
157 } | 166 } |
158 | 167 |
159 void SOCKSClientSocket::OnIOComplete(int result) { | 168 void SOCKSClientSocket::OnIOComplete(int result) { |
160 DCHECK_NE(STATE_NONE, next_state_); | 169 DCHECK_NE(STATE_NONE, next_state_); |
161 int rv = DoLoop(result); | 170 int rv = DoLoop(result); |
162 if (rv != ERR_IO_PENDING) | 171 if (rv != ERR_IO_PENDING) { |
| 172 LoadLog::EndEvent(load_log_, LoadLog::TYPE_SOCKS_CONNECT); |
| 173 load_log_ = NULL; |
163 DoCallback(rv); | 174 DoCallback(rv); |
| 175 } |
164 } | 176 } |
165 | 177 |
166 int SOCKSClientSocket::DoLoop(int last_io_result) { | 178 int SOCKSClientSocket::DoLoop(int last_io_result) { |
167 DCHECK_NE(next_state_, STATE_NONE); | 179 DCHECK_NE(next_state_, STATE_NONE); |
168 int rv = last_io_result; | 180 int rv = last_io_result; |
169 do { | 181 do { |
170 State state = next_state_; | 182 State state = next_state_; |
171 next_state_ = STATE_NONE; | 183 next_state_ = STATE_NONE; |
172 switch (state) { | 184 switch (state) { |
173 case STATE_RESOLVE_HOST: | 185 case STATE_RESOLVE_HOST: |
(...skipping 24 matching lines...) Expand all Loading... |
198 } | 210 } |
199 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); | 211 } while (rv != ERR_IO_PENDING && next_state_ != STATE_NONE); |
200 return rv; | 212 return rv; |
201 } | 213 } |
202 | 214 |
203 int SOCKSClientSocket::DoResolveHost() { | 215 int SOCKSClientSocket::DoResolveHost() { |
204 DCHECK_EQ(kSOCKS4Unresolved, socks_version_); | 216 DCHECK_EQ(kSOCKS4Unresolved, socks_version_); |
205 | 217 |
206 next_state_ = STATE_RESOLVE_HOST_COMPLETE; | 218 next_state_ = STATE_RESOLVE_HOST_COMPLETE; |
207 return host_resolver_.Resolve( | 219 return host_resolver_.Resolve( |
208 host_request_info_, &addresses_, &io_callback_, NULL); | 220 host_request_info_, &addresses_, &io_callback_, load_log_); |
209 } | 221 } |
210 | 222 |
211 int SOCKSClientSocket::DoResolveHostComplete(int result) { | 223 int SOCKSClientSocket::DoResolveHostComplete(int result) { |
212 DCHECK_EQ(kSOCKS4Unresolved, socks_version_); | 224 DCHECK_EQ(kSOCKS4Unresolved, socks_version_); |
213 | 225 |
214 bool ok = (result == OK); | 226 bool ok = (result == OK); |
215 next_state_ = STATE_HANDSHAKE_WRITE; | 227 next_state_ = STATE_HANDSHAKE_WRITE; |
216 if (ok) { | 228 if (ok) { |
217 DCHECK(addresses_.head()); | 229 DCHECK(addresses_.head()); |
218 | 230 |
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
384 } | 396 } |
385 | 397 |
386 #if defined(OS_LINUX) | 398 #if defined(OS_LINUX) |
387 int SOCKSClientSocket::GetPeerName(struct sockaddr* name, | 399 int SOCKSClientSocket::GetPeerName(struct sockaddr* name, |
388 socklen_t* namelen) { | 400 socklen_t* namelen) { |
389 return transport_->GetPeerName(name, namelen); | 401 return transport_->GetPeerName(name, namelen); |
390 } | 402 } |
391 #endif | 403 #endif |
392 | 404 |
393 } // namespace net | 405 } // namespace net |
OLD | NEW |