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.
23 intrude import pop_handlers
25 # App acts like a wrapper around a nitcorn `Action`.
29 # Do not show anything on console
30 var quiet
= false is writable
32 # Start listening on `host:port`.
33 fun listen
(host
: String, port
: Int) do
34 var iface
= "{host}:{port}"
35 var vh
= new VirtualHost(iface
)
37 vh
.routes
.add
new Route("/", self)
39 var fac
= new HttpFactory.and_libevent
40 fac
.config
.virtual_hosts
.add vh
43 print
"Launching server on http://{iface}/"
48 # Handle request from nitcorn
49 redef fun answer
(req
, uri
) do
50 uri
= uri
.simplify_path
51 var res
= new HttpResponse(404)
52 for route
, handler
in pre_handlers
do
53 handler
.handle
(route
, uri
, req
, res
)
55 for route
, handler
in handlers
do
56 handler
.handle
(route
, uri
, req
, res
)
57 if res
.sent
then break
60 res
.send
(error_tpl
(res
.status_code
, res
.status_message
), 404)
62 for route
, handler
in post_handlers
do
63 handler
.handle
(route
, uri
, req
, res
)
65 res
.session
= req
.session
70 fun error_tpl
(status
: Int, message
: nullable String): Template do
71 return new ErrorTpl(status
, message
)
83 var message
: nullable String
85 redef fun rendering
do add
"""
89 <meta charset="utf-8">
90 <title>{{{message or else status}}}</title>
93 <h1>{{{status}}} {{{message or else ""}}}</h1>