0
Fork 0
mirror of https://github.com/ninenines/cowboy.git synced 2025-07-16 05:00:24 +00:00

Merge branch 'add_middleware_example' of git://github.com/acammack/cowboy

This commit is contained in:
Loïc Hoguin 2013-02-09 21:14:45 +01:00
commit 6879cd8859
12 changed files with 157 additions and 0 deletions

View file

@ -25,6 +25,9 @@ Cowboy Examples
* [hello_world](./hello_world):
simplest example application
* [markdown_middleware](./markdown_middleware):
static file handler with markdown preprocessor
* [rest_hello_world](./rest_hello_world):
return the data type that matches the request type (ex: html, text, json)

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\")."