Skip to content

Instantly share code, notes, and snippets.

@tkawachi
Last active December 26, 2016 17:11
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tkawachi/54b33bd4f0d534c75c9e26d1d3284d03 to your computer and use it in GitHub Desktop.
Save tkawachi/54b33bd4f0d534c75c9e26d1d3284d03 to your computer and use it in GitHub Desktop.
import java.net.{HttpURLConnection, URI, URL}
import sbt.plugins.IvyPlugin
import sbt.{AllRequirements, AutoPlugin, Keys, Logger, MavenRepository, Patterns, PluginTrigger, Plugins, Resolver, URLRepository}
import scala.collection.mutable
import scala.util.control.NonFatal
object RedirectHackPlugin extends AutoPlugin {
private val redirectCache: mutable.Map[String, Option[String]] = mutable.Map.empty
override def trigger: PluginTrigger = AllRequirements
override def requires: Plugins = IvyPlugin
override def projectSettings = Seq(
Keys.fullResolvers := {
Keys.fullResolvers.value.map(resolveRedirectUrl(_, Keys.streams.value.log))
}
)
private def resolveRedirectUrl(r: Resolver, logger: Logger): Resolver = {
r match {
case MavenRepository(name, root) =>
findRedirectUrl(root, logger).map(MavenRepository(name, _)).getOrElse(r)
case URLRepository(name, patterns) =>
val ivyPatterns = patterns.ivyPatterns.map(p => findRedirectPattern(p, logger).getOrElse(p))
val ppp = patterns.artifactPatterns.map(p => findRedirectPattern(p, logger).getOrElse(p))
URLRepository(name, new Patterns(ivyPatterns, ppp, patterns.isMavenCompatible, patterns.descriptorOptional, patterns.skipConsistencyCheck))
case _ => r
}
}
private def findRedirectPattern(pattern: String, logger: Logger): Option[String] = {
val ary = pattern.split("\\[", 2)
findRedirectUrl(ary.head, logger).map(r => (Array(r) ++ ary.tail).mkString("["))
}
private def findRedirectUrl(root: String, logger: Logger) = {
redirectCache.getOrElseUpdate(root, {
new URL(root).openConnection() match {
case conn: HttpURLConnection =>
conn.setInstanceFollowRedirects(false)
conn.getResponseCode match {
case HttpURLConnection.HTTP_MOVED_PERM | HttpURLConnection.HTTP_MOVED_TEMP | HttpURLConnection.HTTP_SEE_OTHER =>
val location = Option(conn.getHeaderField("Location"))
.filter(isBintray)
location.foreach(l => logger.debug(s"Redirect: $root -> $l"))
location
case _ =>
None
}
case _ => None
}
})
}
private def isBintray(s: String): Boolean = {
try {
new URI(s).getHost == "dl.bintray.com"
} catch {
case NonFatal(_) => false
}
}
}
@tkawachi
Copy link
Author

dl.bintray.com へのリダイレクト時間を省略するために最初に fullResolvers を書き換えるハック

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment