clients.lua

Mon, 04 Jan 2016 11:05:50 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Mon, 04 Jan 2016 11:05:50 +0000
changeset 5
4a3caf5d0f4b
parent 0
d363a6692a10
child 6
4e46ef3035ba
permissions
-rw-r--r--

net.http: Reset 'partial' flag after handling a chunk

local socket = require "socket";
local server = require "net.server_select";
local http_server = require"net.http.server";
local log = require "util.logger".init("clients");

local response_head = 	table.concat({
	"HTTP/1.1 200 OK";
	"Max-Age: 0";
	"Expires: 0";
	"Cache-Control: no-cache, private";
	"Pragma: no-cache";
	"Content-Type: multipart/x-mixed-replace; boundary=--BoundaryString";
	"Keep-Alive: timeout=5, max=99";
	"Connection: Keep-Alive";
	"Transfer-Encoding: chunked";
	"";
	"";	
}, "\r\n");

local listener = { onconnect = function () end; onincoming = function () end; }

local last_chunk;

local clients = {};

-- Called when a HTTP stream client closes
function listener.ondisconnect(conn)
	clients[conn] = nil;
	if not next(clients) then
		log("debug", "No more clients");
		events.fire_event("no-clients");
	end
end
listener.ondetach = listener.ondisconnect;

function handle_request(event, path)
	local path = event.request.url.path;
	if path ~= "/cam" then
		return 404;
	end
	
	if not next(clients) then
		log("debug", "Have clients now");
		events.fire_event("have-clients");
	end
	
	local conn = event.response.conn;

	conn:write(response_head);
	clients[conn] = true;

	if last_chunk then
		conn:write(last_chunk);
	end

	conn:setlistener(listener);

	return true;
end

events.add_handler("image-changed", function (event)
	log("debug", "New image");
	local chunk_data = table.concat({
		"--BoundaryString",
		"Content-Type: image/jpeg";
		"Content-Length: "..#event.image;
		"";
		event.image;
	}, "\r\n");
	last_chunk = ("%x\r\n%s\r\n"):format(#chunk_data, chunk_data);
	
	for client in pairs(clients) do
		client:write(last_chunk);
	end
end);

http_server.add_host("localhost");
http_server.set_default_host("localhost");
http_server.add_handler("GET localhost/*", handle_request);
http_server.listen_on(8006);

mercurial