From: Alexandre Terrasa Date: Mon, 16 May 2016 19:04:12 +0000 (-0400) Subject: lib/popcorn: introduce middleware examples X-Git-Url: http://nitlanguage.org lib/popcorn: introduce middleware examples Signed-off-by: Alexandre Terrasa --- diff --git a/lib/popcorn/examples/middlewares/example_advanced_logger.nit b/lib/popcorn/examples/middlewares/example_advanced_logger.nit new file mode 100644 index 0000000..b97d10c --- /dev/null +++ b/lib/popcorn/examples/middlewares/example_advanced_logger.nit @@ -0,0 +1,54 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import popcorn +import realtime + +redef class HttpRequest + # Time that request was received by the Popcorn app. + var timer: nullable Clock = null +end + +class RequestTimeHandler + super Handler + + redef fun all(req, res) do req.timer = new Clock +end + +class LogHandler + super Handler + + redef fun all(req, res) do + var timer = req.timer + if timer != null then + print "{req.method} {req.uri} {res.color_status} ({timer.total})" + else + print "{req.method} {req.uri} {res.color_status}" + end + end +end + +class HelloHandler + super Handler + + redef fun get(req, res) do res.send "Hello World!" +end + +var app = new App +app.use("/*", new RequestTimeHandler) +app.use("/", new HelloHandler) +app.use("/*", new LogHandler) +app.listen("localhost", 3000) diff --git a/lib/popcorn/examples/middlewares/example_html_error_handler.nit b/lib/popcorn/examples/middlewares/example_html_error_handler.nit new file mode 100644 index 0000000..5bd399c --- /dev/null +++ b/lib/popcorn/examples/middlewares/example_html_error_handler.nit @@ -0,0 +1,51 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import popcorn +import template + +class HtmlErrorTemplate + super Template + + var status: Int + var message: nullable String + + redef fun rendering do add """ + + + + + {{{message or else status}}} + + +

{{{status}}} {{{message or else ""}}}

+ + """ +end + +class HtmlErrorHandler + super Handler + + redef fun all(req, res) do + if res.status_code != 200 then + res.send(new HtmlErrorTemplate(res.status_code, "An error occurred!")) + end + end +end + +var app = new App +app.use("/*", new HtmlErrorHandler) +app.listen("localhost", 3000) diff --git a/lib/popcorn/examples/middlewares/example_simple_error_handler.nit b/lib/popcorn/examples/middlewares/example_simple_error_handler.nit new file mode 100644 index 0000000..16a5977 --- /dev/null +++ b/lib/popcorn/examples/middlewares/example_simple_error_handler.nit @@ -0,0 +1,39 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import popcorn + +class SimpleErrorHandler + super Handler + + redef fun all(req, res) do + if res.status_code != 200 then + res.send("An error occurred!", res.status_code) + end + end +end + +class HelloHandler + super Handler + + redef fun get(req, res) do res.send "Hello World!" +end + + +var app = new App +app.use("/", new HelloHandler) +app.use("/*", new SimpleErrorHandler) +app.listen("localhost", 3000) diff --git a/lib/popcorn/examples/middlewares/example_simple_logger.nit b/lib/popcorn/examples/middlewares/example_simple_logger.nit new file mode 100644 index 0000000..98be552 --- /dev/null +++ b/lib/popcorn/examples/middlewares/example_simple_logger.nit @@ -0,0 +1,35 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import popcorn + +class LogHandler + super Handler + + redef fun all(req, res) do print "Request Logged" +end + +class HelloHandler + super Handler + + redef fun get(req, res) do res.send "Hello World!" +end + + +var app = new App +app.use("/*", new LogHandler) +app.use("/", new HelloHandler) +app.listen("localhost", 3000) diff --git a/lib/popcorn/tests/res/test_example_advanced_logger.res b/lib/popcorn/tests/res/test_example_advanced_logger.res new file mode 100644 index 0000000..7e56183 --- /dev/null +++ b/lib/popcorn/tests/res/test_example_advanced_logger.res @@ -0,0 +1,16 @@ + +[Client] curl -s localhost:*****/ +GET / 200 (0.0s) +Hello World! +[Client] curl -s localhost:*****/about +GET /about 404 (0.0s) + + + + + Not Found + + +

404 Not Found

+ + \ No newline at end of file diff --git a/lib/popcorn/tests/res/test_example_html_error_handler.res b/lib/popcorn/tests/res/test_example_html_error_handler.res new file mode 100644 index 0000000..3015280 --- /dev/null +++ b/lib/popcorn/tests/res/test_example_html_error_handler.res @@ -0,0 +1,23 @@ + +[Client] curl -s localhost:*****/ + + + + + An error occurred! + + +

404 An error occurred!

+ + +[Client] curl -s localhost:*****/about + + + + + An error occurred! + + +

404 An error occurred!

+ + \ No newline at end of file diff --git a/lib/popcorn/tests/res/test_example_simple_error_handler.res b/lib/popcorn/tests/res/test_example_simple_error_handler.res new file mode 100644 index 0000000..67e5a72 --- /dev/null +++ b/lib/popcorn/tests/res/test_example_simple_error_handler.res @@ -0,0 +1,5 @@ + +[Client] curl -s localhost:*****/ +Hello World! +[Client] curl -s localhost:*****/about +An error occurred! \ No newline at end of file diff --git a/lib/popcorn/tests/res/test_example_simple_logger.res b/lib/popcorn/tests/res/test_example_simple_logger.res new file mode 100644 index 0000000..9bc50e3 --- /dev/null +++ b/lib/popcorn/tests/res/test_example_simple_logger.res @@ -0,0 +1,16 @@ + +[Client] curl -s localhost:*****/ +Request Logged +Hello World! +[Client] curl -s localhost:*****/about +Request Logged + + + + + Not Found + + +

404 Not Found

+ + \ No newline at end of file diff --git a/lib/popcorn/tests/test_example_advanced_logger.nit b/lib/popcorn/tests/test_example_advanced_logger.nit new file mode 100644 index 0000000..41193d2 --- /dev/null +++ b/lib/popcorn/tests/test_example_advanced_logger.nit @@ -0,0 +1,47 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import example_advanced_logger +import base_tests + +class TestClient + super ClientThread + + redef fun main do + system "curl -s {host}:{port}/" + system "curl -s {host}:{port}/about" + return null + end +end + +var app = new App +app.use("/*", new RequestTimeHandler) +app.use("/", new HelloHandler) +app.use("/*", new LogHandler) + +var host = test_host +var port = test_port + +var server = new AppThread(host, port, app) +server.start +0.1.sleep + +var client = new TestClient(host, port) +client.start +client.join +0.1.sleep + +exit 0 diff --git a/lib/popcorn/tests/test_example_html_error_handler.nit b/lib/popcorn/tests/test_example_html_error_handler.nit new file mode 100644 index 0000000..95abb7a --- /dev/null +++ b/lib/popcorn/tests/test_example_html_error_handler.nit @@ -0,0 +1,45 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import example_html_error_handler +import base_tests + +class TestClient + super ClientThread + + redef fun main do + system "curl -s {host}:{port}/" + system "curl -s {host}:{port}/about" + return null + end +end + +var app = new App +app.use("/*", new HtmlErrorHandler) + +var host = test_host +var port = test_port + +var server = new AppThread(host, port, app) +server.start +0.1.sleep + +var client = new TestClient(host, port) +client.start +client.join +0.1.sleep + +exit 0 diff --git a/lib/popcorn/tests/test_example_simple_error_handler.nit b/lib/popcorn/tests/test_example_simple_error_handler.nit new file mode 100644 index 0000000..ce671f0 --- /dev/null +++ b/lib/popcorn/tests/test_example_simple_error_handler.nit @@ -0,0 +1,46 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import example_simple_error_handler +import base_tests + +class TestClient + super ClientThread + + redef fun main do + system "curl -s {host}:{port}/" + system "curl -s {host}:{port}/about" + return null + end +end + +var app = new App +app.use("/", new HelloHandler) +app.use("/*", new SimpleErrorHandler) + +var host = test_host +var port = test_port + +var server = new AppThread(host, port, app) +server.start +0.1.sleep + +var client = new TestClient(host, port) +client.start +client.join +0.1.sleep + +exit 0 diff --git a/lib/popcorn/tests/test_example_simple_logger.nit b/lib/popcorn/tests/test_example_simple_logger.nit new file mode 100644 index 0000000..50f6af9 --- /dev/null +++ b/lib/popcorn/tests/test_example_simple_logger.nit @@ -0,0 +1,46 @@ +# This file is part of NIT ( http://www.nitlanguage.org ). +# +# Copyright 2016 Alexandre Terrasa +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import example_simple_logger +import base_tests + +class TestClient + super ClientThread + + redef fun main do + system "curl -s {host}:{port}/" + system "curl -s {host}:{port}/about" + return null + end +end + +var app = new App +app.use("/*", new LogHandler) +app.use("/", new HelloHandler) + +var host = test_host +var port = test_port + +var server = new AppThread(host, port, app) +server.start +0.1.sleep + +var client = new TestClient(host, port) +client.start +client.join +0.1.sleep + +exit 0