Skip to content

Commit 33e2dff

Browse files
committed
Log information about proxy-related environment variables
1 parent bff89dc commit 33e2dff

File tree

5 files changed

+236
-0
lines changed

5 files changed

+236
-0
lines changed

lib/start-proxy-action.js

Lines changed: 41 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/languages.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,6 @@ export enum KnownLanguage {
2323
/** Java-specific environment variable names that we may care about. */
2424
export enum JavaEnvVars {
2525
JAVA_TOOL_OPTIONS = "JAVA_TOOL_OPTIONS",
26+
JDK_JAVA_OPTIONS = "JDK_JAVA_OPTIONS",
27+
_JAVA_OPTIONS = "_JAVA_OPTIONS",
2628
}

src/start-proxy-action.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
ProxyConfig,
2323
} from "./start-proxy";
2424
import { generateCertificateAuthority } from "./start-proxy/ca";
25+
import { checkProxyEnvironment } from "./start-proxy/environment";
2526
import { checkConnections } from "./start-proxy/reachability";
2627
import { ActionName, sendUnhandledErrorStatusReport } from "./status-report";
2728
import * as util from "./util";
@@ -76,6 +77,9 @@ async function run(startedAt: Date) {
7677
.join("\n")}`,
7778
);
7879

80+
// Check the environment for any configurations which may affect the proxy.
81+
checkProxyEnvironment(logger, language);
82+
7983
const ca = generateCertificateAuthority(
8084
await features.getValue(Feature.ImprovedProxyCertificates),
8185
);
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import test, { ExecutionContext } from "ava";
2+
3+
import { JavaEnvVars, KnownLanguage } from "../languages";
4+
import {
5+
checkExpectedLogMessages,
6+
getRecordingLogger,
7+
LoggedMessage,
8+
setupTests,
9+
} from "../testing-utils";
10+
11+
import {
12+
checkJavaEnvVars,
13+
checkProxyEnvironment,
14+
checkProxyEnvVars,
15+
JAVA_PROXY_ENV_VARS,
16+
ProxyEnvVars,
17+
} from "./environment";
18+
19+
setupTests(test);
20+
21+
function assertEnvVarLogMessages(
22+
t: ExecutionContext<any>,
23+
envVars: string[],
24+
messages: LoggedMessage[],
25+
expectSet: boolean,
26+
) {
27+
const template = (envVar: string) =>
28+
expectSet
29+
? `Environment variable '${envVar}' is set to '${envVar}'`
30+
: `Environment variable '${envVar}' is not set`;
31+
32+
const expected: string[] = [];
33+
34+
for (const envVar of envVars) {
35+
expected.push(template(envVar));
36+
}
37+
38+
checkExpectedLogMessages(t, messages, expected);
39+
}
40+
41+
test("checkJavaEnvironment - none set", (t) => {
42+
const messages: LoggedMessage[] = [];
43+
const logger = getRecordingLogger(messages);
44+
45+
checkJavaEnvVars(logger);
46+
assertEnvVarLogMessages(t, JAVA_PROXY_ENV_VARS, messages, false);
47+
});
48+
49+
test("checkJavaEnvironment - logs values when variables are set", (t) => {
50+
const messages: LoggedMessage[] = [];
51+
const logger = getRecordingLogger(messages);
52+
53+
for (const envVar of Object.values(JavaEnvVars)) {
54+
process.env[envVar] = envVar;
55+
}
56+
57+
checkJavaEnvVars(logger);
58+
assertEnvVarLogMessages(t, JAVA_PROXY_ENV_VARS, messages, true);
59+
});
60+
61+
test("checkProxyEnvVars - none set", (t) => {
62+
const messages: LoggedMessage[] = [];
63+
const logger = getRecordingLogger(messages);
64+
65+
checkProxyEnvVars(logger);
66+
assertEnvVarLogMessages(t, Object.values(ProxyEnvVars), messages, false);
67+
});
68+
69+
test("checkProxyEnvVars - logs values when variables are set", (t) => {
70+
const messages: LoggedMessage[] = [];
71+
const logger = getRecordingLogger(messages);
72+
73+
for (const envVar of Object.values(ProxyEnvVars)) {
74+
process.env[envVar] = envVar;
75+
}
76+
77+
for (const envVar of Object.values(ProxyEnvVars)) {
78+
process.env[envVar] = envVar;
79+
}
80+
81+
checkProxyEnvVars(logger);
82+
assertEnvVarLogMessages(t, Object.values(ProxyEnvVars), messages, true);
83+
});
84+
85+
test("checkProxyEnvironment - includes base checks for all known languages", (t) => {
86+
for (const language of Object.values(KnownLanguage)) {
87+
const messages: LoggedMessage[] = [];
88+
const logger = getRecordingLogger(messages);
89+
90+
checkProxyEnvironment(logger, language);
91+
assertEnvVarLogMessages(t, Object.keys(ProxyEnvVars), messages, false);
92+
}
93+
});
94+
95+
test("checkProxyEnvironment - includes Java checks for Java", (t) => {
96+
const messages: LoggedMessage[] = [];
97+
const logger = getRecordingLogger(messages);
98+
99+
checkProxyEnvironment(logger, KnownLanguage.java);
100+
assertEnvVarLogMessages(t, Object.keys(ProxyEnvVars), messages, false);
101+
assertEnvVarLogMessages(t, JAVA_PROXY_ENV_VARS, messages, false);
102+
});
103+
104+
test("checkProxyEnvironment - includes language-specific checks if the language is undefined", (t) => {
105+
const messages: LoggedMessage[] = [];
106+
const logger = getRecordingLogger(messages);
107+
108+
checkProxyEnvironment(logger, undefined);
109+
assertEnvVarLogMessages(t, Object.keys(ProxyEnvVars), messages, false);
110+
assertEnvVarLogMessages(t, JAVA_PROXY_ENV_VARS, messages, false);
111+
});

src/start-proxy/environment.ts

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
import { JavaEnvVars, KnownLanguage, Language } from "../languages";
2+
import { Logger } from "../logging";
3+
import { isDefined } from "../util";
4+
5+
/**
6+
* Checks whether an environment variable named `name` is set and logs its value if set.
7+
*
8+
* @param logger The logger to use.
9+
* @param name The name of the environment variable.
10+
* @returns True if set or false otherwise.
11+
*/
12+
function checkEnvVar(logger: Logger, name: string): boolean {
13+
const value = process.env[name];
14+
if (isDefined(value)) {
15+
logger.info(`Environment variable '${name}' is set to '${value}'.`);
16+
return true;
17+
} else {
18+
logger.debug(`Environment variable '${name}' is not set.`);
19+
return false;
20+
}
21+
}
22+
23+
/** Java-specific environment variables which may contain information about proxy settings. */
24+
export const JAVA_PROXY_ENV_VARS: JavaEnvVars[] = [
25+
JavaEnvVars.JAVA_TOOL_OPTIONS,
26+
JavaEnvVars.JDK_JAVA_OPTIONS,
27+
JavaEnvVars._JAVA_OPTIONS,
28+
];
29+
30+
/**
31+
* Checks whether any Java-specific environment variables which may contain proxy
32+
* configurations are set and logs their values if so.
33+
*/
34+
export function checkJavaEnvVars(logger: Logger) {
35+
for (const envVar of JAVA_PROXY_ENV_VARS) {
36+
checkEnvVar(logger, envVar);
37+
}
38+
}
39+
40+
/** Enumerates environment variable names which may contain information about proxy settings. */
41+
export enum ProxyEnvVars {
42+
HTTP_PROXY = "HTTP_PROXY",
43+
HTTPS_PROXY = "HTTPS_PROXY",
44+
ALL_PROXY = "ALL_PROXY",
45+
}
46+
47+
/**
48+
* Checks whether any proxy-related environment variables are set and logs their values if so.
49+
*/
50+
export function checkProxyEnvVars(logger: Logger) {
51+
// Both upper-case and lower-case variants of these environment variables are used.
52+
for (const envVar of Object.values(ProxyEnvVars)) {
53+
checkEnvVar(logger, envVar);
54+
checkEnvVar(logger, envVar.toLowerCase());
55+
}
56+
}
57+
58+
/**
59+
* Inspects environment variables and other configurations on the runner to determine whether
60+
* any settings that may affect the operation of the proxy are present. All relevant information
61+
* is written to the log.
62+
*
63+
* @param logger The logger to use.
64+
* @param language The enabled language, if known.
65+
*/
66+
export function checkProxyEnvironment(
67+
logger: Logger,
68+
language: Language | undefined,
69+
) {
70+
// Determine whether there is an existing proxy configured.
71+
checkProxyEnvVars(logger);
72+
73+
// Check language-specific configurations. If we don't know the language,
74+
// then we perform all checks.
75+
if (language === undefined || language === KnownLanguage.java) {
76+
checkJavaEnvVars(logger);
77+
}
78+
}

0 commit comments

Comments
 (0)