% 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.

-module(test_request).

-export([get/1, get/2, get/3]).
-export([post/2, post/3, post/4]).
-export([put/2, put/3, put/4]).
-export([delete/1, delete/2]).
-export([options/1, options/2, options/3]).
-export([request/3, request/4]).

get(Url) ->
    request(get, Url, []).

get(Url, Headers) ->
    request(get, Url, Headers).
get(Url, Headers, Opts) ->
    request(get, Url, Headers, [], Opts).

post(Url, Body) ->
    request(post, Url, [], Body).

post(Url, Headers, Body) ->
    request(post, Url, Headers, Body).

post(Url, Headers, Body, Opts) ->
    request(post, Url, Headers, Body, Opts).

put(Url, Body) ->
    request(put, Url, [], Body).

put(Url, Headers, Body) ->
    request(put, Url, Headers, Body).

put(Url, Headers, Body, Opts) ->
    request(put, Url, Headers, Body, Opts).

delete(Url) ->
    request(delete, Url, []).

delete(Url, Opts) ->
    request(delete, Url, [], [], Opts).

options(Url) ->
    request(options, Url, []).

options(Url, Headers) ->
    request(options, Url, Headers).

options(Url, Headers, Opts) ->
    request(options, Url, Headers, [], Opts).


request(Method, Url, Headers) ->
    request(Method, Url, Headers, []).

request(Method, Url, Headers, Body) ->
    request(Method, Url, Headers, Body, [], 3).

request(Method, Url, Headers, Body, Opts) ->
    request(Method, Url, Headers, Body, Opts, 3).

request(_Method, _Url, _Headers, _Body, _Opts, 0) ->
    {error, request_failed};
request(Method, Url, Headers, Body, Opts, N) ->
    case code:is_loaded(ibrowse) of
        false ->
            {ok, _} = ibrowse:start();
        _ ->
            ok
    end,
    case ibrowse:send_req(Url, Headers, Method, Body, Opts) of
        {ok, Code0, RespHeaders, RespBody0} ->
            Code = list_to_integer(Code0),
            RespBody = iolist_to_binary(RespBody0),
            {ok, Code, RespHeaders, RespBody};
        {error, {'EXIT', {normal, _}}} ->
            % Connection closed right after a successful request that
            % used the same connection.
            request(Method, Url, Headers, Body, N - 1);
        Error ->
            Error
    end.
