From 70b1be6ff459ebd2bf57b7788ab7d66c1f375b29 Mon Sep 17 00:00:00 2001 From: Dreamacro Date: Sat, 4 Jan 2020 17:31:12 +0800 Subject: Fix ws handshake with correctly empty search string (#3587) --- std/ws/mod.ts | 6 +++--- std/ws/test.ts | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 52 insertions(+), 4 deletions(-) (limited to 'std/ws') diff --git a/std/ws/mod.ts b/std/ws/mod.ts index a32380efc..c256f58ad 100644 --- a/std/ws/mod.ts +++ b/std/ws/mod.ts @@ -411,13 +411,13 @@ export function createSecKey(): string { return btoa(key); } -async function handshake( +export async function handshake( url: URL, headers: Headers, bufReader: BufReader, bufWriter: BufWriter ): Promise { - const { hostname, pathname, searchParams } = url; + const { hostname, pathname, search } = url; const key = createSecKey(); if (!headers.has("host")) { @@ -428,7 +428,7 @@ async function handshake( headers.set("sec-websocket-key", key); headers.set("sec-websocket-version", "13"); - let headerStr = `GET ${pathname}?${searchParams || ""} HTTP/1.1\r\n`; + let headerStr = `GET ${pathname}${search} HTTP/1.1\r\n`; for (const [key, value] of headers) { headerStr += `${key}: ${value}\r\n`; } diff --git a/std/ws/test.ts b/std/ws/test.ts index 8ccda0988..e9cdd1d40 100644 --- a/std/ws/test.ts +++ b/std/ws/test.ts @@ -1,11 +1,13 @@ // Copyright 2018-2020 the Deno authors. All rights reserved. MIT license. -import { BufReader } from "../io/bufio.ts"; +import { BufReader, BufWriter } from "../io/bufio.ts"; import { assert, assertEquals, assertThrowsAsync } from "../testing/asserts.ts"; import { runIfMain, test } from "../testing/mod.ts"; +import { TextProtoReader } from "../textproto/mod.ts"; import { acceptable, connectWebSocket, createSecAccept, + handshake, OpCode, readFrame, unmask, @@ -224,4 +226,50 @@ test(async function wsWriteReadMaskedFrame(): Promise { assertEquals(frame.payload, encode(msg)); }); +test("handshake should not send search when it's empty", async function wsHandshakeWithEmptySearch(): Promise< + void +> { + const writer = new Buffer(); + const reader = new Buffer(encode("HTTP/1.1 400\r\n")); + + await assertThrowsAsync( + async (): Promise => { + await handshake( + new URL("ws://example.com"), + new Headers(), + new BufReader(reader), + new BufWriter(writer) + ); + } + ); + + const tpReader = new TextProtoReader(new BufReader(writer)); + const statusLine = await tpReader.readLine(); + + assertEquals(statusLine, "GET / HTTP/1.1"); +}); + +test("handshake should send search correctly", async function wsHandshakeWithSearch(): Promise< + void +> { + const writer = new Buffer(); + const reader = new Buffer(encode("HTTP/1.1 400\r\n")); + + await assertThrowsAsync( + async (): Promise => { + await handshake( + new URL("ws://example.com?a=1"), + new Headers(), + new BufReader(reader), + new BufWriter(writer) + ); + } + ); + + const tpReader = new TextProtoReader(new BufReader(writer)); + const statusLine = await tpReader.readLine(); + + assertEquals(statusLine, "GET /?a=1 HTTP/1.1"); +}); + runIfMain(import.meta); -- cgit v1.2.3