Packages
otpbp
6.18.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
Current section
Files
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.