Not an issue per say...
diff --git a/webserver/index.html b/webserver/index.html
index 311c283..3c3dc0b 100644
--- a/webserver/index.html
+++ b/webserver/index.html
@@ -68,6 +68,7 @@
<select id="hosts">
<option value="127.0.0.1">lo - 127.0.0.1</option>
</select>
+ <input type="text" id="port" value="8080"/><br />
<button id="start" class="btn btn-primary btn-large" disabled>Start</button>
<button id="stop" class="btn btn-warning btn-large" disabled>Stop</button>
</p>
diff --git a/webserver/index.js b/webserver/index.js
index 49d2f1e..85a6fc3 100644
--- a/webserver/index.js
+++ b/webserver/index.js
@@ -2,6 +2,7 @@ onload = function() {
var start = document.getElementById("start");
var stop = document.getElementById("stop");
var hosts = document.getElementById("hosts");
+ var port = document.getElementById("port");
var directory = document.getElementById("directory");
var socket = chrome.experimental.socket || chrome.socket;
@@ -30,13 +31,13 @@ onload = function() {
logger.textContent += log + "\n";
}
- var writeErrorResponse = function(socketId, errorCode) {
+ var writeErrorResponse = function(socketId, errorCode, keepAlive) {
var file = { size: 0 };
console.info("writeErrorResponse:: begin... ");
console.info("writeErrorResponse:: file = " + file);
- var contentType = "text/plain"; //(file.type === "") ? "text/plain" : file.type;
+ var contentType = "text/plain"; //(file.type === "") ? "text/plain" : file.type;
var contentLength = file.size;
- var header = stringToUint8Array("HTTP/1.0 " +errorCode+ " Not Found\nContent-length: " + file.size + "\nContent-type:" + contentType + "\n\n");
+ var header = stringToUint8Array("HTTP/1.0 " + errorCode + " Not Found\nContent-length: " + file.size + "\nContent-type:" + contentType + ( keepAlive ? "\nConnection: keep-alive" : "") + "\n\n");
console.info("writeErrorResponse:: Done setting header...");
var outputBuffer = new ArrayBuffer(header.byteLength + file.size);
var view = new Uint8Array(outputBuffer)
@@ -44,8 +45,12 @@ onload = function() {
console.info("writeErrorResponse:: Done setting view...");
socket.write(socketId, outputBuffer, function(writeInfo) {
console.log("WRITE", writeInfo);
- socket.destroy(socketId);
- socket.accept(socketInfo.socketId, onAccept);
+ if (keepAlive) {
+ readFromSocket(socketId);
+ } else {
+ socket.destroy(socketId);
+ socket.accept(socketInfo.socketId, onAccept);
+ }
});
console.info("writeErrorResponse::filereader:: end onload...");
@@ -53,10 +58,10 @@ onload = function() {
};
- var write200Response = function(socketId, file) {
+ var write200Response = function(socketId, file, keepAlive) {
var contentType = (file.type === "") ? "text/plain" : file.type;
var contentLength = file.size;
- var header = stringToUint8Array("HTTP/1.0 200 OK\nContent-length: " + file.size + "\nContent-type:" + contentType + "\n\n");
+ var header = stringToUint8Array("HTTP/1.0 200 OK\nContent-length: " + file.size + "\nContent-type:" + contentType + ( keepAlive ? "\nConnection: keep-alive" : "") + "\n\n");
var outputBuffer = new ArrayBuffer(header.byteLength + file.size);
var view = new Uint8Array(outputBuffer)
view.set(header, 0);
@@ -66,8 +71,12 @@ onload = function() {
view.set(new Uint8Array(e.target.result), header.byteLength);
socket.write(socketId, outputBuffer, function(writeInfo) {
console.log("WRITE", writeInfo);
- socket.destroy(socketId);
- socket.accept(socketInfo.socketId, onAccept);
+ if (keepAlive) {
+ readFromSocket(socketId);
+ } else {
+ socket.destroy(socketId);
+ socket.accept(socketInfo.socketId, onAccept);
+ }
});
};
@@ -76,34 +85,48 @@ onload = function() {
var onAccept = function(acceptInfo) {
console.log("ACCEPT", acceptInfo)
+ readFromSocket(acceptInfo.socketId);
+ };
+
+ var readFromSocket = function(socketId) {
// Read in the data
- socket.read(acceptInfo.socketId, function(readInfo) {
+ socket.read(socketId, function(readInfo) {
console.log("READ", readInfo);
// Parse the request.
var data = arrayBufferToString(readInfo.data);
if(data.indexOf("GET ") == 0) {
+ var keepAlive = false;
+ if (data.indexOf("Connection: keep-alive") != -1) {
+ keepAlive = true;
+ }
+
// we can only deal with GET requests
var uriEnd = data.indexOf(" ", 4);
if(uriEnd < 0) { /* throw a wobbler */ return; }
var uri = data.substring(4, uriEnd);
+ // strip qyery string
+ var q = uri.indexOf("?");
+ if (q != -1) {
+ uri = uri.substring(0, q);
+ }
var file = filesMap[uri];
if(!!file == false) {
- console.warn("File does not exist...");
- writeErrorResponse(acceptInfo.socketId, 404); /* File does not exist */
+ console.warn("File does not exist..." + uri);
+ writeErrorResponse(socketId, 404, keepAlive);
return;
}
logToScreen("GET 200 " + uri);
- write200Response(acceptInfo.socketId, file);
+ write200Response(socketId, file, keepAlive);
}
else {
// Throw an error
- socket.destroy(acceptInfo.socketId);
+ socket.destroy(socketId);
}
- });
+ });
};
directory.onchange = function(e) {
- if(socketInfo) socket.destroy(socketInfo.socketId);
+ if (socketInfo) socket.destroy(socketInfo.socketId);
var files = e.target.files;
@@ -121,7 +144,7 @@ onload = function() {
start.onclick = function() {
socket.create("tcp", {}, function(_socketInfo) {
socketInfo = _socketInfo;
- socket.listen(socketInfo.socketId, hosts.value, 8080, 20, function(result) {
+ socket.listen(socketInfo.socketId, hosts.value, parseInt(port.value), 50, function(result) {
console.log("LISTENING:", result);
socket.accept(socketInfo.socketId, onAccept);
});
diff --git a/webserver/main.js b/webserver/main.js
index dd28a88..c11dc6a 100644
--- a/webserver/main.js
+++ b/webserver/main.js
@@ -7,6 +7,6 @@
chrome.app.runtime.onLaunched.addListener(function(intentData) {
chrome.app.window.create('index.html', {
width: 500,
- height: 550
+ height: 640
});
});