Skip to content

Commit b8dcb4d

Browse files
committed
hook up
1 parent cf0ba75 commit b8dcb4d

File tree

1 file changed

+52
-0
lines changed
  • plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp

1 file changed

+52
-0
lines changed

plugins/amazonq/shared/jetbrains-community/src/software/aws/toolkits/jetbrains/services/amazonq/lsp/AmazonQLspService.kt

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ import com.intellij.openapi.util.Disposer
2020
import com.intellij.openapi.util.Key
2121
import com.intellij.openapi.util.SystemInfo
2222
import com.intellij.util.io.await
23+
import com.intellij.util.net.HttpConfigurable
24+
import com.intellij.util.net.JdkProxyProvider
25+
import io.ktor.util.network.hostname
2326
import kotlinx.coroutines.CoroutineScope
2427
import kotlinx.coroutines.Deferred
2528
import kotlinx.coroutines.TimeoutCancellationException
@@ -29,6 +32,7 @@ import kotlinx.coroutines.runBlocking
2932
import kotlinx.coroutines.sync.Mutex
3033
import kotlinx.coroutines.sync.withLock
3134
import kotlinx.coroutines.withTimeout
35+
import org.apache.http.client.utils.URIBuilder
3236
import org.eclipse.lsp4j.ClientCapabilities
3337
import org.eclipse.lsp4j.ClientInfo
3438
import org.eclipse.lsp4j.DidChangeConfigurationParams
@@ -45,6 +49,7 @@ import org.slf4j.event.Level
4549
import software.aws.toolkits.core.utils.getLogger
4650
import software.aws.toolkits.core.utils.info
4751
import software.aws.toolkits.core.utils.warn
52+
import software.aws.toolkits.core.utils.writeText
4853
import software.aws.toolkits.jetbrains.isDeveloperMode
4954
import software.aws.toolkits.jetbrains.services.amazonq.lsp.artifacts.ArtifactManager
5055
import software.aws.toolkits.jetbrains.services.amazonq.lsp.auth.DefaultAuthCredentialsService
@@ -54,6 +59,7 @@ import software.aws.toolkits.jetbrains.services.amazonq.lsp.model.createExtended
5459
import software.aws.toolkits.jetbrains.services.amazonq.lsp.textdocument.TextDocumentServiceHandler
5560
import software.aws.toolkits.jetbrains.services.amazonq.lsp.util.WorkspaceFolderUtil.createWorkspaceFolders
5661
import software.aws.toolkits.jetbrains.services.amazonq.lsp.workspace.WorkspaceServiceHandler
62+
import software.aws.toolkits.jetbrains.services.amazonq.profile.QEndpoints
5763
import software.aws.toolkits.jetbrains.services.telemetry.ClientMetadata
5864
import software.aws.toolkits.jetbrains.settings.LspSettings
5965
import java.io.IOException
@@ -62,7 +68,11 @@ import java.io.PipedInputStream
6268
import java.io.PipedOutputStream
6369
import java.io.PrintWriter
6470
import java.io.StringWriter
71+
import java.net.Proxy
72+
import java.net.URI
6573
import java.nio.charset.StandardCharsets
74+
import java.nio.file.Files
75+
import java.util.Base64
6676
import java.util.concurrent.Future
6777
import kotlin.time.Duration.Companion.seconds
6878

@@ -250,13 +260,55 @@ private class AmazonQServerInstance(private val project: Project, private val cs
250260
init {
251261
// will cause slow service init, but maybe fine for now. will not block UI since fetch/extract will be under background progress
252262
val artifact = runBlocking { ArtifactManager(project, manifestRange = null).fetchArtifact() }.toAbsolutePath()
263+
264+
// more slowness
265+
// make assumption that all requests will resolve to the same CA
266+
// also terrible assumption that default endpoint is reachable
267+
val qUri = URI(QEndpoints.Q_DEFAULT_SERVICE_CONFIG.ENDPOINT)
268+
val rtsTrustChain = TrustChainUtil.getTrustChain(qUri)
269+
val extraCaCerts = Files.createTempFile("q-extra-ca", ".pem").apply {
270+
writeText(
271+
buildList {
272+
rtsTrustChain.forEach {
273+
add("-----BEGIN CERTIFICATE-----")
274+
add(Base64.getMimeEncoder(64, System.lineSeparator().toByteArray()).encodeToString(it.encoded))
275+
add("-----END CERTIFICATE-----")
276+
}
277+
}.joinToString(separator = System.lineSeparator())
278+
)
279+
}
280+
253281
val node = if (SystemInfo.isWindows) "node.exe" else "node"
254282
val cmd = GeneralCommandLine(
255283
artifact.resolve(node).toString(),
256284
LspSettings.getInstance().getArtifactPath() ?: artifact.resolve("aws-lsp-codewhisperer.js").toString(),
257285
"--stdio",
258286
"--set-credentials-encryption-key",
287+
).withEnvironment(
288+
buildMap {
289+
put("NODE_EXTRA_CA_CERTS", extraCaCerts.toAbsolutePath().toString())
290+
291+
val proxy = JdkProxyProvider.getInstance().proxySelector.select(qUri)
292+
// log if only socks proxy available
293+
.firstOrNull { it.type() == Proxy.Type.HTTP }
294+
295+
if (proxy != null) {
296+
val address = proxy.address()
297+
if (address is java.net.InetSocketAddress) {
298+
put(
299+
"HTTPS_PROXY",
300+
URIBuilder("http://${address.hostname}:${address.port}").apply {
301+
val login = HttpConfigurable.getInstance().proxyLogin
302+
if (login != null) {
303+
setUserInfo(login, HttpConfigurable.getInstance().plainProxyPassword)
304+
}
305+
}.build().toASCIIString()
306+
)
307+
}
308+
}
309+
}
259310
)
311+
.withParentEnvironmentType(GeneralCommandLine.ParentEnvironmentType.CONSOLE)
260312

261313
launcherHandler = KillableColoredProcessHandler.Silent(cmd)
262314
val inputWrapper = LSPProcessListener()

0 commit comments

Comments
 (0)