summaryrefslogtreecommitdiff
path: root/cli/js
diff options
context:
space:
mode:
author木杉 <zhmushan@qq.com>2019-11-13 02:45:48 +0800
committerRy Dahl <ry@tinyclouds.org>2019-11-12 13:45:48 -0500
commit0f33bf68859c162eb3d65ab53a7c71092585e1d1 (patch)
tree3bc66ca44790bc668ef00510b7b763b16f86e8c9 /cli/js
parent7ba42ee4a6f73c66736d88d30dd9f9b72b6edfff (diff)
fix url parse bug (#3316)
Diffstat (limited to 'cli/js')
-rw-r--r--cli/js/url.ts18
-rw-r--r--cli/js/url_test.ts15
2 files changed, 26 insertions, 7 deletions
diff --git a/cli/js/url.ts b/cli/js/url.ts
index 7b06fd64c..e5cf3ed62 100644
--- a/cli/js/url.ts
+++ b/cli/js/url.ts
@@ -17,7 +17,7 @@ interface URLParts {
}
const patterns = {
- protocol: "(?:([^:/?#]+):)",
+ protocol: "(?:([a-z]+):)",
authority: "(?://([^/?#]*))",
path: "([^?#]*)",
query: "(\\?[^#]*)",
@@ -228,10 +228,13 @@ export class URL {
this.username || this.password
? `${this.username}${this.password ? ":" + this.password : ""}@`
: "";
-
- return `${this.protocol}//${authentication}${this.host}${this.pathname}${
- this.search
- }${this.hash}`;
+ let slash = "";
+ if (this.host || this.protocol === "file:") {
+ slash = "//";
+ }
+ return `${this.protocol}${slash}${authentication}${this.host}${
+ this.pathname
+ }${this.search}${this.hash}`;
}
set href(value: string) {
@@ -244,7 +247,10 @@ export class URL {
}
get origin(): string {
- return `${this.protocol}//${this.host}`;
+ if (this.host) {
+ return `${this.protocol}//${this.host}`;
+ }
+ return "null";
}
get password(): string {
diff --git a/cli/js/url_test.ts b/cli/js/url_test.ts
index 23f9f5f4b..1f8e31999 100644
--- a/cli/js/url_test.ts
+++ b/cli/js/url_test.ts
@@ -1,5 +1,5 @@
// Copyright 2018-2019 the Deno authors. All rights reserved. MIT license.
-import { test, assert, assertEquals } from "./test_util.ts";
+import { test, assert, assertEquals, assertThrows } from "./test_util.ts";
test(function urlParsing(): void {
const url = new URL(
@@ -187,3 +187,16 @@ test(function customInspectFunction(): void {
'URL { href: "http://example.com/?", origin: "http://example.com", protocol: "http:", username: "", password: "", host: "example.com", hostname: "example.com", port: "", pathname: "/", hash: "", search: "?" }'
);
});
+
+test(function protocolNotHttpOrFile() {
+ const url = new URL("about:blank");
+ assertEquals(url.href, "about:blank");
+ assertEquals(url.protocol, "about:");
+ assertEquals(url.origin, "null");
+});
+
+test(function createBadUrl(): void {
+ assertThrows(() => {
+ new URL("0.0.0.0:8080");
+ });
+});