diff --git a/atom/browser/node_debugger.cc b/atom/browser/node_debugger.cc index 7c45bfa6e0f1..e554e97afb2f 100644 --- a/atom/browser/node_debugger.cc +++ b/atom/browser/node_debugger.cc @@ -17,6 +17,7 @@ namespace atom { NodeDebugger::NodeDebugger() : thread_("NodeDebugger"), + content_length_(-1), weak_factory_(this) { bool use_debug_agent = false; int port = 5858; @@ -69,8 +70,10 @@ void NodeDebugger::StartServer(int port) { void NodeDebugger::DidAccept(net::StreamListenSocket* server, scoped_ptr socket) { // Only accept one session. - if (accepted_socket_) + if (accepted_socket_) { + socket->Send(std::string("Remote debugging session already active"), true); return; + } accepted_socket_ = socket.Pass(); } @@ -78,6 +81,38 @@ void NodeDebugger::DidAccept(net::StreamListenSocket* server, void NodeDebugger::DidRead(net::StreamListenSocket* socket, const char* data, int len) { + buffer_.append(data, len); + + do { + if (buffer_.size() == 0) + return; + + // Read the "Content-Length" header. + if (content_length_ < 0) { + size_t pos = buffer_.find("\r\n\r\n"); + if (pos == std::string::npos) + return; + + // We can be sure that the header is "Content-Length: xxx\r\n". + std::string content_length = buffer_.substr(16, pos - 16); + if (!base::StringToInt(content_length, &content_length_)) { + DidClose(accepted_socket_.get()); + return; + } + + // Strip header from buffer. + buffer_ = buffer_.substr(pos + 4); + } + + // Read the message. + if (buffer_.size() >= static_cast(content_length_)) { + std::string message = buffer_.substr(0, content_length_); + buffer_ = buffer_.substr(content_length_); + + // Get ready for next message. + content_length_ = -1; + } + } while (true); } void NodeDebugger::DidClose(net::StreamListenSocket* socket) { diff --git a/atom/browser/node_debugger.h b/atom/browser/node_debugger.h index 818a8471302b..2c45e755fe94 100644 --- a/atom/browser/node_debugger.h +++ b/atom/browser/node_debugger.h @@ -5,6 +5,8 @@ #ifndef ATOM_BROWSER_NODE_DEBUGGER_H_ #define ATOM_BROWSER_NODE_DEBUGGER_H_ +#include + #include "base/memory/scoped_ptr.h" #include "base/memory/weak_ptr.h" #include "base/threading/thread.h" @@ -33,6 +35,9 @@ class NodeDebugger : public net::StreamListenSocket::Delegate { scoped_ptr server_; scoped_ptr accepted_socket_; + std::string buffer_; + int content_length_; + base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(NodeDebugger);