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