25
1
mirror of https://github.com/processone/ejabberd.git synced 2024-11-28 16:34:13 +01:00

Use p1_http from p1_utils 1.0.6

This commit is contained in:
Christophe Romain 2016-11-14 16:52:03 +01:00
parent 3765210698
commit 309962fb8b
6 changed files with 8 additions and 367 deletions

View File

@ -8,7 +8,7 @@
%%%------------------------------------------------------------------- %%%-------------------------------------------------------------------
{deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.2.1"}}}, {deps, [{lager, ".*", {git, "https://github.com/basho/lager", {tag, "3.2.1"}}},
{p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.5"}}}, {p1_utils, ".*", {git, "https://github.com/processone/p1_utils", {tag, "1.0.6"}}},
{cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.4"}}}, {cache_tab, ".*", {git, "https://github.com/processone/cache_tab", {tag, "1.0.4"}}},
{fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.7"}}}, {fast_tls, ".*", {git, "https://github.com/processone/fast_tls", {tag, "1.0.7"}}},
{stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.6"}}}, {stringprep, ".*", {git, "https://github.com/processone/stringprep", {tag, "1.0.6"}}},

View File

@ -225,7 +225,6 @@ start_apps() ->
ejabberd:start_app(fast_tls), ejabberd:start_app(fast_tls),
ejabberd:start_app(fast_xml), ejabberd:start_app(fast_xml),
ejabberd:start_app(stringprep), ejabberd:start_app(stringprep),
http_p1:start(),
ejabberd:start_app(cache_tab). ejabberd:start_app(cache_tab).
opt_type(net_ticktime) -> opt_type(net_ticktime) ->

View File

@ -45,7 +45,7 @@
start() -> start() ->
[code:add_patha(module_ebin_dir(Module)) [code:add_patha(module_ebin_dir(Module))
|| {Module, _} <- installed()], || {Module, _} <- installed()],
application:start(inets), p1_http:start(),
ejabberd_commands:register_commands(get_commands_spec()). ejabberd_commands:register_commands(get_commands_spec()).
stop() -> stop() ->
@ -271,7 +271,7 @@ geturl(Url, Hdrs, UsrOpts) ->
[U, Pass] -> [{proxy_user, U}, {proxy_password, Pass}]; [U, Pass] -> [{proxy_user, U}, {proxy_password, Pass}];
_ -> [] _ -> []
end, end,
case httpc:request(get, {Url, Hdrs}, Host++User++UsrOpts++[{version, "HTTP/1.0"}], []) of case p1_http:request(get, Url, Hdrs, [], Host++User++UsrOpts++[{version, "HTTP/1.0"}]) of
{ok, {{_, 200, _}, Headers, Response}} -> {ok, {{_, 200, _}, Headers, Response}} ->
{ok, Headers, Response}; {ok, Headers, Response};
{ok, {{_, Code, _}, _Headers, Response}} -> {ok, {{_, Code, _}, _Headers, Response}} ->

View File

@ -1,358 +0,0 @@
%%%----------------------------------------------------------------------
%%% File : http_p1.erl
%%% Author : Emilio Bustos <ebustos@process-one.net>
%%% Purpose : Provide a common API for inets / lhttpc / ibrowse
%%% Created : 29 Jul 2010 by Emilio Bustos <ebustos@process-one.net>
%%%
%%%
%%% ejabberd, Copyright (C) 2002-2016 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.,
%%% 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
%%%
%%%----------------------------------------------------------------------
-module(http_p1).
-author('ebustos@process-one.net').
-export([start/0, stop/0, get/1, get/2, post/2, post/3,
request/3, request/4, request/5,
get_pool_size/0, set_pool_size/1]).
-include("logger.hrl").
-define(USE_INETS, 1).
% -define(USE_LHTTPC, 1).
% -define(USE_IBROWSE, 1).
% inets used as default if none specified
-ifdef(USE_IBROWSE).
start() ->
ejabberd:start_app(ibrowse).
stop() ->
application:stop(ibrowse).
request(Method, URL, Hdrs, Body, Opts) ->
TimeOut = proplists:get_value(timeout, Opts, infinity),
Options = [{inactivity_timeout, TimeOut}
| proplists:delete(timeout, Opts)],
case ibrowse:send_req(URL, Hdrs, Method, Body, Options)
of
{ok, Status, Headers, Response} ->
{ok, jlib:binary_to_integer(Status), Headers,
Response};
{error, Reason} -> {error, Reason}
end.
get_pool_size() ->
application:get_env(ibrowse, default_max_sessions, 10).
set_pool_size(Size) ->
application:set_env(ibrowse, default_max_sessions, Size).
-else.
-ifdef(USE_LHTTPC).
start() ->
ejabberd:start_app(lhttpc).
stop() ->
application:stop(lhttpc).
request(Method, URL, Hdrs, Body, Opts) ->
{[TO, SO], Rest} = proplists:split(Opts, [timeout, socket_options]),
TimeOut = proplists:get_value(timeout, TO, infinity),
SockOpt = proplists:get_value(socket_options, SO, []),
Options = [{connect_options, SockOpt} | Rest],
Result = lhttpc:request(URL, Method, Hdrs, Body, TimeOut, Options),
?DEBUG("HTTP request -> response:~n"
"** Method = ~p~n"
"** URI = ~s~n"
"** Body = ~s~n"
"** Hdrs = ~p~n"
"** Timeout = ~p~n"
"** Options = ~p~n"
"** Response = ~p",
[Method, URL, Body, Hdrs, TimeOut, Options, Result]),
case Result of
{ok, {{Status, _Reason}, Headers, Response}} ->
{ok, Status, Headers, (Response)};
{error, Reason} -> {error, Reason}
end.
get_pool_size() ->
Opts = proplists:get_value(lhttpc_manager, lhttpc_manager:list_pools()),
proplists:get_value(max_pool_size,Opts).
set_pool_size(Size) ->
lhttpc_manager:set_max_pool_size(lhttpc_manager, Size).
-else.
start() ->
ejabberd:start_app(inets).
stop() ->
application:stop(inets).
to_list(Str) when is_binary(Str) ->
binary_to_list(Str);
to_list(Str) ->
Str.
request(Method, URLRaw, HdrsRaw, Body, Opts) ->
Hdrs = lists:map(fun({N, V}) ->
{to_list(N), to_list(V)}
end, HdrsRaw),
URL = to_list(URLRaw),
Request = case Method of
get -> {URL, Hdrs};
head -> {URL, Hdrs};
delete -> {URL, Hdrs};
_ -> % post, etc.
{URL, Hdrs,
to_list(proplists:get_value(<<"content-type">>, HdrsRaw, [])),
Body}
end,
Options = case proplists:get_value(timeout, Opts,
infinity)
of
infinity -> proplists:delete(timeout, Opts);
_ -> Opts
end,
case httpc:request(Method, Request, Options, []) of
{ok, {{_, Status, _}, Headers, Response}} ->
{ok, Status, Headers, Response};
{error, Reason} -> {error, Reason}
end.
get_pool_size() ->
{ok, Size} = httpc:get_option(max_sessions),
Size.
set_pool_size(Size) ->
httpc:set_option(max_sessions, Size).
-endif.
-endif.
-type({header,
{type, 63, tuple,
[{type, 63, union,
[{type, 63, string, []}, {type, 63, atom, []}]},
{type, 63, string, []}]},
[]}).
-type({headers,
{type, 64, list, [{type, 64, header, []}]}, []}).
-type({option,
{type, 67, union,
[{type, 67, tuple,
[{atom, 67, connect_timeout}, {type, 67, timeout, []}]},
{type, 68, tuple,
[{atom, 68, timeout}, {type, 68, timeout, []}]},
{type, 70, tuple,
[{atom, 70, send_retry},
{type, 70, non_neg_integer, []}]},
{type, 71, tuple,
[{atom, 71, partial_upload},
{type, 71, union,
[{type, 71, non_neg_integer, []},
{atom, 71, infinity}]}]},
{type, 72, tuple,
[{atom, 72, partial_download}, {type, 72, pid, []},
{type, 72, union,
[{type, 72, non_neg_integer, []},
{atom, 72, infinity}]}]}]},
[]}).
-type({options,
{type, 74, list, [{type, 74, option, []}]}, []}).
-type({result,
{type, 76, union,
[{type, 76, tuple,
[{atom, 76, ok},
{type, 76, tuple,
[{type, 76, tuple,
[{type, 76, pos_integer, []}, {type, 76, string, []}]},
{type, 76, headers, []}, {type, 76, string, []}]}]},
{type, 77, tuple,
[{atom, 77, error}, {type, 77, atom, []}]}]},
[]}).
%% @spec (URL) -> Result
%% URL = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a GET request.
%% Would be the same as calling `request(get, URL, [])',
%% that is {@link request/3} with an empty header list.
%% @end
%% @see request/3
-spec get(string()) -> result().
get(URL) -> request(get, URL, []).
%% @spec (URL, Hdrs) -> Result
%% URL = string()
%% Hdrs = [{Header, Value}]
%% Header = string()
%% Value = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a GET request.
%% Would be the same as calling `request(get, URL, Hdrs)'.
%% @end
%% @see request/3
-spec get(string(), headers()) -> result().
get(URL, Hdrs) -> request(get, URL, Hdrs).
%% @spec (URL, RequestBody) -> Result
%% URL = string()
%% RequestBody = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a POST request with form data.
%% Would be the same as calling
%% `request(post, URL, [{"content-type", "x-www-form-urlencoded"}], Body)'.
%% @end
%% @see request/4
-spec post(string(), string()) -> result().
post(URL, Body) ->
request(post, URL,
[{<<"content-type">>, <<"x-www-form-urlencoded">>}],
Body).
%% @spec (URL, Hdrs, RequestBody) -> Result
%% URL = string()
%% Hdrs = [{Header, Value}]
%% Header = string()
%% Value = string()
%% RequestBody = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a POST request.
%% Would be the same as calling
%% `request(post, URL, Hdrs, Body)'.
%% @end
%% @see request/4
-spec post(string(), headers(), string()) -> result().
post(URL, Hdrs, Body) ->
NewHdrs = case [X
|| {X, _} <- Hdrs,
str:to_lower(X) == <<"content-type">>]
of
[] ->
[{<<"content-type">>, <<"x-www-form-urlencoded">>}
| Hdrs];
_ -> Hdrs
end,
request(post, URL, NewHdrs, Body).
%% @spec (Method, URL, Hdrs) -> Result
%% Method = atom()
%% URL = string()
%% Hdrs = [{Header, Value}]
%% Header = string()
%% Value = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a request without a body.
%% Would be the same as calling `request(Method, URL, Hdrs, [], [])',
%% that is {@link request/5} with an empty body.
%% @end
%% @see request/5
-spec request(atom(), string(), headers()) -> result().
request(Method, URL, Hdrs) ->
request(Method, URL, Hdrs, [], []).
%% @spec (Method, URL, Hdrs, RequestBody) -> Result
%% Method = atom()
%% URL = string()
%% Hdrs = [{Header, Value}]
%% Header = string()
%% Value = string()
%% RequestBody = string()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a request with a body.
%% Would be the same as calling
%% `request(Method, URL, Hdrs, Body, [])', that is {@link request/5}
%% with no options.
%% @end
%% @see request/5
-spec request(atom(), string(), headers(), string()) -> result().
request(Method, URL, Hdrs, Body) ->
request(Method, URL, Hdrs, Body, []).
%% @spec (Method, URL, Hdrs, RequestBody, Options) -> Result
%% Method = atom()
%% URL = string()
%% Hdrs = [{Header, Value}]
%% Header = string()
%% Value = string()
%% RequestBody = string()
%% Options = [Option]
%% Option = {timeout, Milliseconds | infinity} |
%% {connect_timeout, Milliseconds | infinity} |
%% {socket_options, [term()]} |
%% Milliseconds = integer()
%% Result = {ok, StatusCode, Hdrs, ResponseBody}
%% | {error, Reason}
%% StatusCode = integer()
%% ResponseBody = string()
%% Reason = connection_closed | connect_timeout | timeout
%% @doc Sends a request with a body.
%% Would be the same as calling
%% `request(Method, URL, Hdrs, Body, [])', that is {@link request/5}
%% with no options.
%% @end
%% @see request/5
-spec request(atom(), string(), headers(), string(), options()) -> result().
% ibrowse {response_format, response_format()} |
% Options - [option()]
% Option - {sync, boolean()} | {stream, StreamTo} | {body_format, body_format()} | {full_result,
% boolean()} | {headers_as_is, boolean()}
%body_format() = string() | binary()
% The body_format option is only valid for the synchronous request and the default is string.
% When making an asynchronous request the body will always be received as a binary.
% lhttpc: always binary

View File

@ -89,9 +89,9 @@ loop(_State) -> receive stop -> ok end.
%% TODO: Support comment lines starting by % %% TODO: Support comment lines starting by %
update_bl_c2s() -> update_bl_c2s() ->
?INFO_MSG("Updating C2S Blacklist", []), ?INFO_MSG("Updating C2S Blacklist", []),
case httpc:request(?BLC2S) of case p1_http:get(?BLC2S) of
{ok, 200, _Headers, Body} -> {ok, 200, _Headers, Body} ->
IPs = str:tokens(Body, <<"\n">>), IPs = str:tokens(iolist_to_binary(Body), <<"\n">>),
ets:delete_all_objects(bl_c2s), ets:delete_all_objects(bl_c2s),
lists:foreach(fun (IP) -> lists:foreach(fun (IP) ->
ets:insert(bl_c2s, ets:insert(bl_c2s,

View File

@ -36,14 +36,14 @@
-define(CONNECT_TIMEOUT, 8000). -define(CONNECT_TIMEOUT, 8000).
start(Host) -> start(Host) ->
http_p1:start(), p1_http:start(),
Pool_size = Pool_size =
ejabberd_config:get_option({ext_api_http_pool_size, Host}, ejabberd_config:get_option({ext_api_http_pool_size, Host},
fun(X) when is_integer(X), X > 0-> fun(X) when is_integer(X), X > 0->
X X
end, end,
100), 100),
http_p1:set_pool_size(Pool_size). p1_http:set_pool_size(Pool_size).
stop(_Host) -> stop(_Host) ->
ok. ok.
@ -91,7 +91,7 @@ request(Server, Method, Path, Params, Mime, Data) ->
{"content-type", Mime}, {"content-type", Mime},
{"User-Agent", "ejabberd"}], {"User-Agent", "ejabberd"}],
Begin = os:timestamp(), Begin = os:timestamp(),
Result = case catch http_p1:request(Method, URI, Hdrs, Data, Opts) of Result = case catch p1_http:request(Method, URI, Hdrs, Data, Opts) of
{ok, Code, _, <<>>} -> {ok, Code, _, <<>>} ->
{ok, Code, []}; {ok, Code, []};
{ok, Code, _, <<" ">>} -> {ok, Code, _, <<" ">>} ->