Browse files

Add an example with custom middleware

  • Loading branch information...
1 parent 26935cb commit 09f1a8d55bdd16e32de81d953ed281338db0cf89 @acammack acammack committed Feb 9, 2013
View
3 examples/README.md
@@ -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
24 examples/markdown_middleware/README.md
@@ -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.
View
BIN examples/markdown_middleware/priv/small.mp4
Binary file not shown.
View
BIN examples/markdown_middleware/priv/small.ogv
Binary file not shown.
View
9 examples/markdown_middleware/priv/video.md
@@ -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
8 examples/markdown_middleware/rebar.config
@@ -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
29 examples/markdown_middleware/src/markdown_converter.erl
@@ -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
15 examples/markdown_middleware/src/markdown_middleware.app.src
@@ -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
14 examples/markdown_middleware/src/markdown_middleware.erl
@@ -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
29 examples/markdown_middleware/src/markdown_middleware_app.erl
@@ -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
23 examples/markdown_middleware/src/markdown_middleware_sup.erl
@@ -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
3 examples/markdown_middleware/start.sh
@@ -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\")."

0 comments on commit 09f1a8d

Please sign in to comment.