Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(157)

Side by Side Diff: net/socket/socks_client_socket.cc

Issue 8824006: Migrate net/socket/socket.h, net/socket/stream_socket.h to base::Bind(). (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebased Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/socks_client_socket.h ('k') | net/socket/socks_client_socket_pool.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « net/socket/socks_client_socket.h ('k') | net/socket/socks_client_socket_pool.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698