| OLD | NEW |
| 1 // Copyright (c) 2009 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/socket/socks5_client_socket.h" | 5 #include "net/socket/socks5_client_socket.h" |
| 6 | 6 |
| 7 #include "base/basictypes.h" | 7 #include "base/basictypes.h" |
| 8 #include "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| 11 #include "base/trace_event.h" | 11 #include "base/trace_event.h" |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 52 const HostResolver::RequestInfo& req_info) | 52 const HostResolver::RequestInfo& req_info) |
| 53 : ALLOW_THIS_IN_INITIALIZER_LIST( | 53 : ALLOW_THIS_IN_INITIALIZER_LIST( |
| 54 io_callback_(this, &SOCKS5ClientSocket::OnIOComplete)), | 54 io_callback_(this, &SOCKS5ClientSocket::OnIOComplete)), |
| 55 transport_(transport_socket), | 55 transport_(transport_socket), |
| 56 next_state_(STATE_NONE), | 56 next_state_(STATE_NONE), |
| 57 user_callback_(NULL), | 57 user_callback_(NULL), |
| 58 completed_handshake_(false), | 58 completed_handshake_(false), |
| 59 bytes_sent_(0), | 59 bytes_sent_(0), |
| 60 bytes_received_(0), | 60 bytes_received_(0), |
| 61 read_header_size(kReadHeaderSize), | 61 read_header_size(kReadHeaderSize), |
| 62 host_request_info_(req_info) { | 62 host_request_info_(req_info), |
| 63 net_log_(transport_socket->socket()->NetLog()) { |
| 63 } | 64 } |
| 64 | 65 |
| 65 SOCKS5ClientSocket::SOCKS5ClientSocket( | 66 SOCKS5ClientSocket::SOCKS5ClientSocket( |
| 66 ClientSocket* transport_socket, | 67 ClientSocket* transport_socket, |
| 67 const HostResolver::RequestInfo& req_info) | 68 const HostResolver::RequestInfo& req_info) |
| 68 : ALLOW_THIS_IN_INITIALIZER_LIST( | 69 : ALLOW_THIS_IN_INITIALIZER_LIST( |
| 69 io_callback_(this, &SOCKS5ClientSocket::OnIOComplete)), | 70 io_callback_(this, &SOCKS5ClientSocket::OnIOComplete)), |
| 70 transport_(new ClientSocketHandle()), | 71 transport_(new ClientSocketHandle()), |
| 71 next_state_(STATE_NONE), | 72 next_state_(STATE_NONE), |
| 72 user_callback_(NULL), | 73 user_callback_(NULL), |
| 73 completed_handshake_(false), | 74 completed_handshake_(false), |
| 74 bytes_sent_(0), | 75 bytes_sent_(0), |
| 75 bytes_received_(0), | 76 bytes_received_(0), |
| 76 read_header_size(kReadHeaderSize), | 77 read_header_size(kReadHeaderSize), |
| 77 host_request_info_(req_info) { | 78 host_request_info_(req_info), |
| 79 net_log_(transport_socket->NetLog()) { |
| 78 transport_->set_socket(transport_socket); | 80 transport_->set_socket(transport_socket); |
| 79 } | 81 } |
| 80 | 82 |
| 81 SOCKS5ClientSocket::~SOCKS5ClientSocket() { | 83 SOCKS5ClientSocket::~SOCKS5ClientSocket() { |
| 82 Disconnect(); | 84 Disconnect(); |
| 83 } | 85 } |
| 84 | 86 |
| 85 int SOCKS5ClientSocket::Connect(CompletionCallback* callback, | 87 int SOCKS5ClientSocket::Connect(CompletionCallback* callback) { |
| 86 const BoundNetLog& net_log) { | |
| 87 DCHECK(transport_.get()); | 88 DCHECK(transport_.get()); |
| 88 DCHECK(transport_->socket()); | 89 DCHECK(transport_->socket()); |
| 89 DCHECK(transport_->socket()->IsConnected()); | 90 DCHECK(transport_->socket()->IsConnected()); |
| 90 DCHECK_EQ(STATE_NONE, next_state_); | 91 DCHECK_EQ(STATE_NONE, next_state_); |
| 91 DCHECK(!user_callback_); | 92 DCHECK(!user_callback_); |
| 92 | 93 |
| 93 // If already connected, then just return OK. | 94 // If already connected, then just return OK. |
| 94 if (completed_handshake_) | 95 if (completed_handshake_) |
| 95 return OK; | 96 return OK; |
| 96 | 97 |
| 97 net_log_ = net_log; | 98 net_log_.BeginEvent(NetLog::TYPE_SOCKS5_CONNECT); |
| 98 net_log.BeginEvent(NetLog::TYPE_SOCKS5_CONNECT); | |
| 99 | 99 |
| 100 next_state_ = STATE_GREET_WRITE; | 100 next_state_ = STATE_GREET_WRITE; |
| 101 buffer_.clear(); | 101 buffer_.clear(); |
| 102 | 102 |
| 103 int rv = DoLoop(OK); | 103 int rv = DoLoop(OK); |
| 104 if (rv == ERR_IO_PENDING) { | 104 if (rv == ERR_IO_PENDING) { |
| 105 user_callback_ = callback; | 105 user_callback_ = callback; |
| 106 } else { | 106 } else { |
| 107 net_log.EndEvent(NetLog::TYPE_SOCKS5_CONNECT); | 107 net_log_.EndEvent(NetLog::TYPE_SOCKS5_CONNECT); |
| 108 net_log_ = BoundNetLog(); | |
| 109 } | 108 } |
| 110 return rv; | 109 return rv; |
| 111 } | 110 } |
| 112 | 111 |
| 113 void SOCKS5ClientSocket::Disconnect() { | 112 void SOCKS5ClientSocket::Disconnect() { |
| 114 completed_handshake_ = false; | 113 completed_handshake_ = false; |
| 115 transport_->socket()->Disconnect(); | 114 transport_->socket()->Disconnect(); |
| 116 | 115 |
| 117 // Reset other states to make sure they aren't mistakenly used later. | 116 // Reset other states to make sure they aren't mistakenly used later. |
| 118 // These are the states initialized by Connect(). | 117 // These are the states initialized by Connect(). |
| 119 next_state_ = STATE_NONE; | 118 next_state_ = STATE_NONE; |
| 120 user_callback_ = NULL; | 119 user_callback_ = NULL; |
| 121 net_log_ = BoundNetLog(); | |
| 122 } | 120 } |
| 123 | 121 |
| 124 bool SOCKS5ClientSocket::IsConnected() const { | 122 bool SOCKS5ClientSocket::IsConnected() const { |
| 125 return completed_handshake_ && transport_->socket()->IsConnected(); | 123 return completed_handshake_ && transport_->socket()->IsConnected(); |
| 126 } | 124 } |
| 127 | 125 |
| 128 bool SOCKS5ClientSocket::IsConnectedAndIdle() const { | 126 bool SOCKS5ClientSocket::IsConnectedAndIdle() const { |
| 129 return completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); | 127 return completed_handshake_ && transport_->socket()->IsConnectedAndIdle(); |
| 130 } | 128 } |
| 131 | 129 |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 CompletionCallback* c = user_callback_; | 166 CompletionCallback* c = user_callback_; |
| 169 user_callback_ = NULL; | 167 user_callback_ = NULL; |
| 170 c->Run(result); | 168 c->Run(result); |
| 171 } | 169 } |
| 172 | 170 |
| 173 void SOCKS5ClientSocket::OnIOComplete(int result) { | 171 void SOCKS5ClientSocket::OnIOComplete(int result) { |
| 174 DCHECK_NE(STATE_NONE, next_state_); | 172 DCHECK_NE(STATE_NONE, next_state_); |
| 175 int rv = DoLoop(result); | 173 int rv = DoLoop(result); |
| 176 if (rv != ERR_IO_PENDING) { | 174 if (rv != ERR_IO_PENDING) { |
| 177 net_log_.EndEvent(NetLog::TYPE_SOCKS5_CONNECT); | 175 net_log_.EndEvent(NetLog::TYPE_SOCKS5_CONNECT); |
| 178 net_log_ = BoundNetLog(); | |
| 179 DoCallback(rv); | 176 DoCallback(rv); |
| 180 } | 177 } |
| 181 } | 178 } |
| 182 | 179 |
| 183 int SOCKS5ClientSocket::DoLoop(int last_io_result) { | 180 int SOCKS5ClientSocket::DoLoop(int last_io_result) { |
| 184 DCHECK_NE(next_state_, STATE_NONE); | 181 DCHECK_NE(next_state_, STATE_NONE); |
| 185 int rv = last_io_result; | 182 int rv = last_io_result; |
| 186 do { | 183 do { |
| 187 State state = next_state_; | 184 State state = next_state_; |
| 188 next_state_ = STATE_NONE; | 185 next_state_ = STATE_NONE; |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 468 | 465 |
| 469 next_state_ = STATE_HANDSHAKE_READ; | 466 next_state_ = STATE_HANDSHAKE_READ; |
| 470 return OK; | 467 return OK; |
| 471 } | 468 } |
| 472 | 469 |
| 473 int SOCKS5ClientSocket::GetPeerAddress(AddressList* address) const { | 470 int SOCKS5ClientSocket::GetPeerAddress(AddressList* address) const { |
| 474 return transport_->socket()->GetPeerAddress(address); | 471 return transport_->socket()->GetPeerAddress(address); |
| 475 } | 472 } |
| 476 | 473 |
| 477 } // namespace net | 474 } // namespace net |
| OLD | NEW |