main.lua

changeset 0
d363a6692a10
child 2
13a1d5e43a2b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.lua	Thu Dec 25 10:48:06 2014 +0000
@@ -0,0 +1,42 @@
+collectgarbage("setpause", 110);
+
+assert(arg[1], "Please supply upstream URL");
+
+local server = require "net.server_select";
+local http = require "net.http";
+local logger = require "util.logger";
+events = require "util.events".new();
+
+require "clients";
+
+local function printf(source, level, fmt, ...) return print(source, level, fmt:format(...)); end
+for _, level in ipairs{"debug", "info", "warn", "error"} do
+	logger.add_level_sink(level, printf);
+end
+
+local request;
+
+events.add_handler("have-clients", function ()
+	request = http.request(arg[1], {success_on_chunk=true}, function (data, code, response)
+		local boundary = response.headers["content-type"]:match("; boundary=(.+)$").."\r\n";
+		if #data > #boundary and data:sub(1, #boundary) ~= boundary then
+			print(string.format(("%02X "):rep(6), data:byte(1,6)));
+			error("bad format");
+		end
+		local img_header, header_len = data:sub(#boundary-1):match("(\r\n.-\r\n)\r\n()");
+		if not img_header then return; end
+		local img_size = tonumber(img_header:match("\r\nContent%-Length:%s*(%d+)\r\n"));
+		local start_idx, end_idx = #boundary-2+header_len, #boundary-2+header_len+img_size-1;
+		if end_idx + 2 > #data then return; end
+		local img = data:sub(start_idx, end_idx);
+		assert(#img == img_size, "incorrect image size: actual:"..#img.." vs expected: "..img_size.." data: "..#data)
+		response.body = data:sub(end_idx+3);
+		events.fire_event("image-changed", { image = img });
+	end);
+end);
+
+events.add_handler("no-clients", function ()
+	request.conn:close();
+end);
+
+server.loop();

mercurial