Thomas Mullaly : urlmon: Added parser for IPvFuture addresses.
Alexandre Julliard
julliard at winehq.org
Mon Jul 26 13:22:30 CDT 2010
Module: wine
Branch: master
Commit: 48e155ba7079993f5b7a05377be13ef9cd6710ed
URL: http://source.winehq.org/git/wine.git/?a=commit;h=48e155ba7079993f5b7a05377be13ef9cd6710ed
Author: Thomas Mullaly <thomas.mullaly at 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://[v2.34]/", 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://[v2.34]/",S_OK,TRUE},
+ {"[v2.34]",S_OK,TRUE},
+ {"http://[v2.34]/",S_OK,TRUE},
+ {"",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://[v2.34]/",S_OK,FALSE},
+ {"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 != ']') {
More information about the wine-cvs
mailing list