0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-14 20:30:23 +00:00

Add an example with custom middleware

This commit is contained in:
Adam Cammack 2013-02-09 04:04:49 -06:00
parent 26935cbfb0
commit 09f1a8d55b
12 changed files with 157 additions and 0 deletions

View file

@ -0,0 +1,24 @@
Cowboy Middleware
=================
To compile this example you need rebar in your PATH.
Type the following command:
```
$ rebar get-deps compile
```
You can then start the Erlang node with the following command:
```
./start.sh
```
Cowboy will serve all the files you put in the priv/ directory. If you request
a .html file that has corresponding .md file that has been modified more
recently than the .html file, the markdown file will be converted to HTML and
served by Cowboy.
HTML5 Video Example
-------------------
Open http://localhost:8080/video.html in your favorite browser.

Binary file not shown.

Binary file not shown.

View file

@ -0,0 +1,9 @@
HTML5 Video With Markdown
=========================
<video controls>
<source src="small.ogv" type="video/ogg"/>
<source src="small.mp4" type="video/mp4"/>
</video>
Videos taken from [TechSlides](http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5/)

View file

@ -0,0 +1,8 @@
{deps, [
{cowboy, ".*",
{git, "git://github.com/extend/cowboy.git", "master"}},
{mimetypes, ".*",
{git, "git://github.com/spawngrid/mimetypes.git", "master"}},
{erlmarkdown, ".*",
{git, "git://github.com/ericbmerritt/erlmarkdown.git", "rv"}}
]}.

View file

@ -0,0 +1,29 @@
%% Feel free to use, reuse and abuse the code in this file.
-module(markdown_converter).
-behaviour(cowboy_middleware).
-export([execute/2]).
execute(Req, Env) ->
{[Path], Req1} = cowboy_req:path_info(Req),
case filename:extension(Path) of
<<".html">> -> maybe_generate_markdown(resource_path(Path));
_Ext -> ok
end,
{ok, Req1, Env}.
maybe_generate_markdown(Path) ->
ModifiedAt = filelib:last_modified(source_path(Path)),
GeneratedAt = filelib:last_modified(Path),
case ModifiedAt > GeneratedAt of
true -> erlmarkdown:conv_file(source_path(Path), Path);
false -> ok
end.
resource_path(Path) ->
{ok, Cwd} = file:get_cwd(),
filename:join([Cwd, "priv", Path]).
source_path(Path) ->
<< (filename:rootname(Path))/binary, ".md" >>.

View file

@ -0,0 +1,15 @@
%% Feel free to use, reuse and abuse the code in this file.
{application, markdown_middleware, [
{description, "Cowboy static file handler example with middleware component."},
{vsn, "1"},
{modules, []},
{registered, []},
{applications, [
kernel,
stdlib,
cowboy
]},
{mod, {markdown_middleware_app, []}},
{env, []}
]}.

View file

@ -0,0 +1,14 @@
%% Feel free to use, reuse and abuse the code in this file.
-module(markdown_middleware).
%% API.
-export([start/0]).
%% API.
start() ->
ok = application:start(crypto),
ok = application:start(ranch),
ok = application:start(cowboy),
ok = application:start(markdown_middleware).

View file

@ -0,0 +1,29 @@
%% Feel free to use, reuse and abuse the code in this file.
%% @private
-module(markdown_middleware_app).
-behaviour(application).
%% API.
-export([start/2]).
-export([stop/1]).
%% API.
start(_Type, _Args) ->
Dispatch = cowboy_router:compile([
{'_', [
{"/[...]", cowboy_static, [
{directory, {priv_dir, markdown_middleware, []}},
{mimetypes, {fun mimetypes:path_to_mimes/2, default}}
]}
]}
]),
{ok, _} = cowboy:start_http(http, 100, [{port, 8080}], [
{env, [{dispatch, Dispatch}]},
{middlewares, [cowboy_router, markdown_converter, cowboy_handler]}
]),
markdown_middleware_sup:start_link().
stop(_State) ->
ok.

View file

@ -0,0 +1,23 @@
%% Feel free to use, reuse and abuse the code in this file.
%% @private
-module(markdown_middleware_sup).
-behaviour(supervisor).
%% API.
-export([start_link/0]).
%% supervisor.
-export([init/1]).
%% API.
-spec start_link() -> {ok, pid()}.
start_link() ->
supervisor:start_link({local, ?MODULE}, ?MODULE, []).
%% supervisor.
init([]) ->
Procs = [],
{ok, {{one_for_one, 10, 10}, Procs}}.

View file

@ -0,0 +1,3 @@
#!/bin/sh
erl -pa ebin deps/*/ebin -s markdown_middleware \
-eval "io:format(\"Point your browser at http://localhost:8080/video.html~n\")."