From 0cbdd2fc95e58b197909e313748d0870c05a8da7 Mon Sep 17 00:00:00 2001 From: Seudin Kasumovic Date: Fri, 4 May 2018 21:10:44 +0200 Subject: Allow IP tuple for host #152 --- doc/src/manual/gun.asciidoc | 2 +- src/gun.erl | 6 +++--- src/gun_http.erl | 12 ++++++++++-- src/gun_http2.erl | 6 +++++- 4 files changed, 19 insertions(+), 7 deletions(-) diff --git a/doc/src/manual/gun.asciidoc b/doc/src/manual/gun.asciidoc index 0c6dd08..98fbabe 100644 --- a/doc/src/manual/gun.asciidoc +++ b/doc/src/manual/gun.asciidoc @@ -235,7 +235,7 @@ Alias of `gun:open/3`. === open(Host, Port, Opts) -> {ok, ConnPid} | {error, Reason} -Host = inet:hostname():: Host to connect to. +Host = inet:hostname() | inet:ipaddress():: Host or IP to connect to. Port = inet:port_number():: Port to connect to. Opts = opts():: Options for this connection. ConnPid = pid():: The pid of the Gun connection process. diff --git a/src/gun.erl b/src/gun.erl index f628199..a4ef417 100644 --- a/src/gun.erl +++ b/src/gun.erl @@ -125,14 +125,14 @@ %% Connection. --spec open(inet:hostname(), inet:port_number()) +-spec open(inet:hostname() | inet:ipaddress(), inet:port_number()) -> {ok, pid()} | {error, any()}. open(Host, Port) -> open(Host, Port, #{}). --spec open(inet:hostname(), inet:port_number(), opts()) +-spec open(inet:hostname() | inet:ipaddress(), inet:port_number(), opts()) -> {ok, pid()} | {error, any()}. -open(Host, Port, Opts) when is_list(Host); is_atom(Host) -> +open(Host, Port, Opts) when is_list(Host); is_atom(Host); is_tuple(Host) -> do_open(Host, Port, Opts). -spec open_unix(Path::string(), opts()) diff --git a/src/gun_http.erl b/src/gun_http.erl index 6546df9..d6b3f0d 100644 --- a/src/gun_http.erl +++ b/src/gun_http.erl @@ -280,9 +280,13 @@ keepalive(State) -> request(State=#http_state{socket=Socket, transport=Transport, version=Version, out=head}, StreamRef, ReplyTo, Method, Host, Port, Path, Headers) -> + Host2 = case Host of + Tuple when is_tuple(Tuple) -> inet:ntoa(Tuple); + _ -> Host + end, Headers2 = lists:keydelete(<<"transfer-encoding">>, 1, Headers), Headers3 = case lists:keymember(<<"host">>, 1, Headers) of - false -> [{<<"host">>, [Host, $:, integer_to_binary(Port)]}|Headers2]; + false -> [{<<"host">>, [Host2, $:, integer_to_binary(Port)]}|Headers2]; true -> Headers2 end, %% We use Headers2 because this is the smallest list. @@ -299,10 +303,14 @@ request(State=#http_state{socket=Socket, transport=Transport, version=Version, request(State=#http_state{socket=Socket, transport=Transport, version=Version, out=head}, StreamRef, ReplyTo, Method, Host, Port, Path, Headers, Body) -> + Host2 = case Host of + Tuple when is_tuple(Tuple) -> inet:ntoa(Tuple); + _ -> Host + end, Headers2 = lists:keydelete(<<"content-length">>, 1, lists:keydelete(<<"transfer-encoding">>, 1, Headers)), Headers3 = case lists:keymember(<<"host">>, 1, Headers) of - false -> [{<<"host">>, [Host, $:, integer_to_binary(Port)]}|Headers2]; + false -> [{<<"host">>, [Host2, $:, integer_to_binary(Port)]}|Headers2]; true -> Headers2 end, Headers4 = transform_header_names(State, Headers3), diff --git a/src/gun_http2.erl b/src/gun_http2.erl index 28b64eb..c48e07e 100644 --- a/src/gun_http2.erl +++ b/src/gun_http2.erl @@ -351,9 +351,13 @@ request(State0=#http2_state{socket=Socket, transport=Transport, encode_state=Enc State#http2_state{streams=[Stream|Streams], stream_id=StreamID + 2, encode_state=EncodeState}. prepare_headers(EncodeState, Transport, Method, Host0, Port, Path, Headers0) -> + Host2 = case Host0 of + Tuple when is_tuple(Tuple) -> inet:ntoa(Tuple); + _ -> Host0 + end, Authority = case lists:keyfind(<<"host">>, 1, Headers0) of {_, Host} -> Host; - _ -> [Host0, $:, integer_to_binary(Port)] + _ -> [Host2, $:, integer_to_binary(Port)] end, %% @todo We also must remove any header found in the connection header. Headers1 = -- cgit v1.2.3