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):

Impressum / About Us