Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 6ff495e

Browse files
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‎

Lines changed: 9 additions & 0 deletions
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‎

Lines changed: 12 additions & 0 deletions
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‎

Lines changed: 11 additions & 3 deletions
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‎

Lines changed: 5 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /