Pass header sent from client.
authorCheng Zhao <zcbenz@gmail.com>
Fri, 5 Sep 2014 01:39:28 +0000 (09:39 +0800)
committerCheng Zhao <zcbenz@gmail.com>
Fri, 5 Sep 2014 01:39:28 +0000 (09:39 +0800)
atom/browser/node_debugger.cc
atom/browser/node_debugger.h

index 7c45bfa..e554e97 100644 (file)
@@ -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<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();
 }
@@ -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<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) {
index 818a847..2c45e75 100644 (file)
@@ -5,6 +5,8 @@
 #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"
@@ -33,6 +35,9 @@ class NodeDebugger : public net::StreamListenSocket::Delegate {
   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);