Author: [email protected]
Date: Tue Mar 24 03:15:02 2009
New Revision: 1588

Modified:
    branches/bleeding_edge/src/debug-agent.cc

Log:
Change the debugger agent protocol to be RFC-822 compilant.

All headers are now terminated with CRLF and not jusr LF. The beginning of  
the body is indicated by an empty header (just CRLF).
Review URL: http://codereview.chromium.org/42553

Modified: branches/bleeding_edge/src/debug-agent.cc
==============================================================================
--- branches/bleeding_edge/src/debug-agent.cc   (original)
+++ branches/bleeding_edge/src/debug-agent.cc   Tue Mar 24 03:15:02 2009
@@ -96,7 +96,7 @@

    // If another session is already established terminate this one.
    if (session_ != NULL) {
-    static const char* message = "Remote debugging session already  
active\n";
+    static const char* message = "Remote debugging session already  
active\r\n";

      client->Send(message, strlen(message));
      delete client;
@@ -202,72 +202,69 @@
    int received;

    // Read header.
-  const int kHeaderBufferSize = 80;
-  char header_buffer[kHeaderBufferSize];
-  int header_buffer_position = 0;
-  char c = '\0';  // One character receive buffer.
-  char last_c = '\0';  // Previous character.
    int content_length = 0;
-  while (!(c == '\n' && last_c == '\n')) {
-    last_c = c;
-    received = conn->Receive(&c, 1);
-    if (received <= 0) {
-      PrintF("Error %d\n", Socket::LastError());
-      return SmartPointer<char>();
-    }
-
-    // Check for end of header line.
-    if (c == '\n') {
-      // Empty header line.
-      if (header_buffer_position == 0) {
-        continue;
+  while (true) {
+    const int kHeaderBufferSize = 80;
+    char header_buffer[kHeaderBufferSize];
+    int header_buffer_position = 0;
+    char c = '\0';  // One character receive buffer.
+    char prev_c = '\0';  // Previous character.
+
+    // Read until CRLF.
+    while (!(c == '\n' && prev_c == '\r')) {
+      prev_c = c;
+      received = conn->Receive(&c, 1);
+      if (received <= 0) {
+        PrintF("Error %d\n", Socket::LastError());
+        return SmartPointer<char>();
        }

-      // Terminate header.
-      ASSERT(header_buffer_position < kHeaderBufferSize);
+      // Add character to header buffer.
        if (header_buffer_position < kHeaderBufferSize) {
-        header_buffer[header_buffer_position] = '\0';
+        header_buffer[header_buffer_position++] = c;
        }
+    }
+
+    // Check for end of header (empty header line).
+    if (header_buffer_position == 2) {  // Receive buffer contains CRLF.
+      break;
+    }

-      // Split header.
-      char* key = header_buffer;
-      char* value = NULL;
-      for (int i = 0; i < header_buffer_position; i++) {
-        if (header_buffer[i] == ':') {
-          header_buffer[i] = '\0';
-          value = header_buffer + i + 1;
-          while (*value == ' ') {
-            value++;
-          }
-          break;
+    // Terminate header.
+    ASSERT(header_buffer_position > 1);  // At least CRLF is received.
+    ASSERT(header_buffer_position <= kHeaderBufferSize);
+    header_buffer[header_buffer_position - 2] = '\0';
+
+    // Split header.
+    char* key = header_buffer;
+    char* value = NULL;
+    for (int i = 0; header_buffer[i] != '\0'; i++) {
+      if (header_buffer[i] == ':') {
+        header_buffer[i] = '\0';
+        value = header_buffer + i + 1;
+        while (*value == ' ') {
+          value++;
          }
+        break;
        }
+    }

-      // Check that key is Content-Length.
-      if (strcmp(key, kContentLength) == 0) {
-        // Get the content length value if within a sensible range.
-        if (strlen(value) > 7) {
+    // Check that key is Content-Length.
+    if (strcmp(key, kContentLength) == 0) {
+      // Get the content length value if within a sensible range.
+      if (strlen(value) > 7) {
+        return SmartPointer<char>();
+      }
+      for (int i = 0; value[i] != '\0'; i++) {
+        // Bail out if illegal data.
+        if (value[i] < '0' || value[i] > '9') {
            return SmartPointer<char>();
          }
-        for (int i = 0; value[i] != '\0'; i++) {
-          // Bail out if illegal data.
-          if (value[i] < '0' || value[i] > '9') {
-            return SmartPointer<char>();
-          }
-          content_length = 10 * content_length + (value[i] - '0');
-        }
-      } else {
-        // For now just print all other headers than Content-Length.
-        PrintF("%s: %s\n", key, value);
+        content_length = 10 * content_length + (value[i] - '0');
        }
-
-      // Start collecting new header.
-      header_buffer_position = 0;
      } else {
-      // Add character to header buffer (reserve room for  
terminating '\0').
-      if (header_buffer_position < kHeaderBufferSize - 1) {
-        header_buffer[header_buffer_position++] = c;
-      }
+      // For now just print all other headers than Content-Length.
+      PrintF("%s: %s\n", key, value != NULL ? value : "(no value)");
      }
    }

@@ -298,34 +295,34 @@

    // Send the header.
    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "Type: connect\n");
+                     "Type: connect\r\n");
    ok = conn->Send(buffer, len);
    if (!ok) return false;

    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "V8-Version: %s\n", v8::V8::GetVersion());
+                     "V8-Version: %s\r\n", v8::V8::GetVersion());
    ok = conn->Send(buffer, len);
    if (!ok) return false;

    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "Protocol-Version: 1\n");
+                     "Protocol-Version: 1\r\n");
    ok = conn->Send(buffer, len);
    if (!ok) return false;

    if (embedding_host != NULL) {
      len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                       "Embedding-Host: %s\n", embedding_host);
+                       "Embedding-Host: %s\r\n", embedding_host);
      ok = conn->Send(buffer, len);
      if (!ok) return false;
    }

    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "%s: 0\n", kContentLength);
+                     "%s: 0\r\n", kContentLength);
    ok = conn->Send(buffer, len);
    if (!ok) return false;

    // Terminate header with empty line.
-  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n");
+  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\r\n");
    ok = conn->Send(buffer, len);
    if (!ok) return false;

@@ -349,11 +346,11 @@
    // Send the header.
    int len;
    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "%s: %d\n", kContentLength, utf8_len);
+                     "%s: %d\r\n", kContentLength, utf8_len);
    conn->Send(buffer, len);

    // Terminate header with empty line.
-  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n");
+  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\r\n");
    conn->Send(buffer, len);

    // Send message body as UTF-8.
@@ -386,11 +383,11 @@
    // Send the header.
    int len;
    len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
-                     "Content-Length: %d\n", utf8_request.length());
+                     "Content-Length: %d\r\n", utf8_request.length());
    conn->Send(buffer, len);

    // Terminate header with empty line.
-  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n");
+  len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\r\n");
    conn->Send(buffer, len);

    // Send message body as UTF-8.

--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---

Reply via email to