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 |