Skip to content

Commit 7bac621

Browse files
authored
fix: sanitize proxy settings + add NO_PROXY support + add unit tests (#7238)
Previously, proxy settings parsing was very "garbage-in, garbage-out". Since the HttpConfigurable class was written in Java, some settings could be null. We didn’t guard against that and simply concatenated proxy + port, which sometimes produced invalid values like "null:8080". The implementation has been updated to sanitize + skip entries that cannot be used as env vars. In the worst case, the result is simply an empty map and the process env vars are unaffected.
1 parent e31f2f4 commit 7bac621

File tree

3 files changed

+79
-9
lines changed

3 files changed

+79
-9
lines changed

extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/continue/process/ContinueBinaryProcess.kt

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package com.github.continuedev.continueintellijextension.`continue`.process
22

3-
import com.github.continuedev.continueintellijextension.proxy.ProxySettings
4-
import com.github.continuedev.continueintellijextension.error.ContinueSentryService
53
import com.github.continuedev.continueintellijextension.error.ContinuePostHogService
4+
import com.github.continuedev.continueintellijextension.error.ContinueSentryService
5+
import com.github.continuedev.continueintellijextension.proxy.ProxySettings
66
import com.github.continuedev.continueintellijextension.utils.OS
77
import com.github.continuedev.continueintellijextension.utils.getContinueBinaryPath
88
import com.github.continuedev.continueintellijextension.utils.getOS
@@ -34,9 +34,7 @@ class ContinueBinaryProcess(
3434
}
3535

3636
val builder = ProcessBuilder(path)
37-
val proxySettings = ProxySettings.getSettings()
38-
if (proxySettings.enabled)
39-
builder.environment() += "HTTP_PROXY" to proxySettings.proxy
37+
builder.environment() += ProxySettings.getSettings().toContinueEnvVars()
4038
return builder
4139
.directory(File(path).parentFile)
4240
.start()

extensions/intellij/src/main/kotlin/com/github/continuedev/continueintellijextension/proxy/ProxySettings.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,32 @@ package com.github.continuedev.continueintellijextension.proxy
33
import com.intellij.util.net.HttpConfigurable
44

55
data class ProxySettings(
6-
val enabled: Boolean,
7-
val proxy: String,
6+
private val enabled: Boolean,
7+
private val proxy: String?,
8+
private val noProxy: String?
89
) {
10+
fun toContinueEnvVars(): Map<String, String> {
11+
if (!enabled)
12+
return emptyMap()
13+
val env = mutableMapOf<String, String>()
14+
proxy?.let { env["HTTP_PROXY"] = it }
15+
noProxy?.let { env["NO_PROXY"] = it }
16+
return env.filterValues { it.isNotBlank() }
17+
}
918

1019
companion object {
1120
fun getSettings(): ProxySettings {
1221
val settings = HttpConfigurable.getInstance()
22+
val validProxyOrNull =
23+
if (settings.PROXY_HOST != null && settings.PROXY_HOST.isNotBlank())
24+
"${settings.PROXY_HOST}:${settings.PROXY_PORT}"
25+
else
26+
null
1327
return ProxySettings(
1428
enabled = settings.USE_HTTP_PROXY,
15-
proxy = "${settings.PROXY_HOST}:${settings.PROXY_PORT}"
29+
proxy = validProxyOrNull,
30+
noProxy = settings.PROXY_EXCEPTIONS
1631
)
1732
}
1833
}
19-
2034
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.github.continuedev.continueintellijextension.unit
2+
3+
import com.github.continuedev.continueintellijextension.proxy.ProxySettings
4+
import com.intellij.testFramework.fixtures.BasePlatformTestCase
5+
import com.intellij.util.net.HttpConfigurable
6+
7+
class ProxySettingsTest : BasePlatformTestCase() {
8+
9+
fun `test enabled proxy config`() {
10+
HttpConfigurable.getInstance().apply {
11+
USE_HTTP_PROXY = true
12+
PROXY_HOST = "127.0.0.1"
13+
PROXY_PORT = 80
14+
PROXY_EXCEPTIONS = "*.example.com, 192.168.*"
15+
}
16+
val settingsMap = ProxySettings.getSettings().toContinueEnvVars()
17+
assertEquals(
18+
mapOf(
19+
"HTTP_PROXY" to "127.0.0.1:80",
20+
"NO_PROXY" to "*.example.com, 192.168.*"
21+
), settingsMap
22+
)
23+
}
24+
25+
fun `test disabled proxy ignores other settings`() {
26+
HttpConfigurable.getInstance().apply {
27+
USE_HTTP_PROXY = false
28+
PROXY_HOST = "127.0.0.1"
29+
PROXY_PORT = 80
30+
PROXY_EXCEPTIONS = "*.example.com, 192.168.*"
31+
}
32+
val settingsMap = ProxySettings.getSettings().toContinueEnvVars()
33+
assertEquals(emptyMap<String, String>(), settingsMap)
34+
}
35+
36+
fun `test enabled proxy config with null values`() {
37+
HttpConfigurable.getInstance().apply {
38+
USE_HTTP_PROXY = true
39+
PROXY_HOST = null
40+
PROXY_PORT = 80
41+
PROXY_EXCEPTIONS = null
42+
}
43+
val settingsMap = ProxySettings.getSettings().toContinueEnvVars()
44+
assertEquals(emptyMap<String, String>(), settingsMap)
45+
}
46+
47+
fun `test enabled proxy config with blank values`() {
48+
HttpConfigurable.getInstance().apply {
49+
USE_HTTP_PROXY = true
50+
PROXY_HOST = ""
51+
PROXY_PORT = 80
52+
PROXY_EXCEPTIONS = ""
53+
}
54+
val settingsMap = ProxySettings.getSettings().toContinueEnvVars()
55+
assertEquals(emptyMap<String, String>(), settingsMap)
56+
}
57+
58+
}

0 commit comments

Comments
 (0)