| Index: chrome/browser/debugger/devtools_remote_listen_socket.cc
|
| diff --git a/chrome/browser/debugger/devtools_remote_listen_socket.cc b/chrome/browser/debugger/devtools_remote_listen_socket.cc
|
| deleted file mode 100644
|
| index f78d369f5b0ba72e9f4c9fb7546992d9fb41b03f..0000000000000000000000000000000000000000
|
| --- a/chrome/browser/debugger/devtools_remote_listen_socket.cc
|
| +++ /dev/null
|
| @@ -1,258 +0,0 @@
|
| -// Copyright (c) 2011 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -#include "chrome/browser/debugger/devtools_remote_listen_socket.h"
|
| -
|
| -#include "build/build_config.h"
|
| -
|
| -#include <stdlib.h>
|
| -
|
| -#if defined(OS_WIN)
|
| -// winsock2.h must be included first in order to ensure it is included before
|
| -// windows.h.
|
| -#include <winsock2.h>
|
| -#elif defined(OS_POSIX)
|
| -#include <errno.h>
|
| -#include <sys/socket.h>
|
| -#endif
|
| -
|
| -#include "base/compiler_specific.h"
|
| -#include "base/eintr_wrapper.h"
|
| -#include "base/string_number_conversions.h"
|
| -#include "base/threading/platform_thread.h"
|
| -#include "chrome/browser/debugger/devtools_remote.h"
|
| -#include "chrome/browser/debugger/devtools_remote_message.h"
|
| -
|
| -#define CONSUME_BUFFER_CHAR \
|
| - pBuf++;\
|
| - len--
|
| -
|
| -#if defined(OS_POSIX)
|
| -// Used same name as in Windows to avoid #ifdef where refrenced
|
| -#define SOCKET int
|
| -const int INVALID_SOCKET = -1;
|
| -const int SOCKET_ERROR = -1;
|
| -#endif
|
| -
|
| -const int kReadBufSize = 200;
|
| -
|
| -DevToolsRemoteListenSocket::DevToolsRemoteListenSocket(
|
| - SOCKET s,
|
| - DevToolsRemoteListener* message_listener)
|
| - : ALLOW_THIS_IN_INITIALIZER_LIST(net::ListenSocket(s, this)),
|
| - state_(HANDSHAKE),
|
| - remaining_payload_length_(0),
|
| - message_listener_(message_listener),
|
| - cr_received_(false) {}
|
| -
|
| -void DevToolsRemoteListenSocket::StartNextField() {
|
| - switch (state_) {
|
| - case INVALID:
|
| - state_ = HANDSHAKE;
|
| - break;
|
| - case HANDSHAKE:
|
| - state_ = HEADERS;
|
| - break;
|
| - case HEADERS:
|
| - if (protocol_field_.empty()) { // empty line - end of headers
|
| - const std::string& payload_length_string = GetHeader(
|
| - DevToolsRemoteMessageHeaders::kContentLength, "0");
|
| - base::StringToInt(payload_length_string, &remaining_payload_length_);
|
| - state_ = PAYLOAD;
|
| - if (remaining_payload_length_ == 0) { // no payload
|
| - DispatchField();
|
| - return;
|
| - }
|
| - }
|
| - break;
|
| - case PAYLOAD:
|
| - header_map_.clear();
|
| - payload_.clear();
|
| - state_ = HEADERS;
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - protocol_field_.clear();
|
| -}
|
| -
|
| -DevToolsRemoteListenSocket::~DevToolsRemoteListenSocket() {}
|
| -
|
| -DevToolsRemoteListenSocket*
|
| - DevToolsRemoteListenSocket::Listen(const std::string& ip,
|
| - int port,
|
| - DevToolsRemoteListener* listener) {
|
| - SOCKET s = net::ListenSocket::Listen(ip, port);
|
| - if (s == INVALID_SOCKET) {
|
| - // TODO(apavlov): error handling
|
| - } else {
|
| - DevToolsRemoteListenSocket* sock =
|
| - new DevToolsRemoteListenSocket(s, listener);
|
| - sock->Listen();
|
| - return sock;
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::DidAccept(net::ListenSocket *server,
|
| - net::ListenSocket *connection) {
|
| - connection->AddRef();
|
| - message_listener_->OnAcceptConnection(connection);
|
| -}
|
| -
|
| -// Dispatches data from socket to socket_delegate_, extracting messages
|
| -// delimited by newlines.
|
| -void DevToolsRemoteListenSocket::DidRead(net::ListenSocket* connection,
|
| - const char* pBuf,
|
| - int len) {
|
| - while (len > 0) {
|
| - if (state_ != PAYLOAD) {
|
| - if (cr_received_ && *pBuf == '\n') {
|
| - cr_received_ = false;
|
| - CONSUME_BUFFER_CHAR;
|
| - } else {
|
| - while (*pBuf != '\r' && len > 0) {
|
| - protocol_field_.push_back(*pBuf);
|
| - CONSUME_BUFFER_CHAR;
|
| - }
|
| - if (*pBuf == '\r') {
|
| - cr_received_ = true;
|
| - CONSUME_BUFFER_CHAR;
|
| - }
|
| - continue;
|
| - }
|
| - switch (state_) {
|
| - case HANDSHAKE:
|
| - case HEADERS:
|
| - DispatchField();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - } else { // PAYLOAD
|
| - while (remaining_payload_length_ > 0 && len > 0) {
|
| - protocol_field_.push_back(*pBuf);
|
| - CONSUME_BUFFER_CHAR;
|
| - remaining_payload_length_--;
|
| - }
|
| - if (remaining_payload_length_ == 0) {
|
| - DispatchField();
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::DidClose(net::ListenSocket *connection) {
|
| - message_listener_->OnConnectionLost();
|
| - connection->Release();
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::DispatchField() {
|
| - const std::string kHandshakeString = "ChromeDevToolsHandshake";
|
| - switch (state_) {
|
| - case HANDSHAKE:
|
| - if (protocol_field_ != kHandshakeString) {
|
| - state_ = INVALID;
|
| - } else {
|
| - Send(kHandshakeString, true);
|
| - }
|
| - break;
|
| - case HEADERS: {
|
| - if (!protocol_field_.empty()) { // not end-of-headers
|
| - std::string::size_type colon_pos = protocol_field_.find_first_of(":");
|
| - if (colon_pos == std::string::npos) {
|
| - // TODO(apavlov): handle the error (malformed header)
|
| - } else {
|
| - const std::string header_name = protocol_field_.substr(0, colon_pos);
|
| - std::string header_val = protocol_field_.substr(colon_pos + 1);
|
| - header_map_[header_name] = header_val;
|
| - }
|
| - }
|
| - break;
|
| - }
|
| - case PAYLOAD:
|
| - payload_ = protocol_field_;
|
| - HandleMessage();
|
| - break;
|
| - default:
|
| - NOTREACHED();
|
| - break;
|
| - }
|
| - StartNextField();
|
| -}
|
| -
|
| -const std::string& DevToolsRemoteListenSocket::GetHeader(
|
| - const std::string& header_name,
|
| - const std::string& default_value) const {
|
| - DevToolsRemoteMessage::HeaderMap::const_iterator it =
|
| - header_map_.find(header_name);
|
| - if (it == header_map_.end()) {
|
| - return default_value;
|
| - }
|
| - return it->second;
|
| -}
|
| -
|
| -// Handle header_map_ and payload_
|
| -void DevToolsRemoteListenSocket::HandleMessage() {
|
| - if (message_listener_ != NULL) {
|
| - DevToolsRemoteMessage message(header_map_, payload_);
|
| - message_listener_->HandleMessage(message);
|
| - }
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::Listen() {
|
| - net::ListenSocket::Listen();
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::Accept() {
|
| - SOCKET conn = net::ListenSocket::Accept(socket_);
|
| - if (conn != INVALID_SOCKET) {
|
| - scoped_refptr<DevToolsRemoteListenSocket> sock(
|
| - new DevToolsRemoteListenSocket(conn,
|
| - message_listener_));
|
| - // it's up to the delegate to AddRef if it wants to keep it around
|
| -#if defined(OS_POSIX)
|
| - sock->WatchSocket(WAITING_READ);
|
| -#endif
|
| - socket_delegate_->DidAccept(this, sock);
|
| - } else {
|
| - // TODO(apavlov): some error handling required here
|
| - }
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::SendInternal(const char* bytes, int len) {
|
| - char* send_buf = const_cast<char *>(bytes);
|
| - int len_left = len;
|
| - while (true) {
|
| - int sent = HANDLE_EINTR(send(socket_, send_buf, len_left, 0));
|
| - if (sent == len_left) { // A shortcut to avoid extraneous checks.
|
| - break;
|
| - }
|
| - if (sent == kSocketError) {
|
| -#if defined(OS_WIN)
|
| - if (WSAGetLastError() != WSAEWOULDBLOCK) {
|
| - LOG(ERROR) << "send failed: WSAGetLastError()==" << WSAGetLastError();
|
| -#elif defined(OS_POSIX)
|
| - if (errno != EWOULDBLOCK && errno != EAGAIN) {
|
| - LOG(ERROR) << "send failed: errno==" << errno;
|
| -#endif
|
| - break;
|
| - }
|
| - // Otherwise we would block, and now we have to wait for a retry.
|
| - // Fall through to PlatformThread::YieldCurrentThread()
|
| - } else {
|
| - // sent != len_left according to the shortcut above.
|
| - // Shift the buffer start and send the remainder after a short while.
|
| - send_buf += sent;
|
| - len_left -= sent;
|
| - }
|
| - base::PlatformThread::YieldCurrentThread();
|
| - }
|
| -}
|
| -
|
| -void DevToolsRemoteListenSocket::Close() {
|
| - net::ListenSocket::Close();
|
| -}
|
|
|