11% % @doc
22% % HTTP contract.
33-module (hex_http ).
4- -export ([request /5 ]).
4+ -export ([request /5 , request_to_file / 6 ]).
55-ifdef (TEST ).
66-export ([user_agent /1 ]).
77-endif .
2121 {ok , {status (), headers (), binary ()}}
2222 | {error , term ()}.
2323
24+ -callback request_to_file (
25+ method (), URI :: binary (), headers (), body (), file :name_all (), adapter_config ()
26+ ) ->
27+ {ok , {status (), headers ()}} | {error , term ()}.
28+
2429-spec request (hex_core :config (), method (), URI :: binary (), headers (), body ()) ->
2530 {ok , {status (), headers (), binary ()}} | {error , term ()}.
2631request (Config , Method , URI , Headers , Body ) when is_binary (URI ) and is_map (Headers ) ->
27- {Adapter , AdapterConfig } =
28- case maps :get (http_adapter , Config , {hex_http_httpc , #{}}) of
29- {Adapter0 , AdapterConfig0 } ->
30- {Adapter0 , AdapterConfig0 };
31- % % TODO: remove in v0.9
32- Adapter0 when is_atom (Adapter0 ) ->
33- AdapterConfig0 = maps :get (http_adapter_config , Config , #{}),
34- io :format (
35- " [hex_http] setting #{http_adapter => Module, http_adapter_config => Map} "
36- " is deprecated in favour of #{http_adapter => {Module, Map}}~n "
37- ),
38- {Adapter0 , AdapterConfig0 }
39- end ,
32+ {Adapter , AdapterConfig } = adapter (Config ),
4033 UserAgentFragment = maps :get (http_user_agent_fragment , Config ),
4134 Headers2 = put_new (<<" user-agent" >>, user_agent (UserAgentFragment ), Headers ),
4235 Adapter :request (Method , URI , Headers2 , Body , AdapterConfig ).
4336
37+ -spec request_to_file (
38+ hex_core :config (), method (), URI :: binary (), headers (), body (), file :name_all ()
39+ ) ->
40+ {ok , {status (), headers ()}} | {error , term ()}.
41+ request_to_file (Config , Method , URI , Headers , Body , Filename ) when
42+ is_binary (URI ) and is_map (Headers )
43+ ->
44+ {Adapter , AdapterConfig } = adapter (Config ),
45+ UserAgentFragment = maps :get (http_user_agent_fragment , Config ),
46+ Headers2 = put_new (<<" user-agent" >>, user_agent (UserAgentFragment ), Headers ),
47+ Adapter :request_to_file (Method , URI , Headers2 , Body , Filename , AdapterConfig ).
48+
4449% % @private
4550user_agent (UserAgentFragment ) ->
4651 OTPRelease = erlang :system_info (otp_release ),
@@ -52,6 +57,21 @@ user_agent(UserAgentFragment) ->
5257% % Internal functions
5358% %====================================================================
5459
60+ % % @private
61+ adapter (Config ) ->
62+ case maps :get (http_adapter , Config , {hex_http_httpc , #{}}) of
63+ {Adapter , AdapterConfig } ->
64+ {Adapter , AdapterConfig };
65+ % % TODO: remove in v0.9
66+ Adapter when is_atom (Adapter ) ->
67+ AdapterConfig = maps :get (http_adapter_config , Config , #{}),
68+ io :format (
69+ " [hex_http] setting #{http_adapter => Module, http_adapter_config => Map} "
70+ " is deprecated in favour of #{http_adapter => {Module, Map}}~n "
71+ ),
72+ {Adapter , AdapterConfig }
73+ end .
74+
5575% % @private
5676put_new (Key , Value , Map ) ->
5777 case maps :find (Key , Map ) of
0 commit comments