diff options
Diffstat (limited to 'lib/inets/src/http_lib/http_transport.erl')
-rw-r--r-- | lib/inets/src/http_lib/http_transport.erl | 235 |
1 files changed, 30 insertions, 205 deletions
diff --git a/lib/inets/src/http_lib/http_transport.erl b/lib/inets/src/http_lib/http_transport.erl index 0eb0cc2684..2a51529621 100644 --- a/lib/inets/src/http_lib/http_transport.erl +++ b/lib/inets/src/http_lib/http_transport.erl @@ -36,29 +36,19 @@ resolve/0 ]). -export([negotiate/3]). --export([ipv4_name/1, ipv6_name/1]). -include_lib("inets/src/inets_app/inets_internal.hrl"). -include("http_internal.hrl"). - %%%========================================================================= %%% Internal application API %%%========================================================================= -%%------------------------------------------------------------------------- -%% start(SocketType) -> ok | {error, Reason} -%% SocketType = ip_comm | {ssl, _} -%% -%% Description: Makes sure ssl is started. -%%------------------------------------------------------------------------- start(ip_comm) -> ok; start({ip_comm, _}) -> ok; start({ssl, _}) -> - do_start_ssl(); -start({essl, _}) -> do_start_ssl(). do_start_ssl() -> @@ -70,25 +60,11 @@ do_start_ssl() -> _:Reason -> {error, Reason} end. - - -%%------------------------------------------------------------------------- -%% connect(SocketType, Address, Options, Timeout) -> -%% {ok, Socket} | {error, Reason} -%% SocketType = ip_comm | {ssl, SslConfig} -%% Address = {Host, Port} -%% Options = [option()] -%% Socket = socket() -%% option() = ipfamily() | {ip, ip_address()} | {port, integer()} -%% ipfamily() = inet | inet6 -%% -%% Description: Connects to the Host and Port specified in HTTPRequest. -%%------------------------------------------------------------------------- connect(SocketType, Address, Opts) -> connect(SocketType, Address, Opts, infinity). connect(ip_comm, {Host, Port}, Opts0, Timeout) -> - Opts = [binary, {packet, 0}, {active, false}, {reuseaddr, true} | Opts0 ], + Opts = [binary, {packet, 0}, {active, false} | Opts0], try gen_tcp:connect(Host, Port, Opts, Timeout) of {ok, _} = OK -> OK; @@ -101,12 +77,8 @@ connect(ip_comm, {Host, Port}, Opts0, Timeout) -> {error, {eoptions, Opts}} end; -%% Wrapper for backaward compatibillity -connect({ssl, SslConfig}, Address, Opts, Timeout) -> - connect({?HTTP_DEFAULT_SSL_KIND, SslConfig}, Address, Opts, Timeout); - -connect({essl, SslConfig}, {Host, Port}, Opts0, Timeout) -> - Opts = [binary, {active, false}, {ssl_imp, new} | Opts0] ++ SslConfig, +connect({ssl, SslConfig}, {Host, Port}, Opts0, Timeout) -> + Opts = [binary, {packet, 0}, {active, false} | Opts0] ++ SslConfig, case (catch ssl:connect(Host, Port, Opts, Timeout)) of {'EXIT', Reason} -> {error, {eoptions, Reason}}; @@ -116,38 +88,19 @@ connect({essl, SslConfig}, {Host, Port}, Opts0, Timeout) -> ERROR end. - -%%------------------------------------------------------------------------- -%% listen(SocketType, Addr, Port, Fd) -> {ok, Socket} | {error, Reason} -%% SocketType = ip_comm | {ssl, SSLConfig} -%% Port = integer() -%% Socket = socket() -%% Fd = undefined | fd() -%% -%% Description: Sets up socket to listen on the port Port on the local -%% host using either gen_tcp or ssl. In the gen_tcp case the port -%% might already have been initiated by a wrapper-program and is -%% given as an Fd that can be retrieved by init:get_argument. The -%% reason for this to enable a HTTP-server not running as root to use -%% port 80. -%%------------------------------------------------------------------------- listen(ip_comm, Addr, Port, Fd, IpFamily) -> listen_ip_comm(Addr, Port, [], Fd, IpFamily); listen({ip_comm, SockOpts}, Addr, Port, Fd, IpFamily) -> listen_ip_comm(Addr, Port, SockOpts, Fd, IpFamily); -listen({essl, SSLConfig}, Addr, Port, Fd, IpFamily) -> +listen({ssl, SSLConfig}, Addr, Port, Fd, IpFamily) -> listen_ssl(Addr, Port, Fd, SSLConfig, IpFamily, []). listen(ip_comm, Addr, Port, IpFamily) -> listen_ip_comm(Addr, Port, [], undefined, IpFamily); -%% Wrapper for backaward compatibillity listen({ssl, SSLConfig}, Addr, Port, IpFamily) -> - listen({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Addr, Port, IpFamily); - -listen({essl, SSLConfig}, Addr, Port, IpFamily) -> {SSLConfig2, ExtraOpts} = case proplists:get_value(log_alert, SSLConfig, undefined) of undefined -> {SSLConfig, []}; @@ -187,18 +140,7 @@ get_socket_info(Addr, Port, Fd, BaseOpts) -> Fd -> {0, sock_opts([{fd, Fd} | BaseOpts])} end. - -%%------------------------------------------------------------------------- -%% accept(SocketType, ListenSocket) -> {ok, Socket} | {error, Reason} -%% accept(SocketType, ListenSocket, Timeout) -> ok | {error, Reason} -%% SocketType = ip_comm | {ssl, SSLConfig} -%% ListenSocket = socket() -%% Timeout = infinity | integer() >= 0 -%% Socket = socket() -%% -%% Description: Accepts an incoming connection request on a listen socket, -%% using either gen_tcp or ssl. -%%------------------------------------------------------------------------- + -spec accept(SocketType, ListenSocket) -> {ok, Socket} | {error, Reason} when SocketType :: ip_comm | {ssl, SSLConfig}, SSLConfig :: term(), @@ -209,7 +151,7 @@ accept(SocketType, ListenSocket) -> accept(SocketType, ListenSocket, infinity). -spec accept(SocketType, ListenSocket, Timeout) -> {ok, Socket} | {error, Reason} when - SocketType :: ip_comm | {ssl | essl, SSLConfig}, + SocketType :: ip_comm | {ssl, SSLConfig}, SSLConfig :: term(), Timeout :: timeout(), ListenSocket :: gen_tcp:socket(), @@ -220,19 +162,14 @@ accept(ip_comm, ListenSocket, Timeout) -> accept({ip_comm, _}, ListenSocket, Timeout) -> gen_tcp:accept(ListenSocket, Timeout); -%% Wrapper for backaward compatibillity -accept({ssl, SSLConfig}, ListenSocket, Timeout) -> - accept({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, ListenSocket, Timeout); - -accept({essl, _SSLConfig}, ListenSocket, Timeout) -> +accept({ssl, _SSLConfig}, ListenSocket, Timeout) -> ssl:transport_accept(ListenSocket, Timeout). - %%------------------------------------------------------------------------- %% Description: Assigns a new controlling process to Socket. %%------------------------------------------------------------------------- -spec controlling_process(SocketType, Socket, NewOwner) -> Object when - SocketType :: ip_comm | {ip_comm | ssl | essl, _SSLConfig}, + SocketType :: ip_comm | {ip_comm | ssl, _Config}, Socket :: gen_tcp:socket(), NewOwner :: pid(), Object :: ok | {error, Reason}, @@ -242,11 +179,7 @@ controlling_process(ip_comm, Socket, NewOwner) -> controlling_process({ip_comm, _}, Socket, NewOwner) -> gen_tcp:controlling_process(Socket, NewOwner); -%% Wrapper for backaward compatibillity -controlling_process({ssl, SSLConfig}, Socket, NewOwner) -> - controlling_process({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket, NewOwner); - -controlling_process({essl, _}, Socket, NewOwner) -> +controlling_process({ssl, _}, Socket, NewOwner) -> ssl:controlling_process(Socket, NewOwner). @@ -255,7 +188,7 @@ controlling_process({essl, _}, Socket, NewOwner) -> %% gen_tcp or ssl. %%------------------------------------------------------------------------- -spec setopts(SocketType, Socket, Options) -> ok | {error, inet:posix()} when - SocketType :: ip_comm | {ip_comm | ssl | essl, _SSLConfig}, + SocketType :: ip_comm | {ip_comm | ssl, _Config}, Socket :: inet:socket() | ssl:sslsocket(), Options :: [inet:socket_setopt()] | [gen_tcp:option()]. setopts(ip_comm, Socket, Options) -> @@ -263,11 +196,7 @@ setopts(ip_comm, Socket, Options) -> setopts({ip_comm, _}, Socket, Options) -> inet:setopts(Socket, Options); -%% Wrapper for backaward compatibillity -setopts({ssl, SSLConfig}, Socket, Options) -> - setopts({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket, Options); - -setopts({essl, _}, Socket, Options) -> +setopts({ssl, _}, Socket, Options) -> (catch ssl:setopts(Socket, Options)). @@ -275,7 +204,7 @@ setopts({essl, _}, Socket, Options) -> %% Description: Gets the values for some options. %%------------------------------------------------------------------------- -spec getopts(SocketType, Socket) -> Object when - SocketType :: ip_comm | {ip_comm | ssl | essl, _SSLConfig}, + SocketType :: ip_comm | {ip_comm | ssl, _Conf}, Socket :: ssl:sslsocket() | inet:socket(), Object :: [gen_tcp:option()] | [inet:socket_setopt() | gen_tcp:pktoptions_value()] | []. getopts(SocketType, Socket) -> @@ -283,13 +212,10 @@ getopts(SocketType, Socket) -> getopts(SocketType, Socket, Opts). -spec getopts(SocketType, Socket, Options) -> Object when - SocketType :: ip_comm | {ip_comm | ssl | essl, _SSLConfig}, + SocketType :: ip_comm | {ip_comm | ssl, _Conf}, Socket :: ssl:sslsocket() | inet:socket(), Options :: [gen_tcp:option_name()], Object :: [gen_tcp:option()] | [inet:socket_setopt() | gen_tcp:pktoptions_value()] | []. -getopts({ip_comm, _}, Socket, Options) -> - getopts(ip_comm, Socket, Options); - getopts(ip_comm, Socket, Options) -> case inet:getopts(Socket, Options) of {ok, SocketOpts} -> @@ -297,12 +223,9 @@ getopts(ip_comm, Socket, Options) -> {error, _} -> [] end; - -%% Wrapper for backaward compatibillity -getopts({ssl, SSLConfig}, Socket, Options) -> - getopts({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket, Options); - -getopts({essl, _}, Socket, Options) -> +getopts({ip_comm, _}, Socket, Options) -> + getopts(ip_comm, Socket, Options); +getopts({ssl, _}, Socket, Options) -> getopts_ssl(Socket, Options). -spec getopts_ssl(SslSocket, Options) -> @@ -316,15 +239,7 @@ getopts_ssl(Socket, Options) -> {error, _} -> [] end. - -%%------------------------------------------------------------------------- -%% getstat(SocketType, Socket) -> socket_stats() -%% SocketType = ip_comm | {ssl, _} -%% Socket = socket() -%% socket_stats() = list() -%% Description: Gets the socket stats values for the socket -%%------------------------------------------------------------------------- getstat(ip_comm = _SocketType, Socket) -> case inet:getstat(Socket) of {ok, Stats} -> @@ -333,155 +248,67 @@ getstat(ip_comm = _SocketType, Socket) -> [] end; -%% Wrapper for backaward compatibillity -getstat({ssl, SSLConfig}, Socket) -> - getstat({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket); - -getstat({essl, _} = _SocketType, _Socket) -> +getstat({ssl, _} = _SocketType, _Socket) -> []. -%%------------------------------------------------------------------------- -%% send(RequestOrSocketType, Socket, Message) -> ok | {error, Reason} -%% SocketType = ip_comm | {ssl, _} -%% Socket = socket() -%% Message = list() | binary() -%% Description: Sends a packet on a socket, using either gen_tcp or ssl. -%%------------------------------------------------------------------------- send(ip_comm, Socket, Message) -> gen_tcp:send(Socket, Message); send({ip_comm, _}, Socket, Message) -> gen_tcp:send(Socket, Message); -%% Wrapper for backaward compatibillity -send({ssl, SSLConfig}, Socket, Message) -> - send({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket, Message); - -send({essl, _}, Socket, Message) -> +send({ssl, _}, Socket, Message) -> ssl:send(Socket, Message). -%%------------------------------------------------------------------------- -%% close(SocketType, Socket) -> ok | {error, Reason} -%% SocketType = ip_comm | {ssl, _} -%% Socket = socket() -%% -%% Description: Closes a socket, using either gen_tcp or ssl. -%%------------------------------------------------------------------------- close(ip_comm, Socket) -> gen_tcp:close(Socket); close({ip_comm, []}, Socket) -> gen_tcp:close(Socket); - -%% Wrapper for backaward compatibillity -close({ssl, SSLConfig}, Socket) -> - close({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket); - -close({essl, _}, Socket) -> +close({ssl, _}, Socket) -> ssl:close(Socket). - -%%------------------------------------------------------------------------- -%% peername(SocketType, Socket) -> {Port, SockName} -%% SocketType = ip_comm | {ssl, _} -%% Socket = socket() -%% Port = integer() (-1 if error occurred) -%% PeerName = string() -%% -%% Description: Returns the address and port for the other end of a -%% connection, usning either gen_tcp or ssl. -%%------------------------------------------------------------------------- peername(ip_comm, Socket) -> do_peername(inet:peername(Socket)); -peername({ip_comm, _}, Socket) -> +peername({ip_comm,_}, Socket) -> do_peername(inet:peername(Socket)); - -%% Wrapper for backaward compatibillity -peername({ssl, SSLConfig}, Socket) -> - peername({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket); - -peername({essl, _}, Socket) -> +peername({ssl, _}, Socket) -> do_peername(ssl:peername(Socket)). do_peername({ok, {Addr, Port}}) when tuple_size(Addr) =:= 4 -> - PeerName = ipv4_name(Addr), + PeerName = ip_name(Addr), {Port, PeerName}; do_peername({ok, {Addr, Port}}) when tuple_size(Addr) =:= 8 -> - PeerName = ipv6_name(Addr), + PeerName = ip_name(Addr), {Port, PeerName}; do_peername({error, _}) -> {-1, "unknown"}. - -%%------------------------------------------------------------------------- -%% sockname(SocketType, Socket) -> {Port, SockName} -%% SocketType = ip_comm | {ssl, _} -%% Socket = socket() -%% Port = integer() (-1 if error occurred) -%% SockName = string() -%% -%% Description: Returns the address and port for the local (our) end -%% other end of connection, using either gen_tcp or ssl. -%%------------------------------------------------------------------------- sockname(ip_comm, Socket) -> do_sockname(inet:sockname(Socket)); -sockname({ip_comm, _}, Socket) -> +sockname({ip_comm,_}, Socket) -> do_sockname(inet:sockname(Socket)); -%% Wrapper for backaward compatibillity -sockname({ssl, SSLConfig}, Socket) -> - sockname({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket); - -sockname({essl, _}, Socket) -> +sockname({ssl, _}, Socket) -> do_sockname(ssl:sockname(Socket)). do_sockname({ok, {Addr, Port}}) when tuple_size(Addr) =:= 4 -> - SockName = ipv4_name(Addr), + SockName = ip_name(Addr), {Port, SockName}; do_sockname({ok, {Addr, Port}}) when tuple_size(Addr) =:= 8 -> - SockName = ipv6_name(Addr), + SockName = ip_name(Addr), {Port, SockName}; do_sockname({error, _}) -> {-1, "unknown"}. - -%%------------------------------------------------------------------------- -%% resolve() -> HostName -%% HostName = string() -%% -%% Description: Returns the local hostname. -%%------------------------------------------------------------------------- resolve() -> {ok, Name} = inet:gethostname(), Name. - -%%------------------------------------------------------------------------- -%% ipv4_name(Ipv4Addr) -> string() -%% ipv6_name(Ipv6Addr) -> string() -%% Ipv4Addr = ip4_address() -%% Ipv6Addr = ip6_address() -%% -%% Description: Returns the local hostname. -%%------------------------------------------------------------------------- -ipv4_name({A, B, C, D}) -> - integer_to_list(A) ++ "." ++ - integer_to_list(B) ++ "." ++ - integer_to_list(C) ++ "." ++ - integer_to_list(D). - -ipv6_name({A, B, C, D, E, F, G, H}) -> - http_util:integer_to_hexlist(A) ++ ":"++ - http_util:integer_to_hexlist(B) ++ ":" ++ - http_util:integer_to_hexlist(C) ++ ":" ++ - http_util:integer_to_hexlist(D) ++ ":" ++ - http_util:integer_to_hexlist(E) ++ ":" ++ - http_util:integer_to_hexlist(F) ++ ":" ++ - http_util:integer_to_hexlist(G) ++ ":" ++ - http_util:integer_to_hexlist(H). - +ip_name(Ip) -> + inet:ntoa(Ip). close_tag(ip_comm) -> tcp_closed; @@ -510,9 +337,7 @@ negotiate(ip_comm,_,_) -> ok; negotiate({ip_comm, _},_,_) -> ok; -negotiate({ssl, SSLConfig}, Socket, Timeout) -> - negotiate({?HTTP_DEFAULT_SSL_KIND, SSLConfig}, Socket, Timeout); -negotiate({essl, _}, Socket, Timeout) -> +negotiate({ssl, _}, Socket, Timeout) -> negotiate_ssl(Socket, Timeout). negotiate_ssl(Socket, Timeout) -> |