1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2016 Alexandre Terrasa <alexandre@moz-code.org>
5 # Licensed under the Apache License, Version 2.0 (the "License");
6 # you may not use this file except in compliance with the License.
7 # You may obtain a copy of the License at
9 # http://www.apache.org/licenses/LICENSE-2.0
11 # Unless required by applicable law or agreed to in writing, software
12 # distributed under the License is distributed on an "AS IS" BASIS,
13 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 # See the License for the specific language governing permissions and
15 # limitations under the License.
17 # Application server abstraction on top of nitcorn.
21 import pop_middlewares
22 intrude import pop_handlers
24 # App acts like a wrapper around a nitcorn `Action`.
28 # Do not show anything on console
29 var quiet
= false is writable
31 # Start listening on `host:port`.
32 fun listen
(host
: String, port
: Int) do
33 var iface
= "{host}:{port}"
34 var vh
= new VirtualHost(iface
)
36 vh
.routes
.add
new Route("/", self)
38 var fac
= new HttpFactory.and_libevent
39 fac
.config
.virtual_hosts
.add vh
42 print
"Launching server on http://{iface}/"
47 # Handle request from nitcorn
48 redef fun answer
(req
, uri
) do
49 uri
= uri
.simplify_path
50 var res
= new HttpResponse(404)
51 for route
, handler
in handlers
do
52 handler
.handle
(route
, uri
, req
, res
)
55 res
.send
(error_tpl
(res
.status_code
, res
.status_message
), 404)
57 res
.session
= req
.session
62 fun error_tpl
(status
: Int, message
: nullable String): Template do
63 return new ErrorTpl(status
, message
)
75 var message
: nullable String
77 redef fun rendering
do add
"""
81 <meta charset="utf-8">
82 <title>{{{message or else status}}}</title>
85 <h1>{{{status}}} {{{message or else ""}}}</h1>