moonbridge
changeset 155:2c22b0f222c7
Further work on new HTTP layer
author | jbe |
---|---|
date | Mon May 25 02:28:34 2015 +0200 (2015-05-25) |
parents | 831f2d4b2d73 |
children | 0c4221702ce1 |
files | moonbridge_http.lua |
line diff
1.1 --- a/moonbridge_http.lua Thu May 21 02:40:39 2015 +0200 1.2 +++ b/moonbridge_http.lua Mon May 25 02:28:34 2015 +0200 1.3 @@ -112,6 +112,7 @@ 1.4 request_mt = { __index = request_pt } 1.5 1.6 function request_pt:_init(handler, options) 1.7 + self._application_handler = handler 1.8 -- process options: 1.9 options = options or {} 1.10 do 1.11 @@ -144,7 +145,7 @@ 1.12 if value == nil then 1.13 self["_"..name] = default 1.14 else 1.15 - self["_"..name] = value or 0 1.16 + self["_"..name] = value 1.17 end 1.18 end 1.19 init_timeout("request_idle_timeout", 330) 1.20 @@ -154,6 +155,16 @@ 1.21 self._poll = options.poll_function or moonbridge_io.poll 1.22 self:_create_closure("_write_yield") 1.23 self:_create_closure("_handler") 1.24 + self:_create_header_metatables() 1.25 +end 1.26 + 1.27 +function request_pt:_create_closure(name) 1.28 + self[name.."_closure"] = function(...) 1.29 + return self[name](self, ...) 1.30 + end 1.31 +end 1.32 + 1.33 +function request_pt:_create_header_metatables() 1.34 -- table mapping header field names to value-lists: 1.35 self._headers_mt = { 1.36 __index = function(tbl, key) 1.37 @@ -239,12 +250,6 @@ 1.38 } 1.39 end 1.40 1.41 -function request_pt:_create_closure(name) 1.42 - self[name.."_closure"] = function(...) 1.43 - return self[name](self, ...) 1.44 - end 1.45 -end 1.46 - 1.47 function request_pt:_create_magictable(name) 1.48 self[name] = setmetatable({}, self["_"..name.."_mt"]) 1.49 end 1.50 @@ -257,11 +262,14 @@ 1.51 self._consume_input = self._drain_input 1.52 self._headers = {} 1.53 self._headers_value_nil = {} 1.54 + self._connection_close_requested = false 1.55 + self._connection_close_responded = false 1.56 self:_create_magictable("headers") 1.57 self:_create_magictable("headers_csv_table") 1.58 self:_create_magictable("headers_csv_string") 1.59 self:_create_magictable("headers_value") 1.60 self:_create_magictable("headers_flags") 1.61 + self.cookies = {} 1.62 repeat 1.63 -- wait for input: 1.64 if not moonbridge_io.poll(self._socket_set, nil, self._request_idle_timeout) then 1.65 @@ -293,7 +301,14 @@ 1.66 end 1.67 end 1.68 end 1.69 - until true 1.70 + timeout(self._response_timeout or 0) 1.71 + if self._application_handler(self) ~= true then 1.72 + self._survive = false 1.73 + end 1.74 + request:finish() 1.75 + timeout(0) 1.76 + until self._connection_close_responded 1.77 + return self._survive 1.78 end 1.79 1.80 function request_pt:_error(status, explanation) 1.81 @@ -455,7 +470,6 @@ 1.82 socket:drain_nb(self._input_chunk_size) 1.83 end 1.84 1.85 - 1.86 -- function creating a HTTP handler: 1.87 function generate_handler(handler, options) 1.88 -- swap arguments if necessary (for convenience):