# HG changeset patch # User jbe # Date 1432513714 -7200 # Node ID 2c22b0f222c76d22bf5d9e60d4dbaa36e1d7cf6a # Parent 831f2d4b2d7335f8305beb4c51d219577366d307 Further work on new HTTP layer diff -r 831f2d4b2d73 -r 2c22b0f222c7 moonbridge_http.lua --- a/moonbridge_http.lua Thu May 21 02:40:39 2015 +0200 +++ b/moonbridge_http.lua Mon May 25 02:28:34 2015 +0200 @@ -112,6 +112,7 @@ request_mt = { __index = request_pt } function request_pt:_init(handler, options) + self._application_handler = handler -- process options: options = options or {} do @@ -144,7 +145,7 @@ if value == nil then self["_"..name] = default else - self["_"..name] = value or 0 + self["_"..name] = value end end init_timeout("request_idle_timeout", 330) @@ -154,6 +155,16 @@ self._poll = options.poll_function or moonbridge_io.poll self:_create_closure("_write_yield") self:_create_closure("_handler") + self:_create_header_metatables() +end + +function request_pt:_create_closure(name) + self[name.."_closure"] = function(...) + return self[name](self, ...) + end +end + +function request_pt:_create_header_metatables() -- table mapping header field names to value-lists: self._headers_mt = { __index = function(tbl, key) @@ -239,12 +250,6 @@ } end -function request_pt:_create_closure(name) - self[name.."_closure"] = function(...) - return self[name](self, ...) - end -end - function request_pt:_create_magictable(name) self[name] = setmetatable({}, self["_"..name.."_mt"]) end @@ -257,11 +262,14 @@ self._consume_input = self._drain_input self._headers = {} self._headers_value_nil = {} + self._connection_close_requested = false + self._connection_close_responded = false self:_create_magictable("headers") self:_create_magictable("headers_csv_table") self:_create_magictable("headers_csv_string") self:_create_magictable("headers_value") self:_create_magictable("headers_flags") + self.cookies = {} repeat -- wait for input: if not moonbridge_io.poll(self._socket_set, nil, self._request_idle_timeout) then @@ -293,7 +301,14 @@ end end end - until true + timeout(self._response_timeout or 0) + if self._application_handler(self) ~= true then + self._survive = false + end + request:finish() + timeout(0) + until self._connection_close_responded + return self._survive end function request_pt:_error(status, explanation) @@ -455,7 +470,6 @@ socket:drain_nb(self._input_chunk_size) end - -- function creating a HTTP handler: function generate_handler(handler, options) -- swap arguments if necessary (for convenience):