diff options
author | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2013-05-28 00:12:00 +1000 |
---|---|---|
committer | Evgeniy Khramtsov <ekhramtsov@process-one.net> | 2013-05-28 00:12:00 +1000 |
commit | e4ec23919de96f034190253c8cef50f2f02c0b3a (patch) | |
tree | 2733981d8189047ffb47dc47adc072e5240e0e7e /src/mod_http_bindjson.erl | |
parent | Merge branch '3.0.x' of github.com:processone/maincustomers into 3.0.x (diff) | |
parent | Improve applications startup (diff) |
Merge branch 'rebar' into 3.0.xv3.0.0-P004
Diffstat (limited to 'src/mod_http_bindjson.erl')
-rw-r--r-- | src/mod_http_bindjson.erl | 154 |
1 files changed, 154 insertions, 0 deletions
diff --git a/src/mod_http_bindjson.erl b/src/mod_http_bindjson.erl new file mode 100644 index 000000000..94bec7605 --- /dev/null +++ b/src/mod_http_bindjson.erl @@ -0,0 +1,154 @@ +%%%---------------------------------------------------------------------- +%%% File : mod_http_bindjson.erl +%%% Original Author : Stefan Strigler <steve@zeank.in-berlin.de> +%%% Purpose : Implementation of XMPP over BOSH (XEP-0206) +%%% Created : Tue Feb 20 13:15:52 CET 2007 +%%% +%%% ejabberd, Copyright (C) 2002-2013 ProcessOne +%%% +%%% This program is free software; you can redistribute it and/or +%%% modify it under the terms of the GNU General Public License as +%%% published by the Free Software Foundation; either version 2 of the +%%% License, or (at your option) any later version. +%%% +%%% This program is distributed in the hope that it will be useful, +%%% but WITHOUT ANY WARRANTY; without even the implied warranty of +%%% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%%% General Public License for more details. +%%% +%%% You should have received a copy of the GNU General Public License +%%% along with this program; if not, write to the Free Software +%%% Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +%%% 02111-1307 USA +%%% +%%%---------------------------------------------------------------------- + +%%%---------------------------------------------------------------------- +%%% This module acts as a bridge to ejabberd_http_bind which implements +%%% 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 +%%% 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]). + +-include("ejabberd.hrl"). +-include("logger.hrl"). + +-include("jlib.hrl"). + +-include("ejabberd_http.hrl"). + +-include("http_bind.hrl"). + +-record(http_bind, + {id, pid, to, hold, wait, process_delay, version}). + +%%%---------------------------------------------------------------------- +%%% API +%%%---------------------------------------------------------------------- + +process([], #request{method = 'POST', data = <<>>}) -> + ?DEBUG("Bad Request: no data", []), + {400, ?HEADER, + #xmlel{name = <<"h1">>, attrs = [], + children = [{xmlcdata, <<"400 Bad Request">>}]}}; +process([], + #request{method = 'POST', data = Data, ip = IP}) -> + ?DEBUG("Incoming data: ~s", [Data]), + ejabberd_http_bindjson:process_request(Data, IP); +process([], #request{method = 'GET', data = <<>>}) -> + {200, ?HEADER, get_human_html_xmlel()}; +process([], #request{method = 'OPTIONS', data = <<>>}) -> + {200, ?OPTIONS_HEADER, []}; +process(_Path, _Request) -> + ?DEBUG("Bad Request: ~p", [_Request]), + {400, ?HEADER, + #xmlel{name = <<"h1">>, attrs = [], + children = [{xmlcdata, <<"400 Bad Request">>}]}}. + +get_human_html_xmlel() -> + 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.">>}]}]}]}. + +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}} + end. + +stop(_Host) -> + 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}, + {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; + _ -> mnesia:delete_table(http_bind) + end, + case catch mnesia:table_info(http_bind, local_content) + of + false -> mnesia:delete_table(http_bind); + _ -> ok + end. |