summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--std/http/server.ts31
-rw-r--r--std/http/server_test.ts49
2 files changed, 77 insertions, 3 deletions
diff --git a/std/http/server.ts b/std/http/server.ts
index effa7b4b9..82e5f8169 100644
--- a/std/http/server.ts
+++ b/std/http/server.ts
@@ -238,6 +238,34 @@ export class Server implements AsyncIterable<ServerRequest> {
export type HTTPOptions = Omit<Deno.ListenOptions, "transport">;
/**
+ * Parse addr from string
+ *
+ * const addr = "::1:8000";
+ * parseAddrFromString(addr);
+ *
+ * @param addr Address string
+ */
+export function _parseAddrFromStr(addr: string): HTTPOptions {
+ let url: URL;
+ try {
+ url = new URL(`http://${addr}`);
+ } catch {
+ throw new TypeError("Invalid address.");
+ }
+ if (
+ url.username ||
+ url.password ||
+ url.pathname != "/" ||
+ url.search ||
+ url.hash
+ ) {
+ throw new TypeError("Invalid address.");
+ }
+
+ return { hostname: url.hostname, port: Number(url.port) };
+}
+
+/**
* Create a HTTP server
*
* import { serve } from "https://deno.land/std/http/server.ts";
@@ -249,8 +277,7 @@ export type HTTPOptions = Omit<Deno.ListenOptions, "transport">;
*/
export function serve(addr: string | HTTPOptions): Server {
if (typeof addr === "string") {
- const [hostname, port] = addr.split(":");
- addr = { hostname, port: Number(port) };
+ addr = _parseAddrFromStr(addr);
}
const listener = Deno.listen(addr);
diff --git a/std/http/server_test.ts b/std/http/server_test.ts
index 340d9fa73..5a4a48932 100644
--- a/std/http/server_test.ts
+++ b/std/http/server_test.ts
@@ -13,7 +13,14 @@ import {
assertStringContains,
assertThrowsAsync,
} from "../testing/asserts.ts";
-import { Response, ServerRequest, Server, serve, serveTLS } from "./server.ts";
+import {
+ Response,
+ ServerRequest,
+ Server,
+ serve,
+ serveTLS,
+ _parseAddrFromStr,
+} from "./server.ts";
import { BufReader, BufWriter } from "../io/bufio.ts";
import { delay } from "../async/delay.ts";
import { encode, decode } from "../encoding/utf8.ts";
@@ -612,3 +619,43 @@ Deno.test({
}
},
});
+
+Deno.test({
+ name: "server.serve() should be able to parse IPV4 address",
+ fn: (): void => {
+ const server = serve("127.0.0.1:8124");
+ const expected = {
+ hostname: "127.0.0.1",
+ port: 8124,
+ transport: "tcp",
+ };
+ assertEquals(expected, server.listener.addr);
+ server.close();
+ },
+});
+
+Deno.test({
+ name: "server.parseAddrFromStr() should be able to parse IPV6 address",
+ fn: (): void => {
+ const addr = _parseAddrFromStr("[::1]:8124");
+ const expected = {
+ hostname: "[::1]",
+ port: 8124,
+ };
+ assertEquals(expected, addr);
+ },
+});
+
+Deno.test({
+ name: "server.serve() should be able to parse IPV6 address",
+ fn: (): void => {
+ const server = serve("[::1]:8124");
+ const expected = {
+ hostname: "::1",
+ port: 8124,
+ transport: "tcp",
+ };
+ assertEquals(expected, server.listener.addr);
+ server.close();
+ },
+});