From 98ae01b599fcaa91f0f66ca1218cdf6c3e28d3c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lo=C3=AFc=20Hoguin?= Date: Fri, 23 Dec 2016 12:19:27 +0100 Subject: Update the cowboy_static manual --- doc/src/manual/cowboy_static.asciidoc | 141 ++++++++++++++++++++++++++++------ 1 file changed, 119 insertions(+), 22 deletions(-) (limited to 'doc') diff --git a/doc/src/manual/cowboy_static.asciidoc b/doc/src/manual/cowboy_static.asciidoc index 658d93b..7a78660 100644 --- a/doc/src/manual/cowboy_static.asciidoc +++ b/doc/src/manual/cowboy_static.asciidoc @@ -2,40 +2,137 @@ == Name -cowboy_static - static file handler +cowboy_static - Static file handler == Description -The `cowboy_static` module implements file serving capabilities -by using the REST semantics provided by `cowboy_rest`. +The module `cowboy_static` implements file serving capabilities +using the REST semantics provided by `cowboy_rest`. -== Types +The static file handler is a pre-written handler coming with +Cowboy. To serve files, use it in your routes. -=== opts() = [Option] +== Options [source,erlang] ---- -Option = {priv_file, atom(), string() | binary()} - | {priv_file, atom(), string() | binary(), Extra} - | {file, string() | binary()} - | {file, string() | binary(), Extra} - | {priv_dir, atom(), string() | binary()} - | {priv_dir, atom(), string() | binary(), Extra} - | {dir, string() | binary()} - | {dir, string() | binary(), Extra} +opts() :: {priv_file, App, Path} + | {priv_file, App, Path, Extra} + | {file, Path} + | {file, Path, Extra} + | {priv_dir, App, Path} + | {priv_dir, App, Path, Extra} + | {dir, Path} + | {dir, Path, Extra} -Extra = [ETag | Mimetypes] +App :: atom() +Path :: binary() | string() +Extra :: [Etag | Mimetypes] -ETag = {etag, module(), function()} | {etag, false} +Etag :: {etag, module(), function()} + | {etag, false} -Mimetypes = {mimetypes, module(), function()} - | {mimetypes, binary() | {binary(), binary(), [{binary(), binary()}]}} +Mimetypes :: {mimetypes, module(), function()} + | {mimetypes, binary() | ParsedMime} + +ParsedMime :: {Type :: binary(), SubType :: binary(), Params} +Params :: [{Key :: binary(), Value :: binary()}] +---- + +Static handler configuration. + +priv_file:: + +Send a file. ++ +The path is relative to the given application's private +directory. + +file:: + +Send a file. ++ +The path is either absolute or relative to the Erlang node's +current directory. + +priv_dir:: + +Recursively serve files from a directory. ++ +The path is relative to the given application's private +directory. + +dir:: + +Recursively serve files from a directory. ++ +The path is either absolute or relative to the Erlang node's +current directory. + +The extra options allow you to define how the etag should be +calculated and how the MIME type of files should be detected. + +By default the static handler will generate an etag based +on the size and modification time of the file. You may disable +the etag entirely with `{etag, false}` or provide a module +and function that will be called when needed: + +[source,erlang] +---- +generate_etag(Path, Size, Mtime) -> {strong | weak, binary()} + +Path :: binary() +Size :: non_neg_integer() +Mtime :: file:date_time() ---- -Configuration for the static handler. +By default the static handler will detect Web-related MIME types +by looking at the file extension. You can provide a specific +MIME type that will always be used, or a module and function that +will be called when needed: + +[source,erlang] +---- +detect_mimetype(Path) -> ParsedMime + +Path :: binary() +ParsedMime :: {Type :: binary(), SubType :: binary(), Params} +Params :: [{Key :: binary(), Value :: binary()}] +---- + +Cowboy comes with two such functions; the default function +`cow_mimetypes:web/1`, and a second function generated from +the Apache 'mime.types' file, `cow_mimetypes:all/1`. + +The MIME type function should return +`{<<"application">>, <<"octet-stream">>, []}` +when it fails to detect a file's MIME type. + +== Changelog + +* *1.0*: Handler introduced. + +== Examples + +.Custom etag function +[source,erlang] +---- +generate_etag(Path, Size, Mtime) -> + {strong, integer_to_binary( + erlang:phash2({Path, Size, Mtime}, 16#ffffffff))}. +---- + +.Custom MIME type function +[source,erlang] +---- +always_octet_stream(_Path) -> + case filename:extension(Path) of + <<".erl">> -> {<<"text">>, <<"plain">>, []}; + _ -> {<<"application">>, <<"octet-stream">>, []} + end. +---- -The handler can be configured for sending either one file or -a directory (including its subdirectories). +== See also -Extra options allow you to define how the etag should be calculated -and how the mimetype of files should be detected. +link:man:cowboy(7)[cowboy(7)], +link:man:cowboy_router(3)[cowboy_router(3)] -- cgit v1.2.3