Index: sdk/lib/core/uri.dart |
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart |
index 30057f1132e5fc0952ffa3172755189f76a71116..88f6e113a3f28d850ab367342b181636de3bc196 100644 |
--- a/sdk/lib/core/uri.dart |
+++ b/sdk/lib/core/uri.dart |
@@ -153,9 +153,9 @@ class Uri { |
* |
* The fragment component is set through [fragment]. |
*/ |
- Uri({scheme, |
+ Uri({String scheme, |
this.userInfo: "", |
- this.host: "", |
+ String host: "", |
port: 0, |
String path, |
Iterable<String> pathSegments, |
@@ -163,6 +163,7 @@ class Uri { |
Map<String, String> queryParameters, |
fragment: ""}) : |
scheme = _makeScheme(scheme), |
+ host = _makeHost(host), |
query = _makeQuery(query, queryParameters), |
fragment = _makeFragment(fragment) { |
// Perform scheme specific normalization. |
@@ -237,12 +238,29 @@ class Uri { |
break; |
} |
} |
+ var hostEnd = null; |
floitsch
2013/09/09 13:32:21
That's how I would write it.
var hostEnd = hostSt
Anders Johnsen
2013/09/10 11:13:23
Done.
|
+ var portStart = hostStart; |
+ if (authority.codeUnitAt(hostStart) == _LEFT_BRACKET) { |
+ // IPv6 host. |
+ for (int i = hostStart; i < authority.length; i++) { |
+ if (authority.codeUnitAt(i) == _RIGHT_BRACKET) { |
+ hostEnd = i; |
+ break; |
+ } |
+ } |
+ if (hostEnd == null) { |
+ throw new FormatException("Invalid IPv6 host entry."); |
+ } |
+ hostEnd++; |
+ portStart = hostEnd; |
+ } |
// Split host and port. |
bool hasPort = false; |
- for (int i = hostStart; i < authority.length; i++) { |
+ for (int i = portStart; i < authority.length; i++) { |
if (authority.codeUnitAt(i) == _COLON) { |
hasPort = true; |
floitsch
2013/09/09 13:32:21
you set hasPort to true, but if the host is empty
Anders Johnsen
2013/09/10 11:13:23
Done.
|
- host = authority.substring(hostStart, i); |
+ if (hostEnd == null) hostEnd = i; |
+ host = authority.substring(hostStart, hostEnd); |
if (!host.isEmpty) { |
floitsch
2013/09/09 13:32:21
if you just check hostStart != hostEnd you don't n
Anders Johnsen
2013/09/10 11:13:23
Done.
|
var portString = authority.substring(i + 1); |
if (portString.isNotEmpty) port = int.parse(portString); |
floitsch
2013/09/09 13:32:21
is this intended behavior? (an authority with ":"
Anders Johnsen
2013/09/10 11:13:23
Done.
|
@@ -251,7 +269,7 @@ class Uri { |
} |
} |
if (!hasPort) { |
- host = hasUserInfo ? authority.substring(hostStart) : authority; |
+ host = authority.substring(hostStart, hostEnd); |
} |
return new Uri(scheme: scheme, |
@@ -474,6 +492,23 @@ class Uri { |
return _queryParameters; |
} |
+ static String _makeHost(String host) { |
+ if (host.isEmpty) return host; |
+ if (host.codeUnitAt(0) == _LEFT_BRACKET) return host; |
floitsch
2013/09/09 13:32:21
I would prefer a more sophisticated host-parser:
d
Anders Johnsen
2013/09/10 11:13:23
Done.
|
+ for (int i = 0; i < host.length; i++) { |
+ if (host.codeUnitAt(i) == _COLON) { |
+ var buffer = new StringBuffer(); |
+ buffer.writeCharCode(_LEFT_BRACKET); |
+ buffer.write(host); |
+ if (host.codeUnitAt(host.length - 1) != _RIGHT_BRACKET) { |
+ buffer.writeCharCode(_RIGHT_BRACKET); |
+ } |
+ return buffer.toString(); |
+ } |
+ } |
+ return host; |
+ } |
+ |
static String _makeScheme(String scheme) { |
bool isSchemeLowerCharacter(int ch) { |
return ch < 128 && |
@@ -1164,7 +1199,9 @@ class Uri { |
static const int _UPPER_CASE_A = 0x41; |
static const int _UPPER_CASE_F = 0x46; |
static const int _UPPER_CASE_Z = 0x5A; |
+ static const int _LEFT_BRACKET = 0x5B; |
static const int _BACKSLASH = 0x5C; |
+ static const int _RIGHT_BRACKET = 0x5D; |
static const int _LOWER_CASE_A = 0x61; |
static const int _LOWER_CASE_F = 0x66; |
static const int _LOWER_CASE_Z = 0x7A; |