Module: wine Branch: master Commit: 48e155ba7079993f5b7a05377be13ef9cd6710ed URL: http://source.winehq.org/git/wine.git/?a=commit;h=48e155ba7079993f5b7a05377b...
Author: Thomas Mullaly thomas.mullaly@gmail.com Date: Wed Jun 30 21:10:13 2010 -0400
urlmon: Added parser for IPvFuture addresses.
---
dlls/urlmon/tests/uri.c | 29 +++++++++++++++++++++++++ dlls/urlmon/uri.c | 53 ++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 77 insertions(+), 5 deletions(-)
diff --git a/dlls/urlmon/tests/uri.c b/dlls/urlmon/tests/uri.c index 5c32fec..11734c8 100644 --- a/dlls/urlmon/tests/uri.c +++ b/dlls/urlmon/tests/uri.c @@ -1516,6 +1516,35 @@ static const uri_properties uri_tests[] = { {URL_SCHEME_HTTP,S_OK,FALSE}, {URLZONE_INVALID,E_NOTIMPL,FALSE} } + }, + { "http://%5Bv2.34%5D/", 0, S_OK, FALSE, + Uri_HAS_ABSOLUTE_URI|Uri_HAS_AUTHORITY|Uri_HAS_DISPLAY_URI|Uri_HAS_HOST| + Uri_HAS_PATH|Uri_HAS_PATH_AND_QUERY|Uri_HAS_RAW_URI|Uri_HAS_SCHEME_NAME| + Uri_HAS_HOST_TYPE|Uri_HAS_PORT|Uri_HAS_SCHEME, + TRUE, + { + {"http://%5Bv2.34%5D/%22,S_OK,TRUE%7D, + {"[v2.34]",S_OK,TRUE}, + {"http://%5Bv2.34%5D/%22,S_OK,TRUE%7D, + {"",S_FALSE,TRUE}, + {"",S_FALSE,TRUE}, + {"",S_FALSE,TRUE}, + {"[v2.34]",S_OK,TRUE}, + {"",S_FALSE,FALSE}, + {"/",S_OK,TRUE}, + {"/",S_OK,TRUE}, + {"",S_FALSE,TRUE}, + {"http://%5Bv2.34%5D/%22,S_OK,FALSE%7D, + {"http",S_OK,FALSE}, + {"",S_FALSE,FALSE}, + {"",S_FALSE,FALSE} + }, + { + {Uri_HOST_UNKNOWN,S_OK,TRUE}, + {80,S_OK,TRUE}, + {URL_SCHEME_HTTP,S_OK,FALSE}, + {URLZONE_INVALID,E_NOTIMPL,FALSE} + } } };
diff --git a/dlls/urlmon/uri.c b/dlls/urlmon/uri.c index b5e9561..82f44bf 100644 --- a/dlls/urlmon/uri.c +++ b/dlls/urlmon/uri.c @@ -878,6 +878,49 @@ static BOOL parse_ipv6address(const WCHAR **ptr, parse_data *data, DWORD flags) return TRUE; }
+/* IPvFuture = "v" 1*HEXDIG "." 1*( unreserved / sub-delims / ":" ) */ +static BOOL parse_ipvfuture(const WCHAR **ptr, parse_data *data, DWORD flags) { + const WCHAR *start = *ptr; + + /* IPvFuture has to start with a 'v' or 'V'. */ + if(**ptr != 'v' && **ptr != 'V') + return FALSE; + + /* Following the v their must be atleast 1 hexdigit. */ + ++(*ptr); + if(!is_hexdigit(**ptr)) { + *ptr = start; + return FALSE; + } + + ++(*ptr); + while(is_hexdigit(**ptr)) + ++(*ptr); + + /* End of the hexdigit sequence must be a '.' */ + if(**ptr != '.') { + *ptr = start; + return FALSE; + } + + ++(*ptr); + if(!is_unreserved(**ptr) && !is_subdelim(**ptr) && **ptr != ':') { + *ptr = start; + return FALSE; + } + + ++(*ptr); + while(is_unreserved(**ptr) || is_subdelim(**ptr) || **ptr == ':') + ++(*ptr); + + data->host_type = Uri_HOST_UNKNOWN; + + TRACE("(%p %p %x): Parsed IPvFuture address %s len=%d\n", ptr, data, flags, + debugstr_wn(start, *ptr-start), *ptr-start); + + return TRUE; +} + /* IP-literal = "[" ( IPv6address / IPvFuture ) "]" */ static BOOL parse_ip_literal(const WCHAR **ptr, parse_data *data, DWORD flags) { data->host = *ptr; @@ -889,11 +932,11 @@ static BOOL parse_ip_literal(const WCHAR **ptr, parse_data *data, DWORD flags) {
++(*ptr); if(!parse_ipv6address(ptr, data, flags)) { - WARN("(%p %p %x): IPvFuture addresses are not supported yet.\n", - ptr, data, flags); - *ptr = data->host; - data->host = NULL; - return FALSE; + if(!parse_ipvfuture(ptr, data, flags)) { + *ptr = data->host; + data->host = NULL; + return FALSE; + } }
if(**ptr != ']') {