Browse Source

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

Loïc Hoguin 12 years ago
parent
commit
6879cd8859

+ 3 - 0
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)
 

+ 24 - 0
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.

BIN
examples/markdown_middleware/priv/small.mp4


BIN
examples/markdown_middleware/priv/small.ogv


+ 9 - 0
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/)

+ 8 - 0
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"}}
+]}.

+ 29 - 0
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" >>.

+ 15 - 0
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, []}
+]}.

+ 14 - 0
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).

+ 29 - 0
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.

+ 23 - 0
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}}.

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