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_lib.erl | 51 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 50 insertions(+), 1 deletion(-) (limited to 'src/ibrowse/ibrowse_lib.erl') diff --git a/src/ibrowse/ibrowse_lib.erl b/src/ibrowse/ibrowse_lib.erl index 696d0f69..3cbe3ace 100644 --- a/src/ibrowse/ibrowse_lib.erl +++ b/src/ibrowse/ibrowse_lib.erl @@ -180,7 +180,19 @@ get_value(Tag, TVL) -> V. parse_url(Url) -> - parse_url(Url, get_protocol, #url{abspath=Url}, []). + case parse_url(Url, get_protocol, #url{abspath=Url}, []) of + #url{host_type = undefined, host = Host} = UrlRec -> + case inet_parse:address(Host) of + {ok, {_, _, _, _, _, _, _, _}} -> + UrlRec#url{host_type = ipv6_address}; + {ok, {_, _, _, _}} -> + UrlRec#url{host_type = ipv4_address}; + _ -> + UrlRec#url{host_type = hostname} + end; + Else -> + Else + end. parse_url([$:, $/, $/ | _], get_protocol, Url, []) -> {invalid_uri_1, Url}; @@ -215,6 +227,21 @@ parse_url([$@ | T], get_username, Url, TmpAcc) -> Url#url{username = lists:reverse(TmpAcc), password = ""}, []); +parse_url([$[ | T], get_username, Url, []) -> + % IPv6 address literals are enclosed by square brackets: + % http://www.ietf.org/rfc/rfc2732.txt + parse_url(T, get_ipv6_address, Url#url{host_type = ipv6_address}, []); +parse_url([$[ | T], get_username, _Url, TmpAcc) -> + {error, {invalid_username_or_host, lists:reverse(TmpAcc) ++ "[" ++ T}}; +parse_url([$[ | _], get_password, _Url, []) -> + {error, missing_password}; +parse_url([$[ | T], get_password, Url, TmpAcc) -> + % IPv6 address literals are enclosed by square brackets: + % http://www.ietf.org/rfc/rfc2732.txt + parse_url(T, get_ipv6_address, + Url#url{host_type = ipv6_address, + password = lists:reverse(TmpAcc)}, + []); parse_url([$@ | T], get_password, Url, TmpAcc) -> parse_url(T, get_host, Url#url{password = lists:reverse(TmpAcc)}, @@ -236,6 +263,28 @@ parse_url([H | T], get_password, Url, TmpAcc) when H == $/; username = undefined, password = undefined, path = Path}; +parse_url([$] | T], get_ipv6_address, #url{protocol = Prot} = Url, TmpAcc) -> + Addr = lists:reverse(TmpAcc), + case inet_parse:address(Addr) of + {ok, {_, _, _, _, _, _, _, _}} -> + Url2 = Url#url{host = Addr, port = default_port(Prot)}, + case T of + [$: | T2] -> + parse_url(T2, get_port, Url2, []); + [$/ | T2] -> + Url2#url{path = [$/ | T2]}; + [$? | T2] -> + Url2#url{path = [$/, $? | T2]}; + [] -> + Url2#url{path = "/"}; + _ -> + {error, {invalid_host, "[" ++ Addr ++ "]" ++ T}} + end; + _ -> + {error, {invalid_ipv6_address, Addr}} + end; +parse_url([$[ | T], get_host, #url{} = Url, []) -> + parse_url(T, get_ipv6_address, Url#url{host_type = ipv6_address}, []); parse_url([$: | T], get_host, #url{} = Url, TmpAcc) -> parse_url(T, get_port, Url#url{host = lists:reverse(TmpAcc)}, -- cgit v1.2.3