|
@@ -22,6 +22,7 @@
|
|
-export([parse_version/1]).
|
|
-export([parse_version/1]).
|
|
|
|
|
|
-export([request/4]).
|
|
-export([request/4]).
|
|
|
|
+-export([response/3]).
|
|
-export([version/1]).
|
|
-export([version/1]).
|
|
|
|
|
|
-type version() :: 'HTTP/1.0' | 'HTTP/1.1'.
|
|
-type version() :: 'HTTP/1.0' | 'HTTP/1.1'.
|
|
@@ -243,6 +244,12 @@ request(Method, Path, Version, Headers) ->
|
|
[[N, <<": ">>, V, <<"\r\n">>] || {N, V} <- Headers],
|
|
[[N, <<": ">>, V, <<"\r\n">>] || {N, V} <- Headers],
|
|
<<"\r\n">>].
|
|
<<"\r\n">>].
|
|
|
|
|
|
|
|
+-spec response(status() | binary(), version(), headers()) -> iodata().
|
|
|
|
+response(Status, Version, Headers) ->
|
|
|
|
+ [version(Version), <<" ">>, status(Status), <<"\r\n">>,
|
|
|
|
+ [[N, <<": ">>, V, <<"\r\n">>] || {N, V} <- Headers],
|
|
|
|
+ <<"\r\n">>].
|
|
|
|
+
|
|
%% @doc Return the version as a binary.
|
|
%% @doc Return the version as a binary.
|
|
|
|
|
|
-spec version(version()) -> binary().
|
|
-spec version(version()) -> binary().
|
|
@@ -256,3 +263,65 @@ version_test() ->
|
|
{'EXIT', _} = (catch version('HTTP/1.2')),
|
|
{'EXIT', _} = (catch version('HTTP/1.2')),
|
|
ok.
|
|
ok.
|
|
-endif.
|
|
-endif.
|
|
|
|
+
|
|
|
|
+%% @doc Return the status code and string as binary.
|
|
|
|
+
|
|
|
|
+-spec status(status() | binary()) -> binary().
|
|
|
|
+status(100) -> <<"100 Continue">>;
|
|
|
|
+status(101) -> <<"101 Switching Protocols">>;
|
|
|
|
+status(102) -> <<"102 Processing">>;
|
|
|
|
+status(200) -> <<"200 OK">>;
|
|
|
|
+status(201) -> <<"201 Created">>;
|
|
|
|
+status(202) -> <<"202 Accepted">>;
|
|
|
|
+status(203) -> <<"203 Non-Authoritative Information">>;
|
|
|
|
+status(204) -> <<"204 No Content">>;
|
|
|
|
+status(205) -> <<"205 Reset Content">>;
|
|
|
|
+status(206) -> <<"206 Partial Content">>;
|
|
|
|
+status(207) -> <<"207 Multi-Status">>;
|
|
|
|
+status(226) -> <<"226 IM Used">>;
|
|
|
|
+status(300) -> <<"300 Multiple Choices">>;
|
|
|
|
+status(301) -> <<"301 Moved Permanently">>;
|
|
|
|
+status(302) -> <<"302 Found">>;
|
|
|
|
+status(303) -> <<"303 See Other">>;
|
|
|
|
+status(304) -> <<"304 Not Modified">>;
|
|
|
|
+status(305) -> <<"305 Use Proxy">>;
|
|
|
|
+status(306) -> <<"306 Switch Proxy">>;
|
|
|
|
+status(307) -> <<"307 Temporary Redirect">>;
|
|
|
|
+status(400) -> <<"400 Bad Request">>;
|
|
|
|
+status(401) -> <<"401 Unauthorized">>;
|
|
|
|
+status(402) -> <<"402 Payment Required">>;
|
|
|
|
+status(403) -> <<"403 Forbidden">>;
|
|
|
|
+status(404) -> <<"404 Not Found">>;
|
|
|
|
+status(405) -> <<"405 Method Not Allowed">>;
|
|
|
|
+status(406) -> <<"406 Not Acceptable">>;
|
|
|
|
+status(407) -> <<"407 Proxy Authentication Required">>;
|
|
|
|
+status(408) -> <<"408 Request Timeout">>;
|
|
|
|
+status(409) -> <<"409 Conflict">>;
|
|
|
|
+status(410) -> <<"410 Gone">>;
|
|
|
|
+status(411) -> <<"411 Length Required">>;
|
|
|
|
+status(412) -> <<"412 Precondition Failed">>;
|
|
|
|
+status(413) -> <<"413 Request Entity Too Large">>;
|
|
|
|
+status(414) -> <<"414 Request-URI Too Long">>;
|
|
|
|
+status(415) -> <<"415 Unsupported Media Type">>;
|
|
|
|
+status(416) -> <<"416 Requested Range Not Satisfiable">>;
|
|
|
|
+status(417) -> <<"417 Expectation Failed">>;
|
|
|
|
+status(418) -> <<"418 I'm a teapot">>;
|
|
|
|
+status(422) -> <<"422 Unprocessable Entity">>;
|
|
|
|
+status(423) -> <<"423 Locked">>;
|
|
|
|
+status(424) -> <<"424 Failed Dependency">>;
|
|
|
|
+status(425) -> <<"425 Unordered Collection">>;
|
|
|
|
+status(426) -> <<"426 Upgrade Required">>;
|
|
|
|
+status(428) -> <<"428 Precondition Required">>;
|
|
|
|
+status(429) -> <<"429 Too Many Requests">>;
|
|
|
|
+status(431) -> <<"431 Request Header Fields Too Large">>;
|
|
|
|
+status(500) -> <<"500 Internal Server Error">>;
|
|
|
|
+status(501) -> <<"501 Not Implemented">>;
|
|
|
|
+status(502) -> <<"502 Bad Gateway">>;
|
|
|
|
+status(503) -> <<"503 Service Unavailable">>;
|
|
|
|
+status(504) -> <<"504 Gateway Timeout">>;
|
|
|
|
+status(505) -> <<"505 HTTP Version Not Supported">>;
|
|
|
|
+status(506) -> <<"506 Variant Also Negotiates">>;
|
|
|
|
+status(507) -> <<"507 Insufficient Storage">>;
|
|
|
|
+status(510) -> <<"510 Not Extended">>;
|
|
|
|
+status(511) -> <<"511 Network Authentication Required">>;
|
|
|
|
+status(B) when is_binary(B) -> B.
|