From e9416db9e757ba77c19aa6fec81773bf433ed582 Mon Sep 17 00:00:00 2001 From: Dmitry Zhuravlev Date: Tue, 14 Jun 2016 15:56:32 +0300 Subject: [PATCH] * proxy handling improved for repositories defined in transitive dependencies. proxy config now looks like: mycompany.com 3128 http localhost mycompany.com 3128 https localhost --- .../kotlin/com/beust/kobalt/BuildScript.kt | 2 +- .../kobalt/internal/KobaltSettingsXml.kt | 20 +++++++++++++++---- .../kotlin/com/beust/kobalt/maven/Http.kt | 4 ++-- .../com/beust/kobalt/maven/aether/Aether.kt | 15 +++++++++----- .../com/beust/kobalt/maven/aether/Booter.kt | 5 +++-- .../aether/MavenRepositorySystemUtils.kt | 11 +++++++++- .../com/beust/kobalt/misc/GithubApi2.kt | 2 +- 7 files changed, 43 insertions(+), 16 deletions(-) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt index e1f4405f..d4d67889 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/BuildScript.kt @@ -32,7 +32,7 @@ fun plugins(vararg dependencies : String) { } } -data class ProxyConfig(var host: String = "", var port: Int = 0, val type: String = "") { +data class ProxyConfig(val host: String = "", val port: Int = 0, val type: String = "", val nonProxyHosts: String = "") { fun toProxy() = java.net.Proxy(java.net.Proxy.Type.HTTP, InetSocketAddress(host, port)) fun toAetherProxy() = Proxy(type, host, port) // TODO make support for proxy auth diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltSettingsXml.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltSettingsXml.kt index 7bc02011..b803393e 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltSettingsXml.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/internal/KobaltSettingsXml.kt @@ -23,8 +23,8 @@ class KobaltSettingsXml { @XmlElement(name = "default-repos") @JvmField var defaultRepos: DefaultReposXml? = null - @XmlElement(name = "proxy") @JvmField - var proxy: ProxyXml? = null + @XmlElement(name = "proxies") @JvmField + var proxies: ProxiesXml? = null @XmlElement(name = "kobalt-compiler-version") @JvmField var kobaltCompilerVersion: String = "1.0.0" @@ -33,6 +33,11 @@ class KobaltSettingsXml { var kobaltCompilerRepo: String? = null } +class ProxiesXml { + @XmlElement @JvmField + var proxy: List = arrayListOf() +} + class ProxyXml { @XmlElement @JvmField var host: String = "" @@ -42,6 +47,9 @@ class ProxyXml { @XmlElement @JvmField var type: String = "" + + @XmlElement @JvmField + var nonProxyHosts: String = "" } class DefaultReposXml { @@ -49,6 +57,8 @@ class DefaultReposXml { var repo: List = arrayListOf() } +fun List.getProxy(protocol:String) = find { it.type==protocol } + /** * The object Kobalt refers to for settings. */ @@ -61,7 +71,7 @@ class KobaltSettings @Inject constructor(val xmlFile: KobaltSettingsXml) { val defaultRepos = xmlFile.defaultRepos?.repo - val proxyConfig = with(xmlFile.proxy) { + val proxyConfigs = with(xmlFile.proxies?.proxy) { fun toIntOr(s: String, defaultValue: Int) = try { //TODO can be extracted to some global Utils s.toInt() } catch(e: NumberFormatException) { @@ -69,7 +79,9 @@ class KobaltSettings @Inject constructor(val xmlFile: KobaltSettingsXml) { } if (this != null) { - ProxyConfig(host, toIntOr(port, 0), type) + map {proxyXml-> + ProxyConfig(proxyXml.host, toIntOr(proxyXml.port, 0), proxyXml.type, proxyXml.nonProxyHosts) + } } else null } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/Http.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/Http.kt index 72feefc3..672d10b2 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/Http.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/Http.kt @@ -21,7 +21,7 @@ class Http @Inject constructor(val settings:KobaltSettings) { } fun get(user: String?, password: String?, url: String) : Response { - val client = OkHttpClient.Builder().proxy(settings.proxyConfig?.toProxy()).build() + val client = OkHttpClient.Builder().proxy(settings.proxyConfigs?.firstOrNull()?.toProxy()).build() val request = Request.Builder().url(url) if (user != null) { request.header("Authorization", Credentials.basic(user, password)) @@ -75,7 +75,7 @@ class Http @Inject constructor(val settings:KobaltSettings) { .build() log(2, "Uploading $file to $url") - val response = OkHttpClient.Builder().proxy(settings.proxyConfig?.toProxy()).build().newCall(request).execute() + val response = OkHttpClient.Builder().proxy(settings.proxyConfigs?.firstOrNull()?.toProxy()).build().newCall(request).execute() if (! response.isSuccessful) { error(response) } else { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt index 86b569bd..5bd6edfc 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Aether.kt @@ -6,6 +6,7 @@ import com.beust.kobalt.api.Kobalt import com.beust.kobalt.homeDir import com.beust.kobalt.internal.KobaltSettings import com.beust.kobalt.internal.KobaltSettingsXml +import com.beust.kobalt.internal.getProxy import com.beust.kobalt.maven.CompletedFuture import com.beust.kobalt.maven.MavenId import com.beust.kobalt.misc.KobaltLogger @@ -73,17 +74,21 @@ class ExcludeOptionalDependencyFilter: DependencyFilter { @Singleton class Aether(val localRepo: File, val settings: KobaltSettings) { private val system = Booter.newRepositorySystem() - private val session = Booter.newRepositorySystemSession(system, localRepo) + private val session = Booter.newRepositorySystemSession(system, localRepo, settings) private val classpathFilter = AndDependencyFilter( ExcludeOptionalDependencyFilter(), DependencyFilterUtils.classpathFilter(JavaScopes.COMPILE)) private val kobaltRepositories : List - get() = Kobalt.repos.map { - RemoteRepository.Builder("maven", "default", it.url) - .setProxy(settings.proxyConfig?.toAetherProxy()) + get() = Kobalt.repos.map { + RemoteRepository.Builder("maven", "default", it.url) // .setSnapshotPolicy(RepositoryPolicy(false, null, null)) - .build() + .build().let { repository -> + val proxyConfigs = settings.proxyConfigs ?: return@map repository + RemoteRepository.Builder(repository).apply { + setProxy(proxyConfigs.getProxy(repository.protocol)?.toAetherProxy()) + }.build() } + } private fun collectRequest(artifact: Artifact) : CollectRequest { with(CollectRequest()) { diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt index ac6fee3e..884c3977 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/Booter.kt @@ -1,5 +1,6 @@ package com.beust.kobalt.maven.aether +import com.beust.kobalt.internal.KobaltSettings import org.eclipse.aether.DefaultRepositorySystemSession import org.eclipse.aether.RepositorySystem import org.eclipse.aether.repository.LocalRepository @@ -14,8 +15,8 @@ object Booter { // return org.eclipse.aether.examples.plexus.PlexusRepositorySystemFactory.newRepositorySystem(); } - fun newRepositorySystemSession(system: RepositorySystem, repo: File): DefaultRepositorySystemSession { - val session = MavenRepositorySystemUtils.newSession() + fun newRepositorySystemSession(system: RepositorySystem, repo: File, settings: KobaltSettings): DefaultRepositorySystemSession { + val session = MavenRepositorySystemUtils.newSession(settings) val localRepo = LocalRepository(repo.absolutePath) session.localRepositoryManager = system.newLocalRepositoryManager(session, localRepo) diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/MavenRepositorySystemUtils.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/MavenRepositorySystemUtils.kt index 2b6688a9..1b8a5e0f 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/MavenRepositorySystemUtils.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/maven/aether/MavenRepositorySystemUtils.kt @@ -1,5 +1,6 @@ package com.beust.kobalt.maven.aether +import com.beust.kobalt.internal.KobaltSettings import org.apache.maven.repository.internal.* import org.eclipse.aether.DefaultRepositorySystemSession import org.eclipse.aether.artifact.DefaultArtifactType @@ -12,6 +13,7 @@ import org.eclipse.aether.util.graph.selector.OptionalDependencySelector import org.eclipse.aether.util.graph.selector.ScopeDependencySelector import org.eclipse.aether.util.graph.transformer.* import org.eclipse.aether.util.graph.traverser.FatArtifactTraverser +import org.eclipse.aether.util.repository.DefaultProxySelector import org.eclipse.aether.util.repository.SimpleArtifactDescriptorPolicy object MavenRepositorySystemUtils { @@ -26,7 +28,7 @@ object MavenRepositorySystemUtils { return locator } - fun newSession(): DefaultRepositorySystemSession { + fun newSession(settings: KobaltSettings): DefaultRepositorySystemSession { val session = DefaultRepositorySystemSession() val depTraverser = FatArtifactTraverser() session.dependencyTraverser = depTraverser @@ -55,6 +57,13 @@ object MavenRepositorySystemUtils { val sysProps = System.getProperties() session.setSystemProperties(sysProps) session.setConfigProperties(sysProps) + settings.proxyConfigs?.let { proxyConfigs-> + session.proxySelector = DefaultProxySelector().apply { + proxyConfigs.forEach {config-> + add(config.toAetherProxy(), config.nonProxyHosts) + } + } + } return session } } diff --git a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/GithubApi2.kt b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/GithubApi2.kt index b4bf9018..ad9b2095 100644 --- a/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/GithubApi2.kt +++ b/modules/kobalt-plugin-api/src/main/kotlin/com/beust/kobalt/misc/GithubApi2.kt @@ -59,7 +59,7 @@ class GithubApi2 @Inject constructor( // Read only Api // private val service = Retrofit.Builder() - .client(OkHttpClient.Builder().proxy(settings.proxyConfig?.toProxy()).build()) + .client(OkHttpClient.Builder().proxy(settings.proxyConfigs?.firstOrNull()?.toProxy()).build()) .baseUrl("https://api.github.com") .addConverterFactory(GsonConverterFactory.create()) .build()