aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Cammack <[email protected]>2013-02-09 04:04:49 -0600
committerAdam Cammack <[email protected]>2013-02-09 13:54:08 -0600
commit09f1a8d55bdd16e32de81d953ed281338db0cf89 (patch)
treed2a6696d12711a06d1d6a351822d33260dd526a7
parent26935cbfb021632eb8f932af43737fdbfcfad128 (diff)
downloadcowboy-09f1a8d55bdd16e32de81d953ed281338db0cf89.tar.gz
cowboy-09f1a8d55bdd16e32de81d953ed281338db0cf89.tar.bz2
cowboy-09f1a8d55bdd16e32de81d953ed281338db0cf89.zip
Add an example with custom middleware
-rw-r--r--examples/README.md3
-rw-r--r--examples/markdown_middleware/README.md24
-rw-r--r--examples/markdown_middleware/priv/small.mp4bin0 -> 383631 bytes
-rw-r--r--examples/markdown_middleware/priv/small.ogvbin0 -> 872453 bytes
-rw-r--r--examples/markdown_middleware/priv/video.md9
-rw-r--r--examples/markdown_middleware/rebar.config8
-rw-r--r--examples/markdown_middleware/src/markdown_converter.erl29
-rw-r--r--examples/markdown_middleware/src/markdown_middleware.app.src15
-rw-r--r--examples/markdown_middleware/src/markdown_middleware.erl14
-rw-r--r--examples/markdown_middleware/src/markdown_middleware_app.erl29
-rw-r--r--examples/markdown_middleware/src/markdown_middleware_sup.erl23
-rwxr-xr-xexamples/markdown_middleware/start.sh3
12 files changed, 157 insertions, 0 deletions
diff --git a/examples/README.md b/examples/README.md
index a8b897a..442b149 100644
--- a/examples/README.md
+++ b/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)
diff --git a/examples/markdown_middleware/README.md b/examples/markdown_middleware/README.md
new file mode 100644
index 0000000..af7937f
--- /dev/null
+++ b/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.
diff --git a/examples/markdown_middleware/priv/small.mp4 b/examples/markdown_middleware/priv/small.mp4
new file mode 100644
index 0000000..1fc4788
--- /dev/null
+++ b/examples/markdown_middleware/priv/small.mp4
Binary files differ
diff --git a/examples/markdown_middleware/priv/small.ogv b/examples/markdown_middleware/priv/small.ogv
new file mode 100644
index 0000000..6409d6e
--- /dev/null
+++ b/examples/markdown_middleware/priv/small.ogv
Binary files differ
diff --git a/examples/markdown_middleware/priv/video.md b/examples/markdown_middleware/priv/video.md
new file mode 100644
index 0000000..422bd32
--- /dev/null
+++ b/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/)
diff --git a/examples/markdown_middleware/rebar.config b/examples/markdown_middleware/rebar.config
new file mode 100644
index 0000000..bd34059
--- /dev/null
+++ b/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"}}
+]}.
diff --git a/examples/markdown_middleware/src/markdown_converter.erl b/examples/markdown_middleware/src/markdown_converter.erl
new file mode 100644
index 0000000..24bb132
--- /dev/null
+++ b/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" >>.
diff --git a/examples/markdown_middleware/src/markdown_middleware.app.src b/examples/markdown_middleware/src/markdown_middleware.app.src
new file mode 100644
index 0000000..d582399
--- /dev/null
+++ b/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, []}
+]}.
diff --git a/examples/markdown_middleware/src/markdown_middleware.erl b/examples/markdown_middleware/src/markdown_middleware.erl
new file mode 100644
index 0000000..49c16dc
--- /dev/null
+++ b/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).
diff --git a/examples/markdown_middleware/src/markdown_middleware_app.erl b/examples/markdown_middleware/src/markdown_middleware_app.erl
new file mode 100644
index 0000000..75ad886
--- /dev/null
+++ b/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.
diff --git a/examples/markdown_middleware/src/markdown_middleware_sup.erl b/examples/markdown_middleware/src/markdown_middleware_sup.erl
new file mode 100644
index 0000000..4bf71d1
--- /dev/null
+++ b/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}}.
diff --git a/examples/markdown_middleware/start.sh b/examples/markdown_middleware/start.sh
new file mode 100755
index 0000000..6b8549f
--- /dev/null
+++ b/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\")."