| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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" | |
| 8 #include "base/bind.h" | 7 #include "base/bind.h" |
| 9 #include "base/callback_helpers.h" | 8 #include "base/callback_helpers.h" |
| 10 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 11 #include "base/sys_byteorder.h" | 10 #include "base/sys_byteorder.h" |
| 12 #include "net/base/io_buffer.h" | 11 #include "net/base/io_buffer.h" |
| 13 #include "net/base/net_util.h" | 12 #include "net/base/net_util.h" |
| 14 #include "net/log/net_log.h" | 13 #include "net/log/net_log.h" |
| 15 #include "net/socket/client_socket_handle.h" | 14 #include "net/socket/client_socket_handle.h" |
| 16 | 15 |
| 17 namespace net { | 16 namespace net { |
| 18 | 17 |
| 19 // Every SOCKS server requests a user-id from the client. It is optional | 18 // Every SOCKS server requests a user-id from the client. It is optional |
| 20 // and we send an empty string. | 19 // and we send an empty string. |
| 21 static const char kEmptyUserId[] = ""; | 20 static const char kEmptyUserId[] = ""; |
| 22 | 21 |
| 23 // For SOCKS4, the client sends 8 bytes plus the size of the user-id. | 22 // For SOCKS4, the client sends 8 bytes plus the size of the user-id. |
| 24 static const unsigned int kWriteHeaderSize = 8; | 23 static const unsigned int kWriteHeaderSize = 8; |
| 25 | 24 |
| 26 // For SOCKS4 the server sends 8 bytes for acknowledgement. | 25 // For SOCKS4 the server sends 8 bytes for acknowledgement. |
| 27 static const unsigned int kReadHeaderSize = 8; | 26 static const unsigned int kReadHeaderSize = 8; |
| 28 | 27 |
| 29 // Server Response codes for SOCKS. | 28 // Server Response codes for SOCKS. |
| 30 static const uint8 kServerResponseOk = 0x5A; | 29 static const uint8_t kServerResponseOk = 0x5A; |
| 31 static const uint8 kServerResponseRejected = 0x5B; | 30 static const uint8_t kServerResponseRejected = 0x5B; |
| 32 static const uint8 kServerResponseNotReachable = 0x5C; | 31 static const uint8_t kServerResponseNotReachable = 0x5C; |
| 33 static const uint8 kServerResponseMismatchedUserId = 0x5D; | 32 static const uint8_t kServerResponseMismatchedUserId = 0x5D; |
| 34 | 33 |
| 35 static const uint8 kSOCKSVersion4 = 0x04; | 34 static const uint8_t kSOCKSVersion4 = 0x04; |
| 36 static const uint8 kSOCKSStreamRequest = 0x01; | 35 static const uint8_t kSOCKSStreamRequest = 0x01; |
| 37 | 36 |
| 38 // A struct holding the essential details of the SOCKS4 Server Request. | 37 // A struct holding the essential details of the SOCKS4 Server Request. |
| 39 // The port in the header is stored in network byte order. | 38 // The port in the header is stored in network byte order. |
| 40 struct SOCKS4ServerRequest { | 39 struct SOCKS4ServerRequest { |
| 41 uint8 version; | 40 uint8_t version; |
| 42 uint8 command; | 41 uint8_t command; |
| 43 uint16 nw_port; | 42 uint16_t nw_port; |
| 44 uint8 ip[4]; | 43 uint8_t ip[4]; |
| 45 }; | 44 }; |
| 46 static_assert(sizeof(SOCKS4ServerRequest) == kWriteHeaderSize, | 45 static_assert(sizeof(SOCKS4ServerRequest) == kWriteHeaderSize, |
| 47 "socks4 server request struct has incorrect size"); | 46 "socks4 server request struct has incorrect size"); |
| 48 | 47 |
| 49 // A struct holding details of the SOCKS4 Server Response. | 48 // A struct holding details of the SOCKS4 Server Response. |
| 50 struct SOCKS4ServerResponse { | 49 struct SOCKS4ServerResponse { |
| 51 uint8 reserved_null; | 50 uint8_t reserved_null; |
| 52 uint8 code; | 51 uint8_t code; |
| 53 uint16 port; | 52 uint16_t port; |
| 54 uint8 ip[4]; | 53 uint8_t ip[4]; |
| 55 }; | 54 }; |
| 56 static_assert(sizeof(SOCKS4ServerResponse) == kReadHeaderSize, | 55 static_assert(sizeof(SOCKS4ServerResponse) == kReadHeaderSize, |
| 57 "socks4 server response struct has incorrect size"); | 56 "socks4 server response struct has incorrect size"); |
| 58 | 57 |
| 59 SOCKSClientSocket::SOCKSClientSocket( | 58 SOCKSClientSocket::SOCKSClientSocket( |
| 60 scoped_ptr<ClientSocketHandle> transport_socket, | 59 scoped_ptr<ClientSocketHandle> transport_socket, |
| 61 const HostResolver::RequestInfo& req_info, | 60 const HostResolver::RequestInfo& req_info, |
| 62 RequestPriority priority, | 61 RequestPriority priority, |
| 63 HostResolver* host_resolver) | 62 HostResolver* host_resolver) |
| 64 : transport_(transport_socket.Pass()), | 63 : transport_(transport_socket.Pass()), |
| (...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 211 | 210 |
| 212 int rv = transport_->socket()->Write( | 211 int rv = transport_->socket()->Write( |
| 213 buf, buf_len, | 212 buf, buf_len, |
| 214 base::Bind(&SOCKSClientSocket::OnReadWriteComplete, | 213 base::Bind(&SOCKSClientSocket::OnReadWriteComplete, |
| 215 base::Unretained(this), callback)); | 214 base::Unretained(this), callback)); |
| 216 if (rv > 0) | 215 if (rv > 0) |
| 217 was_ever_used_ = true; | 216 was_ever_used_ = true; |
| 218 return rv; | 217 return rv; |
| 219 } | 218 } |
| 220 | 219 |
| 221 int SOCKSClientSocket::SetReceiveBufferSize(int32 size) { | 220 int SOCKSClientSocket::SetReceiveBufferSize(int32_t size) { |
| 222 return transport_->socket()->SetReceiveBufferSize(size); | 221 return transport_->socket()->SetReceiveBufferSize(size); |
| 223 } | 222 } |
| 224 | 223 |
| 225 int SOCKSClientSocket::SetSendBufferSize(int32 size) { | 224 int SOCKSClientSocket::SetSendBufferSize(int32_t size) { |
| 226 return transport_->socket()->SetSendBufferSize(size); | 225 return transport_->socket()->SetSendBufferSize(size); |
| 227 } | 226 } |
| 228 | 227 |
| 229 void SOCKSClientSocket::DoCallback(int result) { | 228 void SOCKSClientSocket::DoCallback(int result) { |
| 230 DCHECK_NE(ERR_IO_PENDING, result); | 229 DCHECK_NE(ERR_IO_PENDING, result); |
| 231 DCHECK(!user_callback_.is_null()); | 230 DCHECK(!user_callback_.is_null()); |
| 232 | 231 |
| 233 // Since Run() may result in Read being called, | 232 // Since Run() may result in Read being called, |
| 234 // clear user_callback_ up front. | 233 // clear user_callback_ up front. |
| 235 DVLOG(1) << "Finished setting up SOCKS handshake"; | 234 DVLOG(1) << "Finished setting up SOCKS handshake"; |
| (...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 453 | 452 |
| 454 int SOCKSClientSocket::GetPeerAddress(IPEndPoint* address) const { | 453 int SOCKSClientSocket::GetPeerAddress(IPEndPoint* address) const { |
| 455 return transport_->socket()->GetPeerAddress(address); | 454 return transport_->socket()->GetPeerAddress(address); |
| 456 } | 455 } |
| 457 | 456 |
| 458 int SOCKSClientSocket::GetLocalAddress(IPEndPoint* address) const { | 457 int SOCKSClientSocket::GetLocalAddress(IPEndPoint* address) const { |
| 459 return transport_->socket()->GetLocalAddress(address); | 458 return transport_->socket()->GetLocalAddress(address); |
| 460 } | 459 } |
| 461 | 460 |
| 462 } // namespace net | 461 } // namespace net |
| OLD | NEW |