| 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/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 "base/bind.h" | 8 #include "base/bind.h" |
| 9 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 51 uint8 code; | 51 uint8 code; |
| 52 uint16 port; | 52 uint16 port; |
| 53 uint8 ip[4]; | 53 uint8 ip[4]; |
| 54 }; | 54 }; |
| 55 COMPILE_ASSERT(sizeof(SOCKS4ServerResponse) == kReadHeaderSize, | 55 COMPILE_ASSERT(sizeof(SOCKS4ServerResponse) == kReadHeaderSize, |
| 56 socks4_server_response_struct_wrong_size); | 56 socks4_server_response_struct_wrong_size); |
| 57 | 57 |
| 58 SOCKSClientSocket::SOCKSClientSocket(ClientSocketHandle* transport_socket, | 58 SOCKSClientSocket::SOCKSClientSocket(ClientSocketHandle* transport_socket, |
| 59 const HostResolver::RequestInfo& req_info, | 59 const HostResolver::RequestInfo& req_info, |
| 60 HostResolver* host_resolver) | 60 HostResolver* host_resolver) |
| 61 : ALLOW_THIS_IN_INITIALIZER_LIST( | 61 : transport_(transport_socket), |
| 62 io_callback_(this, &SOCKSClientSocket::OnIOComplete)), | |
| 63 transport_(transport_socket), | |
| 64 next_state_(STATE_NONE), | 62 next_state_(STATE_NONE), |
| 65 old_user_callback_(NULL), | |
| 66 completed_handshake_(false), | 63 completed_handshake_(false), |
| 67 bytes_sent_(0), | 64 bytes_sent_(0), |
| 68 bytes_received_(0), | 65 bytes_received_(0), |
| 69 host_resolver_(host_resolver), | 66 host_resolver_(host_resolver), |
| 70 host_request_info_(req_info), | 67 host_request_info_(req_info), |
| 71 net_log_(transport_socket->socket()->NetLog()) { | 68 net_log_(transport_socket->socket()->NetLog()) { |
| 72 } | 69 } |
| 73 | 70 |
| 74 SOCKSClientSocket::SOCKSClientSocket(StreamSocket* transport_socket, | 71 SOCKSClientSocket::SOCKSClientSocket(StreamSocket* transport_socket, |
| 75 const HostResolver::RequestInfo& req_info, | 72 const HostResolver::RequestInfo& req_info, |
| 76 HostResolver* host_resolver) | 73 HostResolver* host_resolver) |
| 77 : ALLOW_THIS_IN_INITIALIZER_LIST( | 74 : transport_(new ClientSocketHandle()), |
| 78 io_callback_(this, &SOCKSClientSocket::OnIOComplete)), | |
| 79 transport_(new ClientSocketHandle()), | |
| 80 next_state_(STATE_NONE), | 75 next_state_(STATE_NONE), |
| 81 old_user_callback_(NULL), | |
| 82 completed_handshake_(false), | 76 completed_handshake_(false), |
| 83 bytes_sent_(0), | 77 bytes_sent_(0), |
| 84 bytes_received_(0), | 78 bytes_received_(0), |
| 85 host_resolver_(host_resolver), | 79 host_resolver_(host_resolver), |
| 86 host_request_info_(req_info), | 80 host_request_info_(req_info), |
| 87 net_log_(transport_socket->NetLog()) { | 81 net_log_(transport_socket->NetLog()) { |
| 88 transport_->set_socket(transport_socket); | 82 transport_->set_socket(transport_socket); |
| 89 } | 83 } |
| 90 | 84 |
| 91 SOCKSClientSocket::~SOCKSClientSocket() { | 85 SOCKSClientSocket::~SOCKSClientSocket() { |
| 92 Disconnect(); | 86 Disconnect(); |
| 93 } | 87 } |
| 94 | 88 |
| 95 int SOCKSClientSocket::Connect(OldCompletionCallback* callback) { | 89 int SOCKSClientSocket::Connect(const CompletionCallback& callback) { |
| 96 DCHECK(transport_.get()); | 90 DCHECK(transport_.get()); |
| 97 DCHECK(transport_->socket()); | 91 DCHECK(transport_->socket()); |
| 98 DCHECK_EQ(STATE_NONE, next_state_); | 92 DCHECK_EQ(STATE_NONE, next_state_); |
| 99 DCHECK(!old_user_callback_ && user_callback_.is_null()); | 93 DCHECK(user_callback_.is_null()); |
| 100 | 94 |
| 101 // If already connected, then just return OK. | 95 // If already connected, then just return OK. |
| 102 if (completed_handshake_) | 96 if (completed_handshake_) |
| 103 return OK; | 97 return OK; |
| 104 | 98 |
| 105 next_state_ = STATE_RESOLVE_HOST; | 99 next_state_ = STATE_RESOLVE_HOST; |
| 106 | 100 |
| 107 net_log_.BeginEvent(NetLog::TYPE_SOCKS_CONNECT, NULL); | 101 net_log_.BeginEvent(NetLog::TYPE_SOCKS_CONNECT, NULL); |
| 108 | 102 |
| 109 int rv = DoLoop(OK); | 103 int rv = DoLoop(OK); |
| 110 if (rv == ERR_IO_PENDING) { | 104 if (rv == ERR_IO_PENDING) { |
| 111 old_user_callback_ = callback; | 105 user_callback_ = callback; |
| 112 } else { | 106 } else { |
| 113 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SOCKS_CONNECT, rv); | 107 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SOCKS_CONNECT, rv); |
| 114 } | 108 } |
| 115 return rv; | 109 return rv; |
| 116 } | 110 } |
| 117 int SOCKSClientSocket::Connect(const net::CompletionCallback& callback) { | |
| 118 DCHECK(transport_.get()); | |
| 119 DCHECK(transport_->socket()); | |
| 120 DCHECK_EQ(STATE_NONE, next_state_); | |
| 121 DCHECK(!old_user_callback_ && user_callback_.is_null()); | |
| 122 | |
| 123 // If already connected, then just return OK. | |
| 124 if (completed_handshake_) | |
| 125 return OK; | |
| 126 | |
| 127 next_state_ = STATE_RESOLVE_HOST; | |
| 128 | |
| 129 net_log_.BeginEvent(NetLog::TYPE_SOCKS_CONNECT, NULL); | |
| 130 | |
| 131 int rv = DoLoop(OK); | |
| 132 if (rv == ERR_IO_PENDING) | |
| 133 user_callback_ = callback; | |
| 134 else | |
| 135 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SOCKS_CONNECT, rv); | |
| 136 | |
| 137 return rv; | |
| 138 } | |
| 139 | 111 |
| 140 void SOCKSClientSocket::Disconnect() { | 112 void SOCKSClientSocket::Disconnect() { |
| 141 completed_handshake_ = false; | 113 completed_handshake_ = false; |
| 142 host_resolver_.Cancel(); | 114 host_resolver_.Cancel(); |
| 143 transport_->socket()->Disconnect(); | 115 transport_->socket()->Disconnect(); |
| 144 | 116 |
| 145 // Reset other states to make sure they aren't mistakenly used later. | 117 // Reset other states to make sure they aren't mistakenly used later. |
| 146 // These are the states initialized by Connect(). | 118 // These are the states initialized by Connect(). |
| 147 next_state_ = STATE_NONE; | 119 next_state_ = STATE_NONE; |
| 148 old_user_callback_ = NULL; | |
| 149 user_callback_.Reset(); | 120 user_callback_.Reset(); |
| 150 } | 121 } |
| 151 | 122 |
| 152 bool SOCKSClientSocket::IsConnected() const { | 123 bool SOCKSClientSocket::IsConnected() const { |
| 153 return completed_handshake_ && transport_->socket()->IsConnected(); | 124 return completed_handshake_ && transport_->socket()->IsConnected(); |
| 154 } | 125 } |
| 155 | 126 |
| 156 bool SOCKSClientSocket::IsConnectedAndIdle() const { | 127 bool SOCKSClientSocket::IsConnectedAndIdle() const { |
| 157 return completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); | 128 return completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); |
| 158 } | 129 } |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 return transport_->socket()->GetConnectTimeMicros(); | 177 return transport_->socket()->GetConnectTimeMicros(); |
| 207 } | 178 } |
| 208 NOTREACHED(); | 179 NOTREACHED(); |
| 209 return base::TimeDelta::FromMicroseconds(-1); | 180 return base::TimeDelta::FromMicroseconds(-1); |
| 210 } | 181 } |
| 211 | 182 |
| 212 | 183 |
| 213 // Read is called by the transport layer above to read. This can only be done | 184 // Read is called by the transport layer above to read. This can only be done |
| 214 // if the SOCKS handshake is complete. | 185 // if the SOCKS handshake is complete. |
| 215 int SOCKSClientSocket::Read(IOBuffer* buf, int buf_len, | 186 int SOCKSClientSocket::Read(IOBuffer* buf, int buf_len, |
| 216 OldCompletionCallback* callback) { | |
| 217 DCHECK(completed_handshake_); | |
| 218 DCHECK_EQ(STATE_NONE, next_state_); | |
| 219 DCHECK(!old_user_callback_ && user_callback_.is_null()); | |
| 220 | |
| 221 return transport_->socket()->Read(buf, buf_len, callback); | |
| 222 } | |
| 223 int SOCKSClientSocket::Read(IOBuffer* buf, int buf_len, | |
| 224 const CompletionCallback& callback) { | 187 const CompletionCallback& callback) { |
| 225 DCHECK(completed_handshake_); | 188 DCHECK(completed_handshake_); |
| 226 DCHECK_EQ(STATE_NONE, next_state_); | 189 DCHECK_EQ(STATE_NONE, next_state_); |
| 227 DCHECK(!old_user_callback_ && user_callback_.is_null()); | 190 DCHECK(user_callback_.is_null()); |
| 228 | 191 |
| 229 return transport_->socket()->Read(buf, buf_len, callback); | 192 return transport_->socket()->Read(buf, buf_len, callback); |
| 230 } | 193 } |
| 231 | 194 |
| 232 // Write is called by the transport layer. This can only be done if the | 195 // Write is called by the transport layer. This can only be done if the |
| 233 // SOCKS handshake is complete. | 196 // SOCKS handshake is complete. |
| 234 int SOCKSClientSocket::Write(IOBuffer* buf, int buf_len, | 197 int SOCKSClientSocket::Write(IOBuffer* buf, int buf_len, |
| 235 OldCompletionCallback* callback) { | 198 const CompletionCallback& callback) { |
| 236 DCHECK(completed_handshake_); | 199 DCHECK(completed_handshake_); |
| 237 DCHECK_EQ(STATE_NONE, next_state_); | 200 DCHECK_EQ(STATE_NONE, next_state_); |
| 238 DCHECK(!old_user_callback_); | 201 DCHECK(user_callback_.is_null()); |
| 239 | 202 |
| 240 return transport_->socket()->Write(buf, buf_len, callback); | 203 return transport_->socket()->Write(buf, buf_len, callback); |
| 241 } | 204 } |
| 242 | 205 |
| 243 bool SOCKSClientSocket::SetReceiveBufferSize(int32 size) { | 206 bool SOCKSClientSocket::SetReceiveBufferSize(int32 size) { |
| 244 return transport_->socket()->SetReceiveBufferSize(size); | 207 return transport_->socket()->SetReceiveBufferSize(size); |
| 245 } | 208 } |
| 246 | 209 |
| 247 bool SOCKSClientSocket::SetSendBufferSize(int32 size) { | 210 bool SOCKSClientSocket::SetSendBufferSize(int32 size) { |
| 248 return transport_->socket()->SetSendBufferSize(size); | 211 return transport_->socket()->SetSendBufferSize(size); |
| 249 } | 212 } |
| 250 | 213 |
| 251 void SOCKSClientSocket::DoCallback(int result) { | 214 void SOCKSClientSocket::DoCallback(int result) { |
| 252 DCHECK_NE(ERR_IO_PENDING, result); | 215 DCHECK_NE(ERR_IO_PENDING, result); |
| 253 DCHECK(old_user_callback_ || !user_callback_.is_null()); | 216 DCHECK(!user_callback_.is_null()); |
| 254 | 217 |
| 255 // Since Run() may result in Read being called, | 218 // Since Run() may result in Read being called, |
| 256 // clear user_callback_ up front. | 219 // clear user_callback_ up front. |
| 257 if (old_user_callback_) { | 220 CompletionCallback c = user_callback_; |
| 258 OldCompletionCallback* c = old_user_callback_; | 221 user_callback_.Reset(); |
| 259 old_user_callback_ = NULL; | 222 DVLOG(1) << "Finished setting up SOCKS handshake"; |
| 260 DVLOG(1) << "Finished setting up SOCKS handshake"; | 223 c.Run(result); |
| 261 c->Run(result); | |
| 262 } else { | |
| 263 CompletionCallback c = user_callback_; | |
| 264 user_callback_.Reset(); | |
| 265 DVLOG(1) << "Finished setting up SOCKS handshake"; | |
| 266 c.Run(result); | |
| 267 } | |
| 268 } | 224 } |
| 269 | 225 |
| 270 void SOCKSClientSocket::OnIOComplete(int result) { | 226 void SOCKSClientSocket::OnIOComplete(int result) { |
| 271 DCHECK_NE(STATE_NONE, next_state_); | 227 DCHECK_NE(STATE_NONE, next_state_); |
| 272 int rv = DoLoop(result); | 228 int rv = DoLoop(result); |
| 273 if (rv != ERR_IO_PENDING) { | 229 if (rv != ERR_IO_PENDING) { |
| 274 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SOCKS_CONNECT, rv); | 230 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SOCKS_CONNECT, rv); |
| 275 DoCallback(rv); | 231 DoCallback(rv); |
| 276 } | 232 } |
| 277 } | 233 } |
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 372 if (buffer_.empty()) { | 328 if (buffer_.empty()) { |
| 373 buffer_ = BuildHandshakeWriteBuffer(); | 329 buffer_ = BuildHandshakeWriteBuffer(); |
| 374 bytes_sent_ = 0; | 330 bytes_sent_ = 0; |
| 375 } | 331 } |
| 376 | 332 |
| 377 int handshake_buf_len = buffer_.size() - bytes_sent_; | 333 int handshake_buf_len = buffer_.size() - bytes_sent_; |
| 378 DCHECK_GT(handshake_buf_len, 0); | 334 DCHECK_GT(handshake_buf_len, 0); |
| 379 handshake_buf_ = new IOBuffer(handshake_buf_len); | 335 handshake_buf_ = new IOBuffer(handshake_buf_len); |
| 380 memcpy(handshake_buf_->data(), &buffer_[bytes_sent_], | 336 memcpy(handshake_buf_->data(), &buffer_[bytes_sent_], |
| 381 handshake_buf_len); | 337 handshake_buf_len); |
| 382 return transport_->socket()->Write(handshake_buf_, handshake_buf_len, | 338 return transport_->socket()->Write( |
| 383 &io_callback_); | 339 handshake_buf_, handshake_buf_len, |
| 340 base::Bind(&SOCKSClientSocket::OnIOComplete, base::Unretained(this))); |
| 384 } | 341 } |
| 385 | 342 |
| 386 int SOCKSClientSocket::DoHandshakeWriteComplete(int result) { | 343 int SOCKSClientSocket::DoHandshakeWriteComplete(int result) { |
| 387 if (result < 0) | 344 if (result < 0) |
| 388 return result; | 345 return result; |
| 389 | 346 |
| 390 // We ignore the case when result is 0, since the underlying Write | 347 // We ignore the case when result is 0, since the underlying Write |
| 391 // may return spurious writes while waiting on the socket. | 348 // may return spurious writes while waiting on the socket. |
| 392 | 349 |
| 393 bytes_sent_ += result; | 350 bytes_sent_ += result; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 406 int SOCKSClientSocket::DoHandshakeRead() { | 363 int SOCKSClientSocket::DoHandshakeRead() { |
| 407 next_state_ = STATE_HANDSHAKE_READ_COMPLETE; | 364 next_state_ = STATE_HANDSHAKE_READ_COMPLETE; |
| 408 | 365 |
| 409 if (buffer_.empty()) { | 366 if (buffer_.empty()) { |
| 410 bytes_received_ = 0; | 367 bytes_received_ = 0; |
| 411 } | 368 } |
| 412 | 369 |
| 413 int handshake_buf_len = kReadHeaderSize - bytes_received_; | 370 int handshake_buf_len = kReadHeaderSize - bytes_received_; |
| 414 handshake_buf_ = new IOBuffer(handshake_buf_len); | 371 handshake_buf_ = new IOBuffer(handshake_buf_len); |
| 415 return transport_->socket()->Read(handshake_buf_, handshake_buf_len, | 372 return transport_->socket()->Read(handshake_buf_, handshake_buf_len, |
| 416 &io_callback_); | 373 base::Bind(&SOCKSClientSocket::OnIOComplete, |
| 374 base::Unretained(this))); |
| 417 } | 375 } |
| 418 | 376 |
| 419 int SOCKSClientSocket::DoHandshakeReadComplete(int result) { | 377 int SOCKSClientSocket::DoHandshakeReadComplete(int result) { |
| 420 if (result < 0) | 378 if (result < 0) |
| 421 return result; | 379 return result; |
| 422 | 380 |
| 423 // The underlying socket closed unexpectedly. | 381 // The underlying socket closed unexpectedly. |
| 424 if (result == 0) | 382 if (result == 0) |
| 425 return ERR_CONNECTION_CLOSED; | 383 return ERR_CONNECTION_CLOSED; |
| 426 | 384 |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 | 427 |
| 470 int SOCKSClientSocket::GetPeerAddress(AddressList* address) const { | 428 int SOCKSClientSocket::GetPeerAddress(AddressList* address) const { |
| 471 return transport_->socket()->GetPeerAddress(address); | 429 return transport_->socket()->GetPeerAddress(address); |
| 472 } | 430 } |
| 473 | 431 |
| 474 int SOCKSClientSocket::GetLocalAddress(IPEndPoint* address) const { | 432 int SOCKSClientSocket::GetLocalAddress(IPEndPoint* address) const { |
| 475 return transport_->socket()->GetLocalAddress(address); | 433 return transport_->socket()->GetLocalAddress(address); |
| 476 } | 434 } |
| 477 | 435 |
| 478 } // namespace net | 436 } // namespace net |
| OLD | NEW |