X-Git-Url: http://nitlanguage.org diff --git a/lib/nitcorn/reactor.nit b/lib/nitcorn/reactor.nit index 0fb5cad..afa0d0a 100644 --- a/lib/nitcorn/reactor.nit +++ b/lib/nitcorn/reactor.nit @@ -35,6 +35,9 @@ class HttpServer private var parser = new HttpRequestParser is lazy + # Human readable address of the remote client + var remote_address: String + redef fun read_http_request(str) do var request_object = parser.parse_http_request(str.to_s) @@ -69,7 +72,7 @@ class HttpServer request.uri_params = route.parse_params(request.uri) var handler = route.handler - var root = route.path + var root = route.resolve_path(request) var turi if root != null then turi = ("/" + request.uri.substring_from(root.length)).simplify_path @@ -78,8 +81,8 @@ class HttpServer # Delegate the responsibility to respond to the `Action` handler.prepare_respond_and_close(request, turi, self) return - else response = new HttpResponse(405) - else response = new HttpResponse(405) + else response = new HttpResponse(404) + else response = new HttpResponse(404) respond response close @@ -131,7 +134,7 @@ class HttpFactory # You can use this to create the first `HttpFactory`, which is the most common. init and_libevent do init(new NativeEventBase) - redef fun spawn_connection(buf_ev) do return new HttpServer(buf_ev, self) + redef fun spawn_connection(buf_ev, address) do return new HttpServer(buf_ev, self, address) # Execute the main listening loop to accept connections # @@ -145,13 +148,13 @@ class HttpFactory event_base.dispatch end - event_base.destroy + event_base.free end end redef class ServerConfig # Handle to retreive the `HttpFactory` on config change - private var factory: HttpFactory + private var factory: HttpFactory is noinit private init with_factory(factory: HttpFactory) do self.factory = factory end @@ -179,7 +182,8 @@ redef class Sys listeners_count[name, port] = 1 end else - listeners_count[name, port] += 1 + var value = listeners_count[name, port].as(not null) + listeners_count[name, port] = value + 1 end interfac.registered = true @@ -197,7 +201,15 @@ redef class Interfaces redef fun add(e) do super - if vh.server_config != null then sys.listen_on(e, vh.server_config.factory) + var config = virtual_host.server_config + if config != null then register_and_listen(e, config) + end + + # Indirection to `listen_on` and check if this targets all addresses + private fun register_and_listen(e: Interface, config: ServerConfig) + do + listen_on(e, config.factory) + if e.name == "0.0.0.0" or e.name == "::0" then config.default_virtual_host = virtual_host end # TODO remove @@ -207,7 +219,7 @@ redef class VirtualHosts redef fun add(e) do super - for i in e.interfaces do sys.listen_on(i, config.factory) + for i in e.interfaces do e.interfaces.register_and_listen(i, config) end # TODO remove