diff options
-rw-r--r-- | examples/error_hook/Makefile | 14 | ||||
-rw-r--r-- | examples/error_hook/README.md | 49 | ||||
-rw-r--r-- | examples/error_hook/rebar.config | 4 | ||||
-rw-r--r-- | examples/error_hook/relx.config | 2 | ||||
-rw-r--r-- | examples/error_hook/src/error_hook.erl | 15 | ||||
-rw-r--r-- | examples/error_hook/src/error_hook_app.erl | 19 | ||||
-rw-r--r-- | examples/error_hook/src/error_hook_responder.erl | 21 | ||||
-rwxr-xr-x | examples/error_hook/start.sh | 3 |
8 files changed, 71 insertions, 56 deletions
diff --git a/examples/error_hook/Makefile b/examples/error_hook/Makefile new file mode 100644 index 0000000..a4313ef --- /dev/null +++ b/examples/error_hook/Makefile @@ -0,0 +1,14 @@ +PROJECT = error_hook + +DEPS = cowboy +dep_cowboy = pkg://cowboy master + +.PHONY: release clean-release + +release: clean-release all + relx + +clean-release: + rm -rf _rel + +include ../../erlang.mk diff --git a/examples/error_hook/README.md b/examples/error_hook/README.md index 4a0a4a6..66fb5e5 100644 --- a/examples/error_hook/README.md +++ b/examples/error_hook/README.md @@ -1,22 +1,27 @@ -Cowboy Error Hook -================= +Error hook example +================== -To compile this example you need rebar in your PATH. +To try this example, you need GNU `make`, `git` and +[relx](https://github.com/erlware/relx) in your PATH. -Type the following command: -``` -$ rebar get-deps compile -``` +To build the example, run the following command: -You can then start the Erlang node with the following command: +``` bash +$ make ``` -./start.sh + +To start the release in the foreground: + +``` bash +$ ./_rel/bin/error_hook_example console ``` -Then point your browser to the indicated URL. +Then point your browser at [http://localhost:8080](http://localhost:8080). + +Example output +-------------- -Example -------- +Not found: ``` bash $ curl -i http://localhost:8080 @@ -28,3 +33,23 @@ content-length: 56 404 Not Found: "/" is not the path you are looking for. ``` + +Bad request: + +``` bash +$ telnet localhost 8080 +Trying ::1... +Connection failed: Connection refused +Trying 127.0.0.1... +Connected to localhost. +Escape character is '^]'. +bad +HTTP/1.1 400 Bad Request +connection: close +server: Cowboy +date: Sun, 08 Sep 2013 09:29:27 GMT +content-length: 15 + +HTTP Error 400 +Connection closed by foreign host. +``` diff --git a/examples/error_hook/rebar.config b/examples/error_hook/rebar.config deleted file mode 100644 index 6ad3062..0000000 --- a/examples/error_hook/rebar.config +++ /dev/null @@ -1,4 +0,0 @@ -{deps, [ - {cowboy, ".*", - {git, "git://github.com/extend/cowboy.git", "master"}} -]}. diff --git a/examples/error_hook/relx.config b/examples/error_hook/relx.config new file mode 100644 index 0000000..1f87524 --- /dev/null +++ b/examples/error_hook/relx.config @@ -0,0 +1,2 @@ +{release, {error_hook_example, "1"}, [error_hook]}. +{extended_start_script, true}. diff --git a/examples/error_hook/src/error_hook.erl b/examples/error_hook/src/error_hook.erl deleted file mode 100644 index 2cfd5cf..0000000 --- a/examples/error_hook/src/error_hook.erl +++ /dev/null @@ -1,15 +0,0 @@ -%% Feel free to use, reuse and abuse the code in this file. - --module(error_hook). - -%% API. --export([start/0]). - -%% API. - -start() -> - ok = application:start(crypto), - ok = application:start(cowlib), - ok = application:start(ranch), - ok = application:start(cowboy), - ok = application:start(error_hook). diff --git a/examples/error_hook/src/error_hook_app.erl b/examples/error_hook/src/error_hook_app.erl index 213eccf..7525cbe 100644 --- a/examples/error_hook/src/error_hook_app.erl +++ b/examples/error_hook/src/error_hook_app.erl @@ -16,9 +16,26 @@ start(_Type, _Args) -> ]), {ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [ {env, [{dispatch, Dispatch}]}, - {onresponse, fun error_hook_responder:respond/4} + {onresponse, fun error_hook/4} ]), error_hook_sup:start_link(). stop(_State) -> ok. + +error_hook(404, Headers, <<>>, Req) -> + {Path, Req2} = cowboy_req:path(Req), + Body = ["404 Not Found: \"", Path, + "\" is not the path you are looking for.\n"], + Headers2 = lists:keyreplace(<<"content-length">>, 1, Headers, + {<<"content-length">>, integer_to_list(iolist_size(Body))}), + {ok, Req3} = cowboy_req:reply(404, Headers2, Body, Req2), + Req3; +error_hook(Code, Headers, <<>>, Req) when is_integer(Code), Code >= 400 -> + Body = ["HTTP Error ", integer_to_list(Code), $\n], + Headers2 = lists:keyreplace(<<"content-length">>, 1, Headers, + {<<"content-length">>, integer_to_list(iolist_size(Body))}), + {ok, Req2} = cowboy_req:reply(Code, Headers2, Body, Req), + Req2; +error_hook(_Code, _Headers, _Body, Req) -> + Req. diff --git a/examples/error_hook/src/error_hook_responder.erl b/examples/error_hook/src/error_hook_responder.erl deleted file mode 100644 index 31f2d5b..0000000 --- a/examples/error_hook/src/error_hook_responder.erl +++ /dev/null @@ -1,21 +0,0 @@ -%% Feel free to use, reuse and abuse the code in this file. - --module(error_hook_responder). - --export([respond/4]). - -respond(404, Headers, <<>>, Req) -> - {Path, Req2} = cowboy_req:path(Req), - Body = <<"404 Not Found: \"", Path/binary, "\" is not the path you are looking for.\n">>, - Headers2 = lists:keyreplace(<<"content-length">>, 1, Headers, - {<<"content-length">>, integer_to_list(byte_size(Body))}), - {ok, Req3} = cowboy_req:reply(404, Headers2, Body, Req2), - Req3; -respond(Code, Headers, <<>>, Req) when is_integer(Code), Code >= 400 -> - Body = ["HTTP Error ", integer_to_list(Code), $\n], - Headers2 = lists:keyreplace(<<"content-length">>, 1, Headers, - {<<"content-length">>, integer_to_list(iolist_size(Body))}), - {ok, Req2} = cowboy_req:reply(Code, Headers2, Body, Req), - Req2; -respond(_Code, _Headers, _Body, Req) -> - Req. diff --git a/examples/error_hook/start.sh b/examples/error_hook/start.sh deleted file mode 100755 index ea40eb3..0000000 --- a/examples/error_hook/start.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh -erl -pa ebin deps/*/ebin -s error_hook \ - -eval "io:format(\"Point your browser at http://localhost:8080~n\")." |