aboutsummaryrefslogtreecommitdiffstats
path: root/components/debugger/lib.rs
diff options
context:
space:
mode:
authorEddy Bruel <ejpbruel@mozilla.com>2016-09-06 12:23:00 +0200
committerEddy Bruel <ejpbruel@mozilla.com>2016-09-12 11:02:09 +0200
commit8856671f2e6d66ee0fd85cc6aab63a615351c288 (patch)
treed6ae504719330ff58ee847fa29439379ce7a24cb /components/debugger/lib.rs
parent77651959e2ccab73d6785a67e242d85445e81dfb (diff)
downloadservo-8856671f2e6d66ee0fd85cc6aab63a615351c288.tar.gz
servo-8856671f2e6d66ee0fd85cc6aab63a615351c288.zip
Implement a WebSocket server for debugging.
Diffstat (limited to 'components/debugger/lib.rs')
-rw-r--r--components/debugger/lib.rs50
1 files changed, 50 insertions, 0 deletions
diff --git a/components/debugger/lib.rs b/components/debugger/lib.rs
new file mode 100644
index 00000000000..d2f9713c4f9
--- /dev/null
+++ b/components/debugger/lib.rs
@@ -0,0 +1,50 @@
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+extern crate util;
+extern crate websocket;
+
+use util::thread::spawn_named;
+use websocket::{Message, Receiver, Sender, Server};
+use websocket::message::Type;
+
+pub fn start_server(port: u16) {
+ println!("Starting debugger server.");
+ spawn_named("debugger-server".to_owned(), move || {
+ run_server(port)
+ });
+}
+
+fn run_server(port: u16) {
+ let server = Server::bind(("127.0.0.1", port)).unwrap();
+ for connection in server {
+ spawn_named("debugger-connection".to_owned(), move || {
+ let connection = connection.unwrap();
+ let request = connection.read_request().unwrap();
+ let response = request.accept();
+ let client = response.send().unwrap();
+ let (mut sender, mut receiver) = client.split();
+ for message in receiver.incoming_messages() {
+ let message: Message = message.unwrap();
+ match message.opcode {
+ Type::Close => {
+ let message = Message::close();
+ sender.send_message(&message).unwrap();
+ break;
+ }
+ Type::Ping => {
+ let message = Message::pong(message.payload);
+ sender.send_message(&message).unwrap();
+ }
+ Type::Text => {
+ sender.send_message(&message).unwrap();
+ }
+ _ => {
+ panic!("Unexpected message type.");
+ }
+ }
+ }
+ });
+ }
+}