Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(662)

Side by Side Diff: src/debug-agent.cc

Issue 52012: Extend debugger agent protocol with a connect message (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/debug-agent.h ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2009 the V8 project authors. All rights reserved. 1 // Copyright 2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after
143 // Terminate the session. 143 // Terminate the session.
144 ScopedLock with(session_access_); 144 ScopedLock with(session_access_);
145 ASSERT(session == session_); 145 ASSERT(session == session_);
146 if (session == session_) { 146 if (session == session_) {
147 CloseSession(); 147 CloseSession();
148 } 148 }
149 } 149 }
150 150
151 151
152 void DebuggerAgentSession::Run() { 152 void DebuggerAgentSession::Run() {
153 // Send the hello message.
154 bool ok = DebuggerAgentUtil::SendConnectMessage(client_, *agent_->name_);
155 if (!ok) return;
156
153 while (true) { 157 while (true) {
154 // Read data from the debugger front end. 158 // Read data from the debugger front end.
155 SmartPointer<char> message = DebuggerAgentUtil::ReceiveMessage(client_); 159 SmartPointer<char> message = DebuggerAgentUtil::ReceiveMessage(client_);
156 if (*message == NULL) { 160 if (*message == NULL) {
157 // Session is closed. 161 // Session is closed.
158 agent_->OnSessionClosed(this); 162 agent_->OnSessionClosed(this);
159 return; 163 return;
160 } 164 }
161 165
162 // Convert UTF-8 to UTF-16. 166 // Convert UTF-8 to UTF-16.
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
245 if (strlen(value) > 7) { 249 if (strlen(value) > 7) {
246 return SmartPointer<char>(); 250 return SmartPointer<char>();
247 } 251 }
248 for (int i = 0; value[i] != '\0'; i++) { 252 for (int i = 0; value[i] != '\0'; i++) {
249 // Bail out if illegal data. 253 // Bail out if illegal data.
250 if (value[i] < '0' || value[i] > '9') { 254 if (value[i] < '0' || value[i] > '9') {
251 return SmartPointer<char>(); 255 return SmartPointer<char>();
252 } 256 }
253 content_length = 10 * content_length + (value[i] - '0'); 257 content_length = 10 * content_length + (value[i] - '0');
254 } 258 }
259 } else {
260 // For now just print all other headers than Content-Length.
261 PrintF("%s: %s\n", key, value);
255 } 262 }
256 263
257 // Start collecting new header. 264 // Start collecting new header.
258 header_buffer_position = 0; 265 header_buffer_position = 0;
259 } else { 266 } else {
260 // Add character to header buffer (reserve room for terminating '\0'). 267 // Add character to header buffer (reserve room for terminating '\0').
261 if (header_buffer_position < kHeaderBufferSize - 1) { 268 if (header_buffer_position < kHeaderBufferSize - 1) {
262 header_buffer[header_buffer_position++] = c; 269 header_buffer[header_buffer_position++] = c;
263 } 270 }
264 } 271 }
265 } 272 }
266 273
274 // Return now if no body.
275 if (content_length == 0) {
276 return SmartPointer<char>();
277 }
278
267 // Read body. 279 // Read body.
268 char* buffer = NewArray<char>(content_length + 1); 280 char* buffer = NewArray<char>(content_length + 1);
269 received = ReceiveAll(conn, buffer, content_length); 281 received = ReceiveAll(conn, buffer, content_length);
270 if (received < content_length) { 282 if (received < content_length) {
271 PrintF("Error %d\n", Socket::LastError()); 283 PrintF("Error %d\n", Socket::LastError());
272 return SmartPointer<char>(); 284 return SmartPointer<char>();
273 } 285 }
274 buffer[content_length] = '\0'; 286 buffer[content_length] = '\0';
275 287
276 return SmartPointer<char>(buffer); 288 return SmartPointer<char>(buffer);
277 } 289 }
278 290
279 291
292 bool DebuggerAgentUtil::SendConnectMessage(const Socket* conn,
293 const char* embedding_host) {
294 static const int kBufferSize = 80;
295 char buffer[kBufferSize]; // Sending buffer.
296 bool ok;
297 int len;
298
299 // Send the header.
300 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
301 "Type: connect\n");
302 ok = conn->Send(buffer, len);
303 if (!ok) return false;
304
305 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
306 "V8-Version: %s\n", v8::V8::GetVersion());
307 ok = conn->Send(buffer, len);
308 if (!ok) return false;
309
310 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
311 "Protocol-Version: 1\n");
312 ok = conn->Send(buffer, len);
313 if (!ok) return false;
314
315 if (embedding_host != NULL) {
316 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
317 "Embedding-Host: %s\n", embedding_host);
318 ok = conn->Send(buffer, len);
319 if (!ok) return false;
320 }
321
322 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
323 "%s: 0\n", kContentLength);
324 ok = conn->Send(buffer, len);
325 if (!ok) return false;
326
327 // Terminate header with empty line.
328 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n");
329 ok = conn->Send(buffer, len);
330 if (!ok) return false;
331
332 // No body for connect message.
333
334 return true;
335 }
336
337
280 bool DebuggerAgentUtil::SendMessage(const Socket* conn, 338 bool DebuggerAgentUtil::SendMessage(const Socket* conn,
281 const Vector<uint16_t> message) { 339 const Vector<uint16_t> message) {
282 static const int kBufferSize = 80; 340 static const int kBufferSize = 80;
283 char buffer[kBufferSize]; // Sending buffer both for header and body. 341 char buffer[kBufferSize]; // Sending buffer both for header and body.
284 342
285 // Calculate the message size in UTF-8 encoding. 343 // Calculate the message size in UTF-8 encoding.
286 int utf8_len = 0; 344 int utf8_len = 0;
287 for (int i = 0; i < message.length(); i++) { 345 for (int i = 0; i < message.length(); i++) {
288 utf8_len += unibrow::Utf8::Length(message[i]); 346 utf8_len += unibrow::Utf8::Length(message[i]);
289 } 347 }
290 348
291 // Send the header. 349 // Send the header.
292 int len; 350 int len;
293 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), 351 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize),
294 "Content-Length: %d\n", utf8_len); 352 "%s: %d\n", kContentLength, utf8_len);
295 conn->Send(buffer, len); 353 conn->Send(buffer, len);
296 354
297 // Terminate header with empty line. 355 // Terminate header with empty line.
298 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n"); 356 len = OS::SNPrintF(Vector<char>(buffer, kBufferSize), "\n");
299 conn->Send(buffer, len); 357 conn->Send(buffer, len);
300 358
301 // Send message body as UTF-8. 359 // Send message body as UTF-8.
302 int buffer_position = 0; // Current buffer position. 360 int buffer_position = 0; // Current buffer position.
303 for (int i = 0; i < message.length(); i++) { 361 for (int i = 0; i < message.length(); i++) {
304 // Write next UTF-8 encoded character to buffer. 362 // Write next UTF-8 encoded character to buffer.
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
350 if (received <= 0) { 408 if (received <= 0) {
351 return total_received; 409 return total_received;
352 } 410 }
353 total_received += received; 411 total_received += received;
354 } 412 }
355 return total_received; 413 return total_received;
356 } 414 }
357 415
358 416
359 } } // namespace v8::internal 417 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/debug-agent.h ('k') | test/cctest/test-debug.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698