Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

43 wiersze
1.7 KiB

  1. %% Vendored from hex_core v0.5.0, do not edit manually
  2. -module(r3_hex_http).
  3. -export([request/5]).
  4. -ifdef(TEST).
  5. -export([user_agent/1]).
  6. -endif.
  7. -include_lib("r3_hex_core.hrl").
  8. -type method() :: get | post | put | patch | delete.
  9. -type status() :: non_neg_integer().
  10. -type headers() :: #{binary() => binary()}.
  11. -type body() :: {ContentType :: binary(), Body :: binary()} | undefined.
  12. -type adapter_config() :: map().
  13. -callback request(method(), URI :: binary(), headers(), body(), adapter_config()) ->
  14. {ok, status(), headers(), binary()} |
  15. {error, term()}.
  16. -spec request(r3_hex_core:config(), method(), URI :: binary(), headers(), body()) ->
  17. {ok, {status(), headers(), binary()}} | {error, term()}.
  18. request(Config, Method, URI, Headers, Body) when is_binary(URI) and is_map(Headers) ->
  19. Adapter = maps:get(http_adapter, Config),
  20. UserAgentFragment = maps:get(http_user_agent_fragment, Config),
  21. Headers2 = put_new(<<"user-agent">>, user_agent(UserAgentFragment), Headers),
  22. AdapterConfig = maps:get(http_adapter_config, Config, #{}),
  23. Adapter:request(Method, URI, Headers2, Body, AdapterConfig).
  24. user_agent(UserAgentFragment) ->
  25. OTPRelease = erlang:system_info(otp_release),
  26. ERTSVersion = erlang:system_info(version),
  27. OTPString = " (OTP/" ++ OTPRelease ++ ") (erts/" ++ ERTSVersion ++ ")",
  28. iolist_to_binary(["hex_core/", ?HEX_CORE_VERSION, " ", UserAgentFragment, OTPString]).
  29. %%====================================================================
  30. %% Internal functions
  31. %%====================================================================
  32. put_new(Key, Value, Map) ->
  33. case maps:find(Key, Map) of
  34. {ok, _} -> Map;
  35. error -> maps:put(Key, Value, Map)
  36. end.