Skip to content

Instantly share code, notes, and snippets.

@AxGord
Last active August 29, 2015 14:14
Show Gist options
  • Save AxGord/2b88ce3b6975d06e773f to your computer and use it in GitHub Desktop.
Save AxGord/2b88ce3b6975d06e773f to your computer and use it in GitHub Desktop.
Haxe/Node.JS simple slow server for testing loaders.
package;
import haxe.Timer;
import js.Node;
/**
* SlowServer
* @author AxGord
*/
class SlowServer {
static var speed:Int = 10;//kB per ms
static var mime = Node.require('mime');
static function main() {
Node.http.createServer(serverConnectHandler).listen(8088);
}
static function serverConnectHandler(req: NodeHttpServerReq, res: NodeHttpServerResp):Void {
var file = req.url.substr(1);
trace('Begin send: $file');
if (!Node.fs.existsSync(file)) {
trace('File not found');
res.writeHead(404, { } );
res.end('File not found');
return;
}
var stat = Node.fs.statSync(file);
res.writeHead(200, {
'Content-Type': mime.lookup(file),
'Content-Length': stat.size
});
var f = Node.fs.openSync(file, 'r');
var i = 0;
function sendFilePart() {
if (i >= stat.size) return;
var buf = 1024 * speed;
if (i + buf > stat.size) buf = stat.size-i;
var b = new NodeBuffer(buf);
Node.fs.readSync(f, b, 0, buf, i);
res.write(b);
i += buf;
if (i >= stat.size) {
res.end();
Node.fs.close(f, function(_) { } );
trace('Send complete: $file');
} else
Timer.delay(sendFilePart, 1);
}
sendFilePart();
}
}
(function () { "use strict";
var console = (1,eval)('this').console || {log:function(){}};
var HxOverrides = function() { };
HxOverrides.substr = function(s,pos,len) {
if(pos != null && pos != 0 && len != null && len < 0) return "";
if(len == null) len = s.length;
if(pos < 0) {
pos = s.length + pos;
if(pos < 0) pos = 0;
} else if(len < 0) len = s.length + len - pos;
return s.substr(pos,len);
};
var js = {};
js.Node = function() { };
var SlowServer = function() { };
SlowServer.main = function() {
js.Node.require("http").createServer(SlowServer.serverConnectHandler).listen(8088);
};
SlowServer.serverConnectHandler = function(req,res) {
var file = HxOverrides.substr(req.url,1,null);
console.log("Begin send: " + file);
if(!js.Node.require("fs").existsSync(file)) {
console.log("File not found");
res.writeHead(404,{ });
res.end("File not found");
return;
}
var stat = js.Node.require("fs").statSync(file);
res.writeHead(200,{ 'Content-Type' : SlowServer.mime.lookup(file), 'Content-Length' : stat.size});
var f = js.Node.require("fs").openSync(file,"r");
var i = 0;
var sendFilePart;
var sendFilePart1 = null;
sendFilePart1 = function() {
if(i >= stat.size) return;
var buf = 1024 * SlowServer.speed;
if(i + buf > stat.size) buf = stat.size - i;
var b = new Buffer(buf);
js.Node.require("fs").readSync(f,b,0,buf,i);
res.write(b);
i += buf;
if(i >= stat.size) {
res.end();
js.Node.require("fs").close(f,function(_) {
});
console.log("Send complete: " + file);
} else haxe.Timer.delay(sendFilePart1,1);
};
sendFilePart = sendFilePart1;
sendFilePart();
};
var haxe = {};
haxe.Timer = function(time_ms) {
var me = this;
this.id = setInterval(function() {
me.run();
},time_ms);
};
haxe.Timer.delay = function(f,time_ms) {
var t = new haxe.Timer(time_ms);
t.run = function() {
t.stop();
f();
};
return t;
};
haxe.Timer.prototype = {
stop: function() {
if(this.id == null) return;
clearInterval(this.id);
this.id = null;
}
,run: function() {
}
};
js.Node.require = require;
SlowServer.speed = 10;
SlowServer.mime = js.Node.require("mime");
SlowServer.main();
})();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment