Skip to content

Commit 6ff495e

Browse files
committed
Add flag to enable permessage-deflate
1 parent 92bf2c9 commit 6ff495e

File tree

4 files changed

+37
-3
lines changed

4 files changed

+37
-3
lines changed

src/node/cli.ts

+9
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ import * as path from "path"
66
import { Args as VsArgs } from "../../typings/ipc"
77
import { canConnect, generateCertificate, generatePassword, humanPath, paths } from "./util"
88

9+
export enum Feature {
10+
/** Web socket compression. */
11+
PermessageDeflate = "permessage-deflate",
12+
}
13+
914
export enum AuthType {
1015
Password = "password",
1116
None = "none",
@@ -35,6 +40,7 @@ export interface Args extends VsArgs {
3540
"cert-key"?: string
3641
"disable-telemetry"?: boolean
3742
"disable-update-check"?: boolean
43+
enable?: string[]
3844
help?: boolean
3945
host?: string
4046
json?: boolean
@@ -128,6 +134,9 @@ const options: Options<Required<Args>> = {
128134
"Disable update check. Without this flag, code-server checks every 6 hours against the latest github release and \n" +
129135
"then notifies you once every week that a new release is available.",
130136
},
137+
// --enable can be used to enable experimental features. These features
138+
// provide no guarantees.
139+
enable: { type: "string[]" },
131140
help: { type: "boolean", short: "h", description: "Show this output." },
132141
json: { type: "boolean" },
133142
open: { type: "boolean", description: "Open in browser on startup. Does not work remotely." },

src/node/entry.ts

+12
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { createApp, ensureAddress } from "./app"
88
import {
99
AuthType,
1010
DefaultedArgs,
11+
Feature,
1112
optionDescriptions,
1213
parse,
1314
readConfigFile,
@@ -146,6 +147,17 @@ const main = async (args: DefaultedArgs): Promise<void> => {
146147
}
147148
}
148149

150+
if (args.enable && args.enable.length > 0) {
151+
logger.info("Enabling features:")
152+
args.enable.forEach((feature) => {
153+
if (Object.values(Feature).includes(feature as Feature)) {
154+
logger.info(` - "${feature}"`)
155+
} else {
156+
logger.error(` X "${feature}" (unknown feature)`)
157+
}
158+
})
159+
}
160+
149161
if (!args.socket && args.open) {
150162
// The web socket doesn't seem to work if browsing with 0.0.0.0.
151163
const openAddress = serverAddress.replace("://0.0.0.0", "://localhost")

src/node/routes/vscode.ts

+11-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { Emitter } from "../../common/emitter"
88
import { HttpCode, HttpError } from "../../common/http"
99
import { getFirstString } from "../../common/util"
1010
import { isDevMode, rootPath, version } from "../constants"
11+
import { Feature } from "../cli"
1112
import { authenticated, ensureAuthenticated, redirect, replaceTemplates } from "../http"
1213
import { getMediaMime, pathToFsPath } from "../util"
1314
import { VscodeProvider } from "../vscode"
@@ -209,14 +210,21 @@ wsRouter.ws("/", ensureAuthenticated, async (req) => {
209210
`Sec-WebSocket-Accept: ${reply}`,
210211
]
211212

213+
// See if the browser reports it supports web socket compression.
212214
// TODO: Parse this header properly.
213215
const extensions = req.headers["sec-websocket-extensions"]
214-
const permessageDeflate = extensions ? extensions.includes("permessage-deflate") : false
215-
if (permessageDeflate) {
216+
const isCompressionSupported = extensions ? extensions.includes("permessage-deflate") : false
217+
218+
// TODO: For now we only use compression if the user enables it.
219+
const isCompressionEnabled = !!req.args.enable?.includes(Feature.PermessageDeflate)
220+
221+
const useCompression = isCompressionEnabled && isCompressionSupported
222+
if (useCompression) {
223+
// This response header tells the browser the server supports compression.
216224
responseHeaders.push("Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15")
217225
}
218226

219227
req.ws.write(responseHeaders.join("\r\n") + "\r\n\r\n")
220228

221-
await vscode.sendWebsocket(req.ws, req.query, permessageDeflate)
229+
await vscode.sendWebsocket(req.ws, req.query, useCompression)
222230
})

test/unit/cli.test.ts

+5
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ describe("parser", () => {
3939
it("should parse all available options", () => {
4040
expect(
4141
parse([
42+
"--enable",
43+
"feature1",
44+
"--enable",
45+
"feature2",
4246
"--bind-addr=192.169.0.1:8080",
4347
"--auth",
4448
"none",
@@ -82,6 +86,7 @@ describe("parser", () => {
8286
cert: {
8387
value: path.resolve("baz"),
8488
},
89+
enable: ["feature1", "feature2"],
8590
"extensions-dir": path.resolve("foo"),
8691
"extra-builtin-extensions-dir": [path.resolve("bazzle")],
8792
"extra-extensions-dir": [path.resolve("nozzle")],

0 commit comments

Comments
 (0)