about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2012-08-05 16:33:28 -0700
committerBrian Anderson <banderson@mozilla.com>2012-08-05 16:33:28 -0700
commit3fe1c7071d9585f53748d8d0ccb5a06c7b850287 (patch)
tree853e11fab60e713b51187c504a998fb2cf1a3b3e /src/libstd
parentdbf58716dfe1dd502ea37d5a613847406a9736c9 (diff)
std: Some fixes to url parsing
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/net_url.rs20
1 files changed, 18 insertions, 2 deletions
diff --git a/src/libstd/net_url.rs b/src/libstd/net_url.rs
index ac9d4b389f9..dd97c1fdeb2 100644
--- a/src/libstd/net_url.rs
+++ b/src/libstd/net_url.rs
@@ -489,10 +489,17 @@ fn get_authority(rawurl: ~str) ->
         end = i;
     }
 
+    let end = end; // make end immutable so it can be captured
+
+    let host_is_end_plus_one = || {
+        end+1 == len
+            && !['?', '#', '/'].contains(rawurl[end] as char)
+    };
+
     // finish up
     match st {
       start {
-        if end+1 == len {
+        if host_is_end_plus_one() {
             host = str::slice(rawurl, begin, end+1);
         } else {
             host = str::slice(rawurl, begin, end);
@@ -516,7 +523,7 @@ fn get_authority(rawurl: ~str) ->
       }
     }
 
-    let rest = if end+1 == len { ~"" }
+    let rest = if host_is_end_plus_one() { ~"" }
     else { str::slice(rawurl, end, len) };
     return result::ok((userinfo, host, port, rest));
 }
@@ -780,6 +787,15 @@ mod tests {
     }
 
     #[test]
+    fn test_url_parse_host_slash() {
+        let urlstr = ~"http://0.42.42.42/";
+        let url = from_str(urlstr).get();
+        #debug("url: %?", url);
+        assert url.host == ~"0.42.42.42";
+        assert url.path == ~"/";
+    }
+
+    #[test]
     fn test_no_scheme() {
         assert result::is_err(get_scheme(~"noschemehere.html"));
     }