Add helper functions to make some code clearer

This commit is contained in:
Asher 2020-07-30 12:14:31 -05:00
parent c581bca29d
commit e86c066438
No known key found for this signature in database
GPG Key ID: D63C1EF81242354A
3 changed files with 26 additions and 6 deletions

View File

@ -33,6 +33,13 @@ export const normalize = (url: string, keepTrailing = false): string => {
return url.replace(/\/\/+/g, "/").replace(/\/+$/, keepTrailing ? "/" : "") return url.replace(/\/\/+/g, "/").replace(/\/+$/, keepTrailing ? "/" : "")
} }
/**
* Remove leading and trailing slashes.
*/
export const trimSlashes = (url: string): string => {
return url.replace(/^\/+|\/+$/g, "")
}
/** /**
* Get options embedded in the HTML or query params. * Get options embedded in the HTML or query params.
*/ */
@ -75,3 +82,17 @@ export const getOptions = <T extends Options>(): T => {
return options return options
} }
/**
* Wrap the value in an array if it's not already an array. If the value is
* undefined return an empty array.
*/
export const arrayify = <T>(value?: T | T[]): T[] => {
if (Array.isArray(value)) {
return value
}
if (typeof value === "undefined") {
return []
}
return [value]
}

View File

@ -14,7 +14,7 @@ import {
WorkbenchOptions, WorkbenchOptions,
} from "../../../lib/vscode/src/vs/server/ipc" } from "../../../lib/vscode/src/vs/server/ipc"
import { HttpCode, HttpError } from "../../common/http" import { HttpCode, HttpError } from "../../common/http"
import { generateUuid } from "../../common/util" import { arrayify, generateUuid } from "../../common/util"
import { Args } from "../cli" import { Args } from "../cli"
import { HttpProvider, HttpProviderOptions, HttpResponse, Route } from "../http" import { HttpProvider, HttpProviderOptions, HttpResponse, Route } from "../http"
import { settings } from "../settings" import { settings } from "../settings"
@ -224,8 +224,7 @@ export class VscodeHttpProvider extends HttpProvider {
} }
for (let i = 0; i < startPaths.length; ++i) { for (let i = 0; i < startPaths.length; ++i) {
const startPath = startPaths[i] const startPath = startPaths[i]
const url = const url = arrayify(startPath && startPath.url).find((p) => !!p)
startPath && (typeof startPath.url === "string" ? [startPath.url] : startPath.url || []).find((p) => !!p)
if (startPath && url) { if (startPath && url) {
return { return {
url, url,

View File

@ -12,7 +12,7 @@ import { Readable } from "stream"
import * as tls from "tls" import * as tls from "tls"
import * as url from "url" import * as url from "url"
import { HttpCode, HttpError } from "../common/http" import { HttpCode, HttpError } from "../common/http"
import { normalize, Options, plural, split } from "../common/util" import { arrayify, normalize, Options, plural, split, trimSlashes } from "../common/util"
import { SocketProxyProvider } from "./socket" import { SocketProxyProvider } from "./socket"
import { getMediaMime, paths } from "./util" import { getMediaMime, paths } from "./util"
@ -287,7 +287,7 @@ export abstract class HttpProvider {
* Helper to error on invalid methods (default GET). * Helper to error on invalid methods (default GET).
*/ */
protected ensureMethod(request: http.IncomingMessage, method?: string | string[]): void { protected ensureMethod(request: http.IncomingMessage, method?: string | string[]): void {
const check = Array.isArray(method) ? method : [method || "GET"] const check = arrayify(method || "GET")
if (!request.method || !check.includes(request.method)) { if (!request.method || !check.includes(request.method)) {
throw new HttpError(`Unsupported method ${request.method}`, HttpCode.BadRequest) throw new HttpError(`Unsupported method ${request.method}`, HttpCode.BadRequest)
} }
@ -559,7 +559,7 @@ export class HttpServer {
}, },
...args, ...args,
) )
const endpoints = (typeof endpoint === "string" ? [endpoint] : endpoint).map((e) => e.replace(/^\/+|\/+$/g, "")) const endpoints = arrayify(endpoint).map(trimSlashes)
endpoints.forEach((endpoint) => { endpoints.forEach((endpoint) => {
if (/\//.test(endpoint)) { if (/\//.test(endpoint)) {
throw new Error(`Only top-level endpoints are supported (got ${endpoint})`) throw new Error(`Only top-level endpoints are supported (got ${endpoint})`)