From e97f352fe86ad4a4c772538a944c4da749a74448 Mon Sep 17 00:00:00 2001 From: Tim Underwood Date: Tue, 28 Nov 2017 14:14:15 -0800 Subject: [PATCH] Regions.fromName will throw an exception if the region is invalid which is not what we want since getRegionNameFromURL can return invalid region names --- src/main/scala/fm/sbt/S3URLHandler.scala | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/scala/fm/sbt/S3URLHandler.scala b/src/main/scala/fm/sbt/S3URLHandler.scala index d55242f..8f63363 100644 --- a/src/main/scala/fm/sbt/S3URLHandler.scala +++ b/src/main/scala/fm/sbt/S3URLHandler.scala @@ -30,6 +30,7 @@ import com.amazonaws.services.securitytoken.model.{AssumeRoleRequest, AssumeRole import org.apache.ivy.util.url.URLHandler import org.apache.ivy.util.{CopyProgressEvent, CopyProgressListener, Message} import scala.collection.JavaConverters._ +import scala.util.Try import scala.util.matching.Regex object S3URLHandler { @@ -376,11 +377,20 @@ final class S3URLHandler extends URLHandler { // Try to get the region of the S3 URL so we can set it on the S3Client def getRegion(url: URL, bucket: String/*, client: AmazonS3*/): Regions = { - val region: Option[String] = getRegionNameFromURL(url) orElse getRegionNameFromDNS(bucket) orElse Option(Regions.getCurrentRegion()).map{ _.getName } + getRegionNameFromURL(url).toOptionalRegion orElse + getRegionNameFromDNS(bucket).toOptionalRegion orElse + Option(Regions.getCurrentRegion()).map{ _.getName }.toOptionalRegion getOrElse + Regions.DEFAULT_REGION + } - region.map{ Regions.fromName }.flatMap{ Option(_) } getOrElse Regions.DEFAULT_REGION + private implicit class RichStringOption(s: Option[String]) { + def toOptionalRegion: Option[Regions] = s.flatMap{ _.toOptionalRegion } } - + + private implicit class RichString(s: String) { + def toOptionalRegion: Option[Regions] = Try{ Regions.fromName(s) }.toOption + } + def getRegionNameFromURL(url: URL): Option[String] = { // We'll try the AmazonS3URI parsing first then fallback to our RegionMatcher getAmazonS3URI(url).map{ _.getRegion }.flatMap{ Option(_) } orElse RegionMatcher.findFirstIn(url.toString)