diff --git a/examples/error_hook/Makefile b/examples/error_hook/Makefile new file mode 100644 index 00000000..a4313ef8 --- /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 4a0a4a6a..66fb5e51 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: + +``` bash +$ make ``` -You can then start the Erlang node with the following command: -``` -./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 -------- +Example output +-------------- + +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 6ad30625..00000000 --- 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 00000000..1f875243 --- /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 2cfd5cf2..00000000 --- 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 213eccf1..7525cbe7 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 31f2d5bb..00000000 --- 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 ea40eb38..00000000 --- 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\")."