| 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 "base/compiler_specific.h" | 8 #include "base/compiler_specific.h" |
| 9 #include "base/trace_event.h" | 9 #include "base/trace_event.h" |
| 10 #include "net/base/io_buffer.h" | 10 #include "net/base/io_buffer.h" |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 348 int SOCKSClientSocket::DoHandshakeReadComplete(int result) { | 348 int SOCKSClientSocket::DoHandshakeReadComplete(int result) { |
| 349 DCHECK_NE(kSOCKS4Unresolved, socks_version_); | 349 DCHECK_NE(kSOCKS4Unresolved, socks_version_); |
| 350 | 350 |
| 351 if (result < 0) | 351 if (result < 0) |
| 352 return result; | 352 return result; |
| 353 | 353 |
| 354 // The underlying socket closed unexpectedly. | 354 // The underlying socket closed unexpectedly. |
| 355 if (result == 0) | 355 if (result == 0) |
| 356 return ERR_CONNECTION_CLOSED; | 356 return ERR_CONNECTION_CLOSED; |
| 357 | 357 |
| 358 if (bytes_received_ + result > kReadHeaderSize) | 358 if (bytes_received_ + result > kReadHeaderSize) { |
| 359 return ERR_INVALID_RESPONSE; | 359 // TODO(eroman): Describe failure in LoadLog. |
| 360 return ERR_SOCKS_CONNECTION_FAILED; |
| 361 } |
| 360 | 362 |
| 361 buffer_.append(handshake_buf_->data(), result); | 363 buffer_.append(handshake_buf_->data(), result); |
| 362 bytes_received_ += result; | 364 bytes_received_ += result; |
| 363 if (bytes_received_ < kReadHeaderSize) { | 365 if (bytes_received_ < kReadHeaderSize) { |
| 364 next_state_ = STATE_HANDSHAKE_READ; | 366 next_state_ = STATE_HANDSHAKE_READ; |
| 365 return OK; | 367 return OK; |
| 366 } | 368 } |
| 367 | 369 |
| 368 const SOCKS4ServerResponse* response = | 370 const SOCKS4ServerResponse* response = |
| 369 reinterpret_cast<const SOCKS4ServerResponse*>(buffer_.data()); | 371 reinterpret_cast<const SOCKS4ServerResponse*>(buffer_.data()); |
| 370 | 372 |
| 371 if (response->reserved_null != 0x00) { | 373 if (response->reserved_null != 0x00) { |
| 372 LOG(ERROR) << "Unknown response from SOCKS server."; | 374 LOG(ERROR) << "Unknown response from SOCKS server."; |
| 373 return ERR_INVALID_RESPONSE; | 375 return ERR_SOCKS_CONNECTION_FAILED; |
| 374 } | 376 } |
| 375 | 377 |
| 376 // TODO(arindam): Add SOCKS specific failure codes in net_error_list.h | |
| 377 switch (response->code) { | 378 switch (response->code) { |
| 378 case kServerResponseOk: | 379 case kServerResponseOk: |
| 379 completed_handshake_ = true; | 380 completed_handshake_ = true; |
| 380 return OK; | 381 return OK; |
| 381 case kServerResponseRejected: | 382 case kServerResponseRejected: |
| 382 LOG(ERROR) << "SOCKS request rejected or failed"; | 383 LOG(ERROR) << "SOCKS request rejected or failed"; |
| 383 return ERR_FAILED; | 384 return ERR_SOCKS_CONNECTION_FAILED; |
| 384 case kServerResponseNotReachable: | 385 case kServerResponseNotReachable: |
| 385 LOG(ERROR) << "SOCKS request failed because client is not running " | 386 LOG(ERROR) << "SOCKS request failed because client is not running " |
| 386 << "identd (or not reachable from the server)"; | 387 << "identd (or not reachable from the server)"; |
| 387 return ERR_NAME_NOT_RESOLVED; | 388 return ERR_SOCKS_CONNECTION_HOST_UNREACHABLE; |
| 388 case kServerResponseMismatchedUserId: | 389 case kServerResponseMismatchedUserId: |
| 389 LOG(ERROR) << "SOCKS request failed because client's identd could " | 390 LOG(ERROR) << "SOCKS request failed because client's identd could " |
| 390 << "not confirm the user ID string in the request"; | 391 << "not confirm the user ID string in the request"; |
| 391 return ERR_FAILED; | 392 return ERR_SOCKS_CONNECTION_FAILED; |
| 392 default: | 393 default: |
| 393 LOG(ERROR) << "SOCKS server sent unknown response"; | 394 LOG(ERROR) << "SOCKS server sent unknown response"; |
| 394 return ERR_INVALID_RESPONSE; | 395 return ERR_SOCKS_CONNECTION_FAILED; |
| 395 } | 396 } |
| 396 | 397 |
| 397 // Note: we ignore the last 6 bytes as specified by the SOCKS protocol | 398 // Note: we ignore the last 6 bytes as specified by the SOCKS protocol |
| 398 } | 399 } |
| 399 | 400 |
| 400 int SOCKSClientSocket::GetPeerName(struct sockaddr* name, | 401 int SOCKSClientSocket::GetPeerName(struct sockaddr* name, |
| 401 socklen_t* namelen) { | 402 socklen_t* namelen) { |
| 402 return transport_->GetPeerName(name, namelen); | 403 return transport_->GetPeerName(name, namelen); |
| 403 } | 404 } |
| 404 | 405 |
| 405 } // namespace net | 406 } // namespace net |
| OLD | NEW |