diff options
Diffstat (limited to 'src/web/mod_http_bindjson.erl')
-rw-r--r-- | src/web/mod_http_bindjson.erl | 153 |
1 files changed, 75 insertions, 78 deletions
diff --git a/src/web/mod_http_bindjson.erl b/src/web/mod_http_bindjson.erl index 6090ee458..30f841c99 100644 --- a/src/web/mod_http_bindjson.erl +++ b/src/web/mod_http_bindjson.erl @@ -28,129 +28,126 @@ %%% the real stuff, this is to handle the new pluggable architecture for %%% extending ejabberd's http service. %%%---------------------------------------------------------------------- -%%% I will probable kill and merge code with the original mod_http_bind +%%% I will probable kill and merge code with the original mod_http_bind %%% if this feature gains traction. %%% Eric Cestari -module(mod_http_bindjson). + -author('steve@zeank.in-berlin.de'). %%-define(ejabberd_debug, true). -behaviour(gen_mod). --export([ - start/2, - stop/1, - process/2 - ]). +-export([start/2, stop/1, process/2]). -include("ejabberd.hrl"). + -include("jlib.hrl"). + -include("ejabberd_http.hrl"). + -include("http_bind.hrl"). -%% Duplicated from ejabberd_http_bind. -%% TODO: move to hrl file. --record(http_bind, {id, pid, to, hold, wait, process_delay, version}). +-record(http_bind, + {id, pid, to, hold, wait, process_delay, version}). %%%---------------------------------------------------------------------- %%% API %%%---------------------------------------------------------------------- -process([], #request{method = 'POST', - data = []}) -> +process([], #request{method = 'POST', data = <<>>}) -> ?DEBUG("Bad Request: no data", []), - {400, ?HEADER, {xmlelement, "h1", [], - [{xmlcdata, "400 Bad Request"}]}}; -process([], #request{method = 'POST', - data = Data, - ip = IP}) -> + {400, ?HEADER, + #xmlel{name = <<"h1">>, attrs = [], + children = [{xmlcdata, <<"400 Bad Request">>}]}}; +process([], + #request{method = 'POST', data = Data, ip = IP}) -> ?DEBUG("Incoming data: ~s", [Data]), - %NOTE the whole point of this file is this line. ejabberd_http_bindjson:process_request(Data, IP); -process([], #request{method = 'GET', - data = []}) -> +process([], #request{method = 'GET', data = <<>>}) -> {200, ?HEADER, get_human_html_xmlel()}; -process([], #request{method = 'OPTIONS', - data = []}) -> +process([], #request{method = 'OPTIONS', data = <<>>}) -> {200, ?OPTIONS_HEADER, []}; process(_Path, _Request) -> ?DEBUG("Bad Request: ~p", [_Request]), - {400, ?HEADER, {xmlelement, "h1", [], - [{xmlcdata, "400 Bad Request"}]}}. + {400, ?HEADER, + #xmlel{name = <<"h1">>, attrs = [], + children = [{xmlcdata, <<"400 Bad Request">>}]}}. get_human_html_xmlel() -> - Heading = "ejabberd " ++ atom_to_list(?MODULE), - {xmlelement, "html", [{"xmlns", "http://www.w3.org/1999/xhtml"}], - [{xmlelement, "head", [], - [{xmlelement, "title", [], [{xmlcdata, Heading}]}]}, - {xmlelement, "body", [], - [{xmlelement, "h1", [], [{xmlcdata, Heading}]}, - {xmlelement, "p", [], - [{xmlcdata, "An implementation of "}, - {xmlelement, "a", - [{"href", "http://xmpp.org/extensions/xep-0206.html"}], - [{xmlcdata, "XMPP over BOSH (XEP-0206)"}]}]}, - {xmlelement, "p", [], - [{xmlcdata, "This web page is only informative. " - "To use HTTP-Bind you need a Jabber/XMPP client that supports it."} - ]} - ]}]}. + Heading = <<"ejabberd ", + (iolist_to_binary(atom_to_list(?MODULE)))/binary>>, + #xmlel{name = <<"html">>, + attrs = + [{<<"xmlns">>, <<"http://www.w3.org/1999/xhtml">>}], + children = + [#xmlel{name = <<"head">>, attrs = [], + children = + [#xmlel{name = <<"title">>, attrs = [], + children = [{xmlcdata, Heading}]}]}, + #xmlel{name = <<"body">>, attrs = [], + children = + [#xmlel{name = <<"h1">>, attrs = [], + children = [{xmlcdata, Heading}]}, + #xmlel{name = <<"p">>, attrs = [], + children = + [{xmlcdata, <<"An implementation of ">>}, + #xmlel{name = <<"a">>, + attrs = + [{<<"href">>, + <<"http://xmpp.org/extensions/xep-0206.html">>}], + children = + [{xmlcdata, + <<"XMPP over BOSH (XEP-0206)">>}]}]}, + #xmlel{name = <<"p">>, attrs = [], + children = + [{xmlcdata, + <<"This web page is only informative. To " + "use HTTP-Bind you need a Jabber/XMPP " + "client that supports it.">>}]}]}]}. -%%%---------------------------------------------------------------------- -%%% BEHAVIOUR CALLBACKS -%%%---------------------------------------------------------------------- start(_Host, _Opts) -> setup_database(), - HTTPBindSupervisor = - {ejabberd_http_bind_sup, - {ejabberd_tmp_sup, start_link, - [ejabberd_http_bind_sup, ejabberd_http_bind]}, - permanent, - infinity, - supervisor, - [ejabberd_tmp_sup]}, - case supervisor:start_child(ejabberd_sup, HTTPBindSupervisor) of - {ok, _Pid} -> - ok; - {ok, _Pid, _Info} -> - ok; - {error, {already_started, _PidOther}} -> - % mod_http_bind is already started so it will not be started again - ok; - {error, Error} -> - {'EXIT', {start_child_error, Error}} + HTTPBindSupervisor = {ejabberd_http_bind_sup, + {ejabberd_tmp_sup, start_link, + [ejabberd_http_bind_sup, ejabberd_http_bind]}, + permanent, infinity, supervisor, [ejabberd_tmp_sup]}, + case supervisor:start_child(ejabberd_sup, + HTTPBindSupervisor) + of + {ok, _Pid} -> ok; + {ok, _Pid, _Info} -> ok; + {error, {already_started, _PidOther}} -> + % mod_http_bind is already started so it will not be started again + ok; + {error, Error} -> {'EXIT', {start_child_error, Error}} end. stop(_Host) -> - case supervisor:terminate_child(ejabberd_sup, ejabberd_http_bind_sup) of - ok -> - ok; - {error, Error} -> - {'EXIT', {terminate_child_error, Error}} + case supervisor:terminate_child(ejabberd_sup, + ejabberd_http_bind_sup) + of + ok -> ok; + {error, Error} -> + {'EXIT', {terminate_child_error, Error}} end. setup_database() -> migrate_database(), mnesia:create_table(http_bind, - [{ram_copies, [node()]}, - {local_content, true}, + [{ram_copies, [node()]}, {local_content, true}, {attributes, record_info(fields, http_bind)}]), mnesia:add_table_copy(http_bind, node(), ram_copies). migrate_database() -> case catch mnesia:table_info(http_bind, attributes) of - [id, pid, to, hold, wait, process_delay, version] -> - ok; - _ -> - %% Since the stored information is not important, instead - %% of actually migrating data, let's just destroy the table - mnesia:delete_table(http_bind) + [id, pid, to, hold, wait, process_delay, version] -> ok; + _ -> mnesia:delete_table(http_bind) end, - case catch mnesia:table_info(http_bind, local_content) of - false -> - mnesia:delete_table(http_bind); - _ -> - ok + case catch mnesia:table_info(http_bind, local_content) + of + false -> mnesia:delete_table(http_bind); + _ -> ok end. |