| Index: src/debug-agent.cc
|
| ===================================================================
|
| --- src/debug-agent.cc (revision 1579)
|
| +++ src/debug-agent.cc (working copy)
|
| @@ -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>();
|
| - }
|
| + 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.
|
|
|
| - // Check for end of header line.
|
| - if (c == '\n') {
|
| - // Empty header line.
|
| - if (header_buffer_position == 0) {
|
| - continue;
|
| + // 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;
|
| }
|
| + }
|
|
|
| - // 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;
|
| + // Check for end of header (empty header line).
|
| + if (header_buffer_position == 2) { // Receive buffer contains CRLF.
|
| + 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.
|
|
|