Index: lib/inets/src/http_lib/http_transport.erl =================================================================== --- lib/inets/src/http_lib/http_transport.erl (revision 36) +++ lib/inets/src/http_lib/http_transport.erl (revision 37) @@ -18,8 +18,8 @@ -module(http_transport). % Internal application API --export([start/1, connect/3, listen/2, listen/3, accept/2, accept/3, close/2, - send/3, controlling_process/3, setopts/3, +-export([start/1, connect/3, connect/4, listen/2, listen/3, accept/2, accept/3, + close/2, send/3, controlling_process/3, setopts/3, peername/2, resolve/0]). %%%========================================================================= @@ -63,7 +63,10 @@ %% Description: Connects to the Host and Port specified in HTTPRequest. %% uses ipv6 if possible. %%------------------------------------------------------------------------- -connect(ip_comm, {Host, Port}, enabled) -> +connect(SocketType, Address, IPV6) -> + connect(SocketType, Address, IPV6, infinity). + +connect(ip_comm, {Host, Port}, enabled, Timeout) -> {Opts, NewHost} = case inet:getaddr(Host, inet6) of {ok, IPAddr = {0, 0, 0, 0, 0, 16#ffff, _, _}} -> @@ -82,15 +85,15 @@ {[binary, {packet, 0}, {active, false}, {reuseaddr,true}], Host} end, - gen_tcp:connect(NewHost, Port, Opts); + gen_tcp:connect(NewHost, Port, Opts, Timeout); -connect(ip_comm, {Host, Port}, disabled) -> +connect(ip_comm, {Host, Port}, disabled, Timeout) -> Opts = [binary, {packet, 0}, {active, false}, {reuseaddr,true}], - gen_tcp:connect(Host, Port, Opts); + gen_tcp:connect(Host, Port, Opts, Timeout); -connect({ssl, SslConfig}, {Host, Port}, _) -> +connect({ssl, SslConfig}, {Host, Port}, _, Timeout) -> Opts = [binary, {active, false}] ++ SslConfig, - ssl:connect(Host, Port, Opts). + ssl:connect(Host, Port, Opts, Timeout). %%------------------------------------------------------------------------- %% listen(SocketType, Port) -> {ok, Socket} | {error, Reason} Index: lib/inets/src/http_client/http.erl =================================================================== --- lib/inets/src/http_client/http.erl (revision 36) +++ lib/inets/src/http_client/http.erl (revision 37) @@ -44,7 +44,8 @@ %% Request - {Url, Headers} | {Url, Headers, ContentType, Body} %% Url - string() %% HTTPOptions - [HttpOption] -%% HTTPOption - {timeout, Time} | {ssl, SSLOptions} | +%% HTTPOption - {timeout, Time} | {connect_timeout, Time} | +%% {ssl, SSLOptions} | %% {proxy_auth, {User, Password}} %% Ssloptions = [SSLOption] %% SSLOption = {verify, code()} | {depth, depth()} | {certfile, path()} | @@ -225,6 +226,11 @@ http_options(Settings, Acc#http_options{timeout = Val}); http_options([{timeout, infinity} | Settings], Acc) -> http_options(Settings, Acc#http_options{timeout = infinity}); +http_options([{connect_timeout, Val} | Settings], Acc) + when is_integer(Val), Val >= 0-> + http_options(Settings, Acc#http_options{connect_timeout = Val}); +http_options([{connect_timeout, infinity} | Settings], Acc) -> + http_options(Settings, Acc#http_options{connect_timeout = infinity}); http_options([{autoredirect, Val} | Settings], Acc) when Val == true; Val == false -> http_options(Settings, Acc#http_options{autoredirect = Val}); Index: lib/inets/src/http_client/httpc_handler.erl =================================================================== --- lib/inets/src/http_client/httpc_handler.erl (revision 36) +++ lib/inets/src/http_client/httpc_handler.erl (revision 37) @@ -395,8 +395,9 @@ %%-------------------------------------------------------------------- send_first_request(Address, Request, State) -> Ipv6 = (State#state.options)#options.ipv6, + Timeout = (Request#request.settings)#http_options.connect_timeout, SocketType = socket_type(Request), - case http_transport:connect(SocketType, Address, Ipv6) of + case http_transport:connect(SocketType, Address, Ipv6, Timeout) of {ok, Socket} -> http_util:verbose_output((State#state.options)#options.verbose, Request,"Sending: "), Index: lib/inets/src/http_client/httpc_internal.hrl =================================================================== --- lib/inets/src/http_client/httpc_internal.hrl (revision 36) +++ lib/inets/src/http_client/httpc_internal.hrl (revision 37) @@ -17,6 +17,7 @@ %% -define(HTTP_REQUEST_TIMEOUT, infinity). +-define(HTTP_CONNECT_TIMEOUT, infinity). -define(HTTP_PIPELINE_TIMEOUT, 0). -define(HTTP_PIPELINE_LENGTH, 2). -define(HTTP_MAX_TCP_SESSIONS, 2). @@ -26,6 +27,7 @@ -record(http_options,{ %% Milliseconds before a request times out timeout = ?HTTP_REQUEST_TIMEOUT, + connect_timeout = ?HTTP_CONNECT_TIMEOUT, %% bool() - True if automatic redirection on 30X responses. autoredirect = true, ssl = [], % Ssl socket options