Skip to content
This repository has been archived by the owner on Mar 27, 2018. It is now read-only.

Commit

Permalink
- Implemented the hijacking of an existing http server.
Browse files Browse the repository at this point in the history
- EchoServer example now also servers the client for you.

This changeset means that node-websocket-server can hijack a http.Server from say, Connect, and serve up websockets when needed and let Connect do the rest.
  • Loading branch information
miksago committed Jul 7, 2010
1 parent 0ab78e9 commit d344590
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 27 deletions.
48 changes: 35 additions & 13 deletions examples/echo-server.js
@@ -1,5 +1,8 @@
var sys = require("sys");
var ws = require('../lib/ws');
var sys = require("sys")
, fs = require("fs")
, path = require("path")
, http = require("http")
, ws = require('../lib/ws');

/*-----------------------------------------------
logging:
Expand Down Expand Up @@ -27,13 +30,38 @@ function log(msg) {
sys.puts(timestamp() + ' - ' + msg.toString());
};

function serveFile(req, res){
if( req.url.indexOf("favicon") > -1 ){
log("HTTP: inbound request, served nothing, (favicon)");

res.writeHead(200, {'Content-Type': 'image/x-icon'});
res.end("");
} else {
log("HTTP: inbound request, served client.html");

res.writeHead(200, {'Content-Type': 'text/html'});
fs.createReadStream( path.normalize(path.join(__dirname, "client.html")), {
'flags': 'r',
'encoding': 'binary',
'mode': 0666,
'bufferSize': 4 * 1024
}).addListener("data", function(chunk){
res.write(chunk, 'binary');
}).addListener("close",function() {
res.end();
});
}
};

/*-----------------------------------------------
Spin up our server:
-----------------------------------------------*/
var httpServer = http.createServer(serveFile);


var server = ws.createServer({
debug: true
});
}, httpServer);

server.addListener("listening", function(){
log("Listening for connections.");
Expand All @@ -57,16 +85,10 @@ server.addListener("close", function(conn){
server.broadcast("<"+conn._id+"> disconnected");
});

server.listen(8000);
// Handle HTTP Requests:
server.addListener("request", function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('We can handle normal http connections too!\n');
});

server.addListener("shutdown", function(conn){
// never actually happens, because I never tell the server to shutdown.
log("Server shutdown");
});

// This will hijack the http server, if the httpserver doesn't
// already respond to http.Server#request

server.listen(8000, "localhost");
// server.addListener("request", serveFile);
37 changes: 23 additions & 14 deletions lib/ws.js
Expand Up @@ -32,24 +32,27 @@ var mixin = function(target, source) {
WebSocket Server Exports:
-----------------------------------------------*/
exports.Server = Server;
exports.createServer = function(options){
return new Server(options || {});
exports.createServer = function(options, server){
return new Server(options || {}, server);
};

/*-----------------------------------------------
WebSocket Server Implementation:
-----------------------------------------------*/
// Server(options, [externalServer])
function Server(options){
this.options = mixin({
debug: false, // Boolean: Show debug information.
version: "auto", // String: Value must be either: draft75, draft76, auto
origin: "*", // String, Array: A match for a valid connection origin
subprotocol: null, // String, Array: A match for a valid connection subprotocol.
}, options || {});

var ws = this;

var ws = this
, externalServer = arguments.length > 1 && arguments[1] instanceof http.Server;

this.debug = !!this.options.debug;
this.server = new http.Server();
this.server = externalServer ? arguments[1] : new http.Server();
this.manager = new Manager(this.debug);

events.EventEmitter.call(this);
Expand All @@ -71,21 +74,27 @@ function Server(options){
ws.emit("listening");
});

this.server.addListener("request", function(req, res){
ws.emit("request", req, res);
});
if(externalServer && ! this.server._events.hasOwnProperty("request")){
this.server.addListener("request", function(req, res){
ws.emit("request", req, res);
});
}

this.server.addListener("stream", function(stream){
ws.emit("stream", stream);
});
if(externalServer && ! this.server._events.hasOwnProperty("stream")){
this.server.addListener("stream", function(stream){
ws.emit("stream", stream);
});
}

this.server.addListener("close", function(errno){
ws.emit("shutdown", errno);
});

this.server.addListener("clientError", function(e){
ws.emit("clientError", e);
});
if(externalServer && ! this.server._events.hasOwnProperty("clientError")){
this.server.addListener("clientError", function(e){
ws.emit("clientError", e);
});
}
};

sys.inherits(Server, events.EventEmitter);
Expand Down

0 comments on commit d344590

Please sign in to comment.