Skip to content

Commit bed8560

Browse files
committed
Add flag to enable permessage-deflate
1 parent 66763aa commit bed8560

File tree

5 files changed

+63
-1
lines changed

5 files changed

+63
-1
lines changed

src/node/cli.ts

+2
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export interface Args extends VsArgs {
3535
"cert-key"?: string
3636
"disable-telemetry"?: boolean
3737
"disable-update-check"?: boolean
38+
enable?: string[]
3839
help?: boolean
3940
host?: string
4041
json?: boolean
@@ -128,6 +129,7 @@ const options: Options<Required<Args>> = {
128129
"Disable update check. Without this flag, code-server checks every 6 hours against the latest github release and \n" +
129130
"then notifies you once every week that a new release is available.",
130131
},
132+
enable: { type: "string[]" }, // There is no support for this flag.
131133
help: { type: "boolean", short: "h", description: "Show this output." },
132134
json: { type: "boolean" },
133135
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
@@ -21,6 +21,7 @@ import * as proxyAgent from "./proxy_agent"
2121
import { register } from "./routes"
2222
import { humanPath, isFile, open } from "./util"
2323
import { isChild, wrapper } from "./wrapper"
24+
import { enableFeature } from "./feature"
2425

2526
export const runVsCodeCli = (args: DefaultedArgs): void => {
2627
logger.debug("forking vs code cli...")
@@ -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 (enableFeature(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/feature.ts

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
export enum Feature {
2+
/** Web socket compression. */
3+
PermessageDeflate = "permessage-deflate",
4+
}
5+
6+
const enabledFeatures: Feature[] = []
7+
8+
/**
9+
* Enable the specified feature.
10+
*
11+
* Return true if the feature was enabled or false if it's invalid.
12+
*/
13+
export function enableFeature(feature: string) {
14+
for (const key in Feature) {
15+
if (Feature[key as keyof typeof Feature] === feature) {
16+
enabledFeatures.push(feature as Feature)
17+
return true
18+
}
19+
}
20+
return false
21+
}
22+
23+
/**
24+
* Return true if the feature is enabled. Features are always enabled in
25+
* development mode to ensure we are testing them.
26+
*/
27+
export function isFeatureEnabled(feature: Feature) {
28+
return enabledFeatures.includes(feature)
29+
}

src/node/routes/vscode.ts

+4-1
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, isFeatureEnabled } from "../feature"
1112
import { authenticated, ensureAuthenticated, redirect, replaceTemplates } from "../http"
1213
import { getMediaMime, pathToFsPath } from "../util"
1314
import { VscodeProvider } from "../vscode"
@@ -213,7 +214,9 @@ wsRouter.ws("/", ensureAuthenticated, async (req) => {
213214
// it's stable (see zlib issues).
214215
// TODO: Parse this header properly.
215216
const extensions = req.headers["sec-websocket-extensions"]
216-
const permessageDeflate = extensions ? extensions.includes("permessage-deflate") && isDevMode : false
217+
const permessageDeflate = extensions
218+
? extensions.includes("permessage-deflate") && isFeatureEnabled(Feature.PermessageDeflate)
219+
: false
217220
if (permessageDeflate) {
218221
responseHeaders.push("Sec-WebSocket-Extensions: permessage-deflate; server_max_window_bits=15")
219222
}

test/unit/feature.test.ts

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
import { Feature, enableFeature, isFeatureEnabled } from "../../src/node/feature"
2+
3+
describe("feature", () => {
4+
it("should have no features enabled", () => {
5+
expect(isFeatureEnabled(Feature.PermessageDeflate)).toStrictEqual(false)
6+
})
7+
8+
it("should enable features", () => {
9+
expect(enableFeature(Feature.PermessageDeflate)).toStrictEqual(true)
10+
expect(isFeatureEnabled(Feature.PermessageDeflate)).toStrictEqual(true)
11+
})
12+
13+
it("should not add invalid features", () => {
14+
expect(enableFeature("invalid")).toStrictEqual(false)
15+
})
16+
})

0 commit comments

Comments
 (0)