NodeDebugger::NodeDebugger()
: thread_("NodeDebugger"),
+ content_length_(-1),
weak_factory_(this) {
bool use_debug_agent = false;
int port = 5858;
void NodeDebugger::DidAccept(net::StreamListenSocket* server,
scoped_ptr<net::StreamListenSocket> 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();
}
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<size_t>(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) {
#ifndef ATOM_BROWSER_NODE_DEBUGGER_H_
#define ATOM_BROWSER_NODE_DEBUGGER_H_
+#include <string>
+
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
#include "base/threading/thread.h"
scoped_ptr<net::StreamListenSocket> server_;
scoped_ptr<net::StreamListenSocket> accepted_socket_;
+ std::string buffer_;
+ int content_length_;
+
base::WeakPtrFactory<NodeDebugger> weak_factory_;
DISALLOW_COPY_AND_ASSIGN(NodeDebugger);