Packages

otpbp

7.6.2
7.18.0 7.16.1 7.15.0 7.14.0 7.13.0 7.12.0 7.11.0 7.10.2 7.9.3 7.9.2 7.9.1 7.8.7 7.8.6 7.8.5 7.8.4 7.7.1 7.7.0 7.6.3 7.6.2 7.6.1 7.6.0 7.5.1 7.5.0 7.4.0 7.3.4 7.3.3 7.3.2 7.3.1 7.3.0 7.2.0 7.1.1 7.1.0 7.0.4 7.0.3 7.0.2 7.0.1 6.26.0 6.25.0 6.24.0 6.23.0 6.22.2 6.21.3 6.21.2 6.21.1 6.20.2 6.19.1 6.19.0 6.18.3 6.18.2 6.18.1 6.18.0 6.17.1 6.17.0 6.16.0 6.15.4 6.15.3 6.15.2 6.15.1 6.15.0 6.14.0 6.13.5 6.13.4 6.13.3 6.13.2 6.13.1 6.13.0 6.12.0 6.11.2 6.11.1 6.10.0 6.9.2 6.9.1 6.9.0 6.8.0 6.7.1 6.7.0 6.6.4 6.6.3 6.6.2 6.6.1 6.6.0 6.5.0 6.4.0 6.3.3 6.3.2 6.3.1 6.3.0 6.2.1 6.2.0 6.1.0 6.0.0 5.39.0 5.38.0 5.37.0 5.36.0 5.35.2 5.34.3 5.34.2 5.34.1 5.33.1 5.32.1 5.32.0 5.31.3 5.31.2 5.31.1 5.31.0 5.30.1 5.30.0 5.29.0 5.28.4 5.28.3 5.28.2 5.28.1 5.28.0 5.27.0 5.26.5 5.26.4 5.26.3 5.26.2 5.26.1 5.26.0 5.25.0 5.24.2 5.24.1 5.23.0 5.22.2 5.22.1 5.22.0 5.21.0 5.20.1 5.20.0 5.19.4 5.19.3 5.19.2 5.19.1 5.19.0 5.18.0 5.17.0 5.16.3 5.16.1 5.16.0 5.15.1 5.15.0 5.14.0 5.13.1 5.13.0 5.12.1 5.12.0 5.11.2 5.11.1 5.10.1 5.10.0 5.9.0 5.8.0 5.7.0 5.6.1 5.6.0 5.5.0 5.4.2 5.4.1 5.4.0 5.3.0 5.2.2 5.2.1 5.2.0 5.1.2 5.1.1 4.79.0 4.78.0 4.77.0 4.76.2 4.75.3 4.75.2 4.75.1 4.74.0 4.73.1 4.73.0 4.72.3 4.72.2 4.72.1 4.72.0 4.71.1 4.71.0 4.70.0 4.69.4 4.69.3 4.69.2 4.69.1 4.69.0 4.68.0 4.67.5 4.67.4 4.67.3 4.67.2 4.67.0 4.66.0 4.65.2 4.65.1 4.64.0 4.63.2 4.63.1 4.63.0 4.62.0 4.61.1 4.61.0 4.60.4 4.60.3 4.60.2 4.60.1 4.60.0 4.59.0 4.58.0 4.57.2 4.57.1 4.57.0 4.56.2 4.56.1 4.56.0 4.55.0 4.54.0 4.53.0 4.52.1 4.52.0 4.51.3 4.51.2 4.51.0 4.50.0 4.49.3 4.49.2

OTP backports

Current section

Files

Jump to
otpbp src otpbp_httpd.erl
Raw

src/otpbp_httpd.erl

-module(otpbp_httpd).
-compile([{parse_transform, otpbp_pt}]).
-ifndef(HAVE_httpd__serve_1).
% OTP 27.0
-export([serve/1, start/1]).
-endif.
-ifndef(HAVE_httpd__serve_1).
start(Args) -> serve(Args).
serve(Args) -> argparse:run(Args, serve_cli(), #{progname => "erl -S httpd serve"}).
serve_cli() ->
#{arguments => [#{name => directory,
type => string,
help => "Directory to serve data from.",
default => "."},
#{name => help,
type => boolean,
short => $h,
long => "-help",
help => "Show this description."},
#{name => port,
type => {integer, [{min, 0}, {max, 65535}]},
short => $p,
long => "-port",
default => 8000,
help => "Port to bind on. Use '0' for the OS to automatically "
"assign a port which can then be seen on server startup."},
#{name => address,
type => {custom, fun(Input) ->
case inet:parse_address(Input) of
{ok, Address} -> Address;
{error, einval} -> error(badarg)
end
end},
short => $b,
long => "-bind",
default => {127, 0, 0, 1},
help => "IP address to listen on. Use 0.0.0.0 or :: for all interfaces."}],
help => "Start a HTTP server serving files from DIRECTORY.",
handler => fun do_serve/1}.
do_serve(#{help := true}) ->
io:put_chars(argparse:help(serve_cli())),
halt(0);
do_serve(#{address := Address, port := Port, directory := Path}) -> do_serve(Address, Port, Path).
-compile({inline, do_serve/3}).
do_serve({_, _, _, _} = Address, Port, Path) -> do_serve(Address, Port, Path, inet);
do_serve(Address, Port, Path) -> do_serve(Address, Port, Path, inet6).
do_serve(Address, Port, Path, IpFamily) ->
AbsPath = string:trim(filename:absname(Path), trailing, "/."),
inets:start(),
{ok, Pid} = httpd:start_service([{bind_address, Address},
{ipfamily, IpFamily},
{document_root, AbsPath},
{server_root, AbsPath},
{directory_index, ["index.html"]},
{port, Port},
{mime_type, "application/octet-stream"},
{mime_types, default_mime_types()},
{modules, [mod_alias, mod_dir, mod_get]}]),
% This is needed to support random port assignment (--port 0)
[{port, ActualPort}] = httpd:info(Pid, [port]),
io:fwrite("~nStarted HTTP server on http://~s:~w at ~s~n", [inet:ntoa(Address), ActualPort, AbsPath]),
receive
{From, shutdown} ->
ok = httpd:stop_service(Pid),
From ! done
end.
-compile({inline, default_mime_types/0}).
default_mime_types() -> find_mime_types("/etc/mime.types").
-compile({inline, find_mime_types/1}).
find_mime_types(Path) ->
case filelib:is_file(Path) of
true -> Path;
false ->
[{"html", "text/html"}, {"htm", "text/html"}, {"js", "text/javascript"}, {"css","text/css"},
{"gif", "image/gif"}, {"jpg", "image/jpeg"}, {"jpeg", "image/jpeg"}, {"png", "image/png"}]
end.
-endif.