From 01d9ef20f62bac0320ac7dc83192c29889720fa2 Mon Sep 17 00:00:00 2001 From: Filipe David Borba Manana Date: Wed, 13 Apr 2011 11:05:30 +0000 Subject: Merged revision 1091709 from trunk Add support for replication over IPv6 (part 1) This change upgrades ibrowse to version 2.2.0. This version adds support for IPv6 (https://github.com/cmullaparthi/ibrowse/pull/34). This is part of COUCHDB-665. git-svn-id: https://svn.apache.org/repos/asf/couchdb/branches/1.1.x@1091741 13f79535-47bb-0310-9956-ffa450edef68 --- src/ibrowse/ibrowse_http_client.erl | 37 ++++++++++++++++++++++++++++++++----- 1 file changed, 32 insertions(+), 5 deletions(-) (limited to 'src/ibrowse/ibrowse_http_client.erl') diff --git a/src/ibrowse/ibrowse_http_client.erl b/src/ibrowse/ibrowse_http_client.erl index 7d606e61..eb2bf315 100644 --- a/src/ibrowse/ibrowse_http_client.erl +++ b/src/ibrowse/ibrowse_http_client.erl @@ -35,6 +35,7 @@ ]). -include("ibrowse.hrl"). +-include_lib("kernel/include/inet.hrl"). -record(state, {host, port, connect_timeout, inactivity_timer_ref, @@ -489,13 +490,19 @@ do_connect(Host, Port, Options, #state{is_ssl = true, use_proxy = false, ssl_options = SSLOptions}, Timeout) -> - ssl:connect(Host, Port, get_sock_options(Options, SSLOptions), Timeout); + ssl:connect(Host, Port, get_sock_options(Host, Options, SSLOptions), Timeout); do_connect(Host, Port, Options, _State, Timeout) -> - gen_tcp:connect(Host, Port, get_sock_options(Options, []), Timeout). + gen_tcp:connect(Host, Port, get_sock_options(Host, Options, []), Timeout). -get_sock_options(Options, SSLOptions) -> +get_sock_options(Host, Options, SSLOptions) -> Caller_socket_options = get_value(socket_options, Options, []), - Other_sock_options = filter_sock_options(SSLOptions ++ Caller_socket_options), + Ipv6Options = case is_ipv6_host(Host) of + true -> + [inet6]; + false -> + [] + end, + Other_sock_options = filter_sock_options(SSLOptions ++ Caller_socket_options ++ Ipv6Options), case lists:keysearch(nodelay, 1, Other_sock_options) of false -> [{nodelay, true}, binary, {active, false} | Other_sock_options]; @@ -503,6 +510,21 @@ get_sock_options(Options, SSLOptions) -> [binary, {active, false} | Other_sock_options] end. +is_ipv6_host(Host) -> + case inet_parse:address(Host) of + {ok, {_, _, _, _, _, _, _, _}} -> + true; + {ok, {_, _, _, _}} -> + false; + _ -> + case inet:gethostbyname(Host) of + {ok, #hostent{h_addrtype = inet6}} -> + true; + _ -> + false + end + end. + %% We don't want the caller to specify certain options filter_sock_options(Opts) -> lists:filter(fun({active, _}) -> @@ -1278,7 +1300,12 @@ handle_response(#request{from=From, stream_to=StreamTo, req_id=ReqId, reply_buffer = RepBuf, recvd_headers = RespHeaders}=State) when SaveResponseToFile /= false -> Body = RepBuf, - ok = file:close(Fd), + case Fd of + undefined -> + ok; + _ -> + ok = file:close(Fd) + end, ResponseBody = case TmpFilename of undefined -> Body; -- cgit v1.2.3