tests: add some runtime error in nitin.input
[nit.git] / lib / popcorn / popcorn.nit
1 # This file is part of NIT ( http://www.nitlanguage.org ).
2 #
3 # Copyright 2016 Alexandre Terrasa <alexandre@moz-code.org>
4 #
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
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
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.
16
17 # Application server abstraction on top of nitcorn.
18 module popcorn
19
20 import nitcorn
21 import pop_sessions
22 import pop_logging
23 intrude import pop_handlers
24
25 # App acts like a wrapper around a nitcorn `Action`.
26 redef class App
27 super Action
28
29 # Do not show anything on console
30 var quiet = false is writable
31
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)
36
37 vh.routes.add new Route("/", self)
38
39 var fac = new HttpFactory.and_libevent
40 fac.config.virtual_hosts.add vh
41
42 if not quiet then
43 print "Launching server on http://{iface}/"
44 end
45 fac.run
46 end
47
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)
54 end
55 for route, handler in handlers do
56 handler.handle(route, uri, req, res)
57 if res.sent then break
58 end
59 if not res.sent then
60 res.send(error_tpl(res.status_code, res.status_message), 404)
61 end
62 for route, handler in post_handlers do
63 handler.handle(route, uri, req, res)
64 end
65 res.session = req.session
66 return res
67 end
68
69 #
70 fun error_tpl(status: Int, message: nullable String): Template do
71 return new ErrorTpl(status, message)
72 end
73 end
74
75 #
76 class ErrorTpl
77 super Template
78
79 #
80 var status: Int
81
82 #
83 var message: nullable String
84
85 redef fun rendering do add """
86 <!DOCTYPE html>
87 <html>
88 <head>
89 <meta charset="utf-8">
90 <title>{{{message or else status}}}</title>
91 </head>
92 <body>
93 <h1>{{{status}}} {{{message or else ""}}}</h1>
94 </body>
95 </html>"""
96
97 end