%%
%% %CopyrightBegin%
%%
%% Copyright Ericsson AB 1997-2016. All Rights Reserved.
%%
%% Licensed under the Apache License, Version 2.0 (the "License");
%% you may not use this file except in compliance with the License.
%% You may obtain a copy of the License at
%%
%% http://www.apache.org/licenses/LICENSE-2.0
%%
%% Unless required by applicable law or agreed to in writing, software
%% distributed under the License is distributed on an "AS IS" BASIS,
%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
%% See the License for the specific language governing permissions and
%% limitations under the License.
%%
%% %CopyrightEnd%
%%
%%
-module(httpd_example).
-export([print/1]).
-export([get/2, put/2, post/2, yahoo/2, test1/2, get_bin/2, peer/2,new_status_and_location/2]).
-export([newformat/3, post_chunked/3, post_204/3]).
%% These are used by the inets test-suite
-export([delay/1, chunk_timeout/3]).
print(String) ->
[header(),
top("Print"),
String++"\n",
footer()].
test1(Env, []) ->
io:format("Env:~p~n",[Env]),
["",
"
",
"Test1",
"",
"",
"Erlang Body
",
"Stuff
",
"",
""].
get(_Env,[]) ->
[header(),
top("GET Example"),
"" ++ "\n",
footer()];
get(Env,Input) ->
default(Env,Input).
put(Env,{Input,_Body}) ->
default(Env,Input);
put(Env,Input) ->
default(Env,Input).
get_bin(_Env,_Input) ->
[list_to_binary(header()),
list_to_binary(top("GET Example")),
list_to_binary("" ++ "\n"),
list_to_binary(footer())].
post(_Env,[]) ->
[header(),
top("POST Example"),
"" ++ "\n",
footer()];
post(Env,Input) ->
default(Env,Input).
yahoo(_Env,_Input) ->
"Location: http://www.yahoo.com\r\n\r\n".
new_status_and_location(_Env,_Input) ->
"status:201 Created\r\n Location: http://www.yahoo.com\r\n\r\n".
default(Env,Input) ->
[header(),
top("Default Example"),
"Environment: ",io_lib:format("~p",[Env]),"
\n",
"Input: ",Input,"
\n",
"Parsed Input: ",
io_lib:format("~p",[httpd:parse_query(Input)]),"\n",
footer()].
peer(Env, _Input) ->
Header =
case proplists:get_value(peer_cert, Env) of
undefined ->
header("text/html", "Peer-Cert-Exist:false");
_ ->
header("text/html", "Peer-Cert-Exist:true")
end,
[Header,
top("Test peer_cert environment option"),
"Peer cert: ",
io_lib:format("~p",[proplists:get_value(peer_cert, Env)]),"\n",
footer()].
header() ->
header("text/html").
header(MimeType) ->
"Content-type: " ++ MimeType ++ "\r\n\r\n".
header(MimeType, Other) ->
"Content-type: " ++ MimeType ++ "\r\n" ++ Other ++ "\r\n\r\n".
top(Title) ->
"
" ++ Title ++ "
\n".
footer() ->
"
\n".
post_chunked(_SessionID, _Env, {first, _Body} = _Bodychunk) ->
{continue, {state, 1}};
post_chunked(_SessionID, _Env, {continue, _Body, {state, N}} = _Bodychunk) ->
{continue, {state, N+1}};
post_chunked(SessionID, _Env, {last, _Body, {state, N}} = _Bodychunk) ->
mod_esi:deliver(SessionID, "Content-Type:text/html\r\n\r\n"),
mod_esi:deliver(SessionID, top("Received chunked body")),
mod_esi:deliver(SessionID, "Received" ++ integer_to_list(N) ++ "chunks"),
mod_esi:deliver(SessionID, footer());
post_chunked(SessionID, _Env, {last, _Body, undefined} = _Bodychunk) ->
mod_esi:deliver(SessionID, "Content-Type:text/html\r\n\r\n"),
mod_esi:deliver(SessionID, top("Received chunked body")),
mod_esi:deliver(SessionID, "Received 1 chunk"),
mod_esi:deliver(SessionID, footer());
post_chunked(_, _, _Body) ->
exit(body_not_chunked).
post_204(SessionID, _Env, _Input) ->
mod_esi:deliver(SessionID,
["Status: 204 No Content" ++ "\r\n\r\n"]),
mod_esi:deliver(SessionID, []).
newformat(SessionID,_,_) ->
mod_esi:deliver(SessionID, "Content-Type:text/html\r\n\r\n"),
mod_esi:deliver(SessionID, top("new esi format test")),
mod_esi:deliver(SessionID, "This new format is nice
"),
mod_esi:deliver(SessionID, "This new format is nice
"),
mod_esi:deliver(SessionID, "This new format is nice
"),
mod_esi:deliver(SessionID, footer()).
%% ------------------------------------------------------
delay(Time) when is_integer(Time) ->
i("httpd_example:delay(~p) -> do the delay",[Time]),
sleep(Time),
i("httpd_example:delay(~p) -> done, now reply",[Time]),
delay_reply("delay ok");
delay(Time) when is_list(Time) ->
delay(list_to_integer(Time));
delay({error,_Reason}) ->
i("delay -> called with invalid time"),
delay_reply("delay failed: invalid delay time").
delay_reply(Reply) ->
[header(),
top("delay"),
Reply,
footer()].
i(F) -> i(F,[]).
i(F,A) -> io:format(F ++ "~n",A).
sleep(T) -> receive after T -> ok end.
%% ------------------------------------------------------
chunk_timeout(SessionID, _, _StrInt) ->
mod_esi:deliver(SessionID, "Tranfer-Encoding:chunked/html\r\n\r\n"),
mod_esi:deliver(SessionID, top("Test chunk encoding timeout")),
timer:sleep(20000),
mod_esi:deliver(SessionID, footer()).