net/http/server.lua
changeset 11376 b877bd74d65e
parent 11375 73f7acf8a61f
child 11377 ad3b5384fc03
equal deleted inserted replaced
11375:73f7acf8a61f 11376:b877bd74d65e
    94 end, -1);
    94 end, -1);
    95 
    95 
    96 local runner_callbacks = {};
    96 local runner_callbacks = {};
    97 
    97 
    98 function runner_callbacks:ready()
    98 function runner_callbacks:ready()
    99 	self.data:resume();
    99 	self.data.conn:resume();
   100 end
   100 end
   101 
   101 
   102 function runner_callbacks:waiting()
   102 function runner_callbacks:waiting()
   103 	self.data:pause();
   103 	self.data.conn:pause();
   104 end
   104 end
   105 
   105 
   106 function runner_callbacks:error(err)
   106 function runner_callbacks:error(err)
   107 	log("error", "Traceback[httpserver]: %s", err);
   107 	log("error", "Traceback[httpserver]: %s", err);
   108 	self.data:write("HTTP/1.0 500 Internal Server Error\r\n\r\n"..events.fire_event("http-error", { code = 500, private_message = err }));
   108 	self.data.conn:write("HTTP/1.0 500 Internal Server Error\r\n\r\n"..events.fire_event("http-error", { code = 500, private_message = err }));
   109 	self.data:close();
   109 	self.data.conn:close();
   110 end
   110 end
   111 
   111 
   112 function listener.onconnect(conn)
   112 function listener.onconnect(conn)
       
   113 	local session = { conn = conn };
   113 	local secure = conn:ssl() and true or nil;
   114 	local secure = conn:ssl() and true or nil;
   114 	conn._thread = async.runner(function (request)
   115 	session.thread = async.runner(function (request)
   115 		local wait, done = async.waiter();
   116 		local wait, done = async.waiter();
   116 		handle_request(conn, request, done); wait();
   117 		handle_request(conn, request, done); wait();
   117 	end, runner_callbacks, conn);
   118 	end, runner_callbacks, session);
   118 	local function success_cb(request)
   119 	local function success_cb(request)
   119 		--log("debug", "success_cb: %s", request.path);
   120 		--log("debug", "success_cb: %s", request.path);
   120 		request.secure = secure;
   121 		request.secure = secure;
   121 		conn._thread:run(request);
   122 		session.thread:run(request);
   122 	end
   123 	end
   123 	local function error_cb(err)
   124 	local function error_cb(err)
   124 		log("debug", "error_cb: %s", err or "<nil>");
   125 		log("debug", "error_cb: %s", err or "<nil>");
   125 		-- FIXME don't close immediately, wait until we process current stuff
   126 		-- FIXME don't close immediately, wait until we process current stuff
   126 		-- FIXME if err, send off a bad-request response
   127 		-- FIXME if err, send off a bad-request response
   127 		sessions[conn] = nil;
       
   128 		conn:close();
   128 		conn:close();
   129 	end
   129 	end
   130 	local function options_cb()
   130 	local function options_cb()
   131 		return options;
   131 		return options;
   132 	end
   132 	end
   133 	sessions[conn] = parser_new(success_cb, error_cb, "server", options_cb);
   133 	session.parser = parser_new(success_cb, error_cb, "server", options_cb);
       
   134 	sessions[conn] = session;
   134 end
   135 end
   135 
   136 
   136 function listener.ondisconnect(conn)
   137 function listener.ondisconnect(conn)
   137 	local open_response = conn._http_open_response;
   138 	local open_response = conn._http_open_response;
   138 	if open_response and open_response.on_destroy then
   139 	if open_response and open_response.on_destroy then
   147 	sessions[conn] = nil;
   148 	sessions[conn] = nil;
   148 	incomplete[conn] = nil;
   149 	incomplete[conn] = nil;
   149 end
   150 end
   150 
   151 
   151 function listener.onincoming(conn, data)
   152 function listener.onincoming(conn, data)
   152 	sessions[conn]:feed(data);
   153 	sessions[conn].parser:feed(data);
   153 end
   154 end
   154 
   155 
   155 function listener.ondrain(conn)
   156 function listener.ondrain(conn)
   156 	local response = incomplete[conn];
   157 	local response = incomplete[conn];
   157 	if response and response._send_more then
   158 	if response and response._send_more then