summaryrefslogtreecommitdiff
path: root/src/http_util.erl
blob: 53dd2bbee27ca03855c5eeddb9d1d246c65806dd (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
%%% Copyright (c) 2014, NORDUnet A/S.
%%% See LICENSE for licensing information.
%%%

-module(http_util).
-export([request/4]).
-include_lib("hackney/include/hackney_lib.hrl").

get_auth_header(Headers) ->
    case hackney_headers:get_value("X-Catlfish-Auth", Headers) of
        undefined ->
            undefined;
        Result when is_binary(Result) ->
            lager:debug("received auth header: ~p", [Result]),
            binary_to_list(Result)
    end.

add_auth(Method, Path, Headers, Data) ->
    AuthHeader = http_auth:create_auth(Method, Path, Data),
    lager:debug("sent auth header: ~p", [AuthHeader]),
    [{"X-Catlfish-Auth", AuthHeader} | Headers].

request(DebugTag, URL, Headers, RequestBody) ->
    Starttime = os:timestamp(),
    ParsedURL = hackney_url:parse_url(URL),
    CACertFile = application:get_env(catlfish, https_cacertfile, none),
    #hackney_url{path = Path} = ParsedURL,
    lager:debug("~s: sending http request to ~p",
                [DebugTag, URL]),
    {ok, ConnRef} = hackney:connect(ParsedURL, [{ssl_options, [{cacertfile, CACertFile}]}]),
    lager:debug("~s: connected to ~p",
                [DebugTag, URL]),
    {ok, StatusCode, RespHeaders, ClientRef} =
        hackney:send_request(ConnRef,
                             {post, Path,
                              add_auth("POST", Path, Headers,
                                       RequestBody),
                              RequestBody}),
    lager:debug("~s: received headers for ~p: ~p",
                [DebugTag, URL, RespHeaders]),
    {ok, Body} = hackney:body(ClientRef),
    Stoptime = os:timestamp(),
    hackney:close(ClientRef),
    lager:debug("~s: received body for ~p: time ~p",
                [DebugTag, URL, timer:now_diff(Stoptime, Starttime)]),
    StatusLine = {none, StatusCode, none},
    AuthHeader = get_auth_header(hackney_headers:new(RespHeaders)),
    {http_auth:verify_auth(AuthHeader, "REPLY",
                           binary_to_list(Path), Body),
     StatusLine, RespHeaders, Body}.