diff --git a/src/browser/client.ts b/src/browser/client.ts index 677ea9b812538c635bc4c8ed579314473080f0fb..47d70baa7f45b9cb2203ecb3caa2b7fa31c71c1b 100644 --- a/src/browser/client.ts +++ b/src/browser/client.ts @@ -3,15 +3,16 @@ import { URI } from "vs/base/common/uri"; import { registerSingleton } from "vs/platform/instantiation/common/extensions"; import { ServiceCollection } from "vs/platform/instantiation/common/serviceCollection"; import { ILocalizationsService } from "vs/platform/localizations/common/localizations"; -import { LocalizationsService } from "vs/workbench/services/localizations/electron-browser/localizationsService"; +import { PersistentConnectionEventType } from "vs/platform/remote/common/remoteAgentConnection"; import { ITelemetryService } from "vs/platform/telemetry/common/telemetry"; import { coderApi, vscodeApi } from "vs/server/src/browser/api"; import { IUploadService, UploadService } from "vs/server/src/browser/upload"; import { INodeProxyService, NodeProxyChannelClient } from "vs/server/src/common/nodeProxy"; import { TelemetryChannelClient } from "vs/server/src/common/telemetry"; +import { split } from "vs/server/src/common/util"; import "vs/workbench/contrib/localizations/browser/localizations.contribution"; +import { LocalizationsService } from "vs/workbench/services/localizations/electron-browser/localizationsService"; import { IRemoteAgentService } from "vs/workbench/services/remote/common/remoteAgentService"; -import { PersistentConnectionEventType } from "vs/platform/remote/common/remoteAgentConnection"; class TelemetryService extends TelemetryChannelClient { public constructor( @@ -79,7 +80,7 @@ export const withQuery = (url: string, replace: Query): string => { const uri = URI.parse(url); const query = { ...replace }; uri.query.split("&").forEach((kv) => { - const [key, value] = kv.split("=", 2); + const [key, value] = split(kv, "="); if (!(key in query)) { query[key] = value; } diff --git a/src/common/util.ts b/src/common/util.ts new file mode 100644 index 0000000000000000000000000000000000000000..9be7dbe763ee7cbffa9c4450f61856f0ca808652 --- /dev/null +++ b/src/common/util.ts @@ -0,0 +1,10 @@ +/** + * Split a string up to the delimiter. If the delimiter doesn't exist the first + * item will have all the text and the second item will be an empty string. + */ +export const split = (str: string, delimiter: string): [string, string] => { + const index = str.indexOf(delimiter); + return index !== -1 + ? [str.substring(0, index).trim(), str.substring(index + 1)] + : [str, ""]; +}; diff --git a/src/node/server.ts b/src/node/server.ts index ed96fbcec589fa8ce312d3ebb9a7dcb6a76c9049..4be670618242d262a2b9ac6d8583612c2c3848a9 100644 --- a/src/node/server.ts +++ b/src/node/server.ts @@ -56,6 +56,7 @@ import { resolveCommonProperties } from "vs/platform/telemetry/node/commonProper import { UpdateChannel } from "vs/platform/update/electron-main/updateIpc"; import { INodeProxyService, NodeProxyChannel } from "vs/server/src/common/nodeProxy"; import { TelemetryChannel } from "vs/server/src/common/telemetry"; +import { split } from "vs/server/src/common/util"; import { ExtensionEnvironmentChannel, FileProviderChannel, NodeProxyService } from "vs/server/src/node/channel"; import { Connection, ExtensionHostConnection, ManagementConnection } from "vs/server/src/node/connection"; import { TelemetryClient } from "vs/server/src/node/insights"; @@ -212,8 +213,8 @@ export abstract class Server { } protected withBase(request: http.IncomingMessage, path: string): string { - const split = request.url ? request.url.split("?", 2) : []; - return `${this.protocol}://${request.headers.host}${this.options.basePath}${path}${split.length === 2 ? `?${split[1]}` : ""}`; + const [, query] = request.url ? split(request.url, "?") : []; + return `${this.protocol}://${request.headers.host}${this.options.basePath}${path}${query ? `?${query}` : ""}`; } private isAllowedRequestPath(path: string): boolean { @@ -440,11 +441,8 @@ export abstract class Server { const cookies: { [key: string]: string } = {}; if (request.headers.cookie) { request.headers.cookie.split(";").forEach((keyValue) => { - // key=value -> { [key]: value } and key -> { [key]: "" } - const index = keyValue.indexOf("="); - const key = keyValue.substring(0, index).trim(); - const value = keyValue.substring(index + 1); - cookies[key || value] = decodeURI(key ? value : ""); + const [key, value] = split(keyValue, "="); + cookies[key] = decodeURI(value); }); } return cookies as T;