diff -r 000000000000 -r d363a6692a10 main.lua --- /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();