Last active
December 26, 2016 17:11
-
-
Save tkawachi/54b33bd4f0d534c75c9e26d1d3284d03 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
dl.bintray.com へのリダイレクト時間を省略するために最初に fullResolvers を書き換えるハック