aboutsummaryrefslogtreecommitdiffstats
path: root/lib/inets/src/http_server/httpd_esi.erl
diff options
context:
space:
mode:
authorErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
committerErlang/OTP <[email protected]>2009-11-20 14:54:40 +0000
commit84adefa331c4159d432d22840663c38f155cd4c1 (patch)
treebff9a9c66adda4df2106dfd0e5c053ab182a12bd /lib/inets/src/http_server/httpd_esi.erl
downloadotp-84adefa331c4159d432d22840663c38f155cd4c1.tar.gz
otp-84adefa331c4159d432d22840663c38f155cd4c1.tar.bz2
otp-84adefa331c4159d432d22840663c38f155cd4c1.zip
The R13B03 release.OTP_R13B03
Diffstat (limited to 'lib/inets/src/http_server/httpd_esi.erl')
-rw-r--r--lib/inets/src/http_server/httpd_esi.erl108
1 files changed, 108 insertions, 0 deletions
diff --git a/lib/inets/src/http_server/httpd_esi.erl b/lib/inets/src/http_server/httpd_esi.erl
new file mode 100644
index 0000000000..b1a75fda52
--- /dev/null
+++ b/lib/inets/src/http_server/httpd_esi.erl
@@ -0,0 +1,108 @@
+%%
+%% %CopyrightBegin%
+%%
+%% Copyright Ericsson AB 2005-2009. All Rights Reserved.
+%%
+%% The contents of this file are subject to the Erlang Public License,
+%% Version 1.1, (the "License"); you may not use this file except in
+%% compliance with the License. You should have received a copy of the
+%% Erlang Public License along with this software. If not, it can be
+%% retrieved online at http://www.erlang.org/.
+%%
+%% Software distributed under the License is distributed on an "AS IS"
+%% basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
+%% the License for the specific language governing rights and limitations
+%% under the License.
+%%
+%% %CopyrightEnd%
+%%
+%%
+-module(httpd_esi).
+
+-export([parse_headers/1, handle_headers/1]).
+
+-include("inets_internal.hrl").
+
+%%%=========================================================================
+%%% Internal application API
+%%%=========================================================================
+
+%%--------------------------------------------------------------------------
+%% parse_headers(Data) -> {Headers, Body}
+%%
+%% Data = string() | io_list()
+%% Headers = string()
+%% Body = io_list()
+%%
+%% Description: Parses <Data> and divides it to a header part and a
+%% body part. Note that it is presumed that <Data> starts with a
+%% string including "\r\n\r\n" if there is any header information
+%% present. The returned headers will not contain the HTTP header body
+%% delimiter \r\n. (All header, header delimiters are keept.)
+%% Ex: ["Content-Type : text/html\r\n Connection : closing \r\n\r\n" |
+%% io_list()] --> {"Content-Type : text/html\r\n Connection : closing \r\n",
+%% io_list()}
+%%--------------------------------------------------------------------------
+parse_headers(Data) ->
+ parse_headers(Data, []).
+
+%%--------------------------------------------------------------------------
+%% handle_headers(Headers) -> {ok, HTTPHeaders, StatusCode} |
+%% {proceed, AbsPath}
+%% Headers = string()
+%% HTTPHeaders = [{HeaderField, HeaderValue}]
+%% HeaderField = string()
+%% HeaderValue = string()
+%% StatusCode = integer()
+%%
+%% Description: Transforms the plain HTTP header string data received
+%% from the ESI program into a list of header values and an
+%% appropriate HTTP status code. Note if a location header is present
+%% the return value will be {proceed, AbsPath}
+%%--------------------------------------------------------------------------
+handle_headers("") ->
+ {ok, [], 200};
+handle_headers(Headers) ->
+ NewHeaders = string:tokens(Headers, ?CRLF),
+ handle_headers(NewHeaders, [], 200).
+
+%%%========================================================================
+%%% Internal functions
+%%%========================================================================
+parse_headers([], Acc) ->
+ {[], lists:reverse(Acc)};
+parse_headers([?CR, ?LF, ?CR, ?LF], Acc) ->
+ {lists:reverse(Acc) ++ [?CR, ?LF], []};
+parse_headers([?CR, ?LF, ?CR, ?LF | Rest], Acc) ->
+ {lists:reverse(Acc) ++ [?CR, ?LF], Rest};
+parse_headers([Char | Rest], Acc) ->
+ parse_headers(Rest, [Char | Acc]).
+
+handle_headers([], NewHeaders, StatusCode) ->
+ {ok, NewHeaders, StatusCode};
+
+handle_headers([Header | Headers], NewHeaders, StatusCode) ->
+ {FieldName, FieldValue} = httpd_response:split_header(Header, []),
+ case FieldName of
+ "location" ->
+ case http_request:is_absolut_uri(FieldValue) of
+ true ->
+ handle_headers(Headers,
+ [{FieldName, FieldValue} | NewHeaders],
+ 302);
+ false ->
+ {proceed, FieldValue}
+ end;
+ "status" ->
+ NewStatusCode =
+ case httpd_util:split(FieldValue," ",2) of
+ {ok,[Code,_]} ->
+ list_to_integer(Code);
+ _ ->
+ 200
+ end,
+ handle_headers(Headers, NewHeaders, NewStatusCode);
+ _ ->
+ handle_headers(Headers,
+ [{FieldName, FieldValue}| NewHeaders], StatusCode)
+ end.