Skip to content

Commit

Permalink
Add URL & URI ConfigLoaders (#8697)
Browse files Browse the repository at this point in the history
Allow to parse URL and URI directly from play.api.Configuration
  • Loading branch information
aaabramov authored and gmethvin committed Oct 13, 2018
1 parent a07463c commit 1fe0c8b
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
package play.api

import java.io._
import java.net.{ URI, URL }
import java.util.Properties
import java.util.concurrent.TimeUnit

import com.typesafe.config._
import com.typesafe.config.impl.ConfigImpl
import play.api.mvc.Cookie.SameSite
import play.twirl.api.utils.StringEscapeUtils
import play.utils.PlayIO

Expand Down Expand Up @@ -1078,6 +1078,9 @@ object ConfigLoader {
implicit val configurationLoader: ConfigLoader[Configuration] = configLoader.map(Configuration(_))
implicit val seqConfigurationLoader: ConfigLoader[Seq[Configuration]] = seqConfigLoader.map(_.map(Configuration(_)))

implicit val urlLoader: ConfigLoader[URL] = ConfigLoader(_.getString).map(new URL(_))
implicit val uriLoader: ConfigLoader[URI] = ConfigLoader(_.getString).map(new URI(_))

private def javaDurationToScala(javaDuration: java.time.Duration): FiniteDuration =
Duration.fromNanos(javaDuration.toNanos)

Expand Down
40 changes: 40 additions & 0 deletions framework/src/play/src/test/scala/play/api/ConfigurationSpec.scala
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,10 @@
package play.api

import java.io._
import java.net.{ MalformedURLException, URI, URISyntaxException, URL }

import com.typesafe.config.{ ConfigException, ConfigFactory }
import org.specs2.execute.FailureException
import org.specs2.mutable.Specification

import scala.util.control.NonFatal
Expand Down Expand Up @@ -73,6 +75,44 @@ class ConfigurationSpec extends Specification {

}

"support getting URLs" in {

val validUrl = "https://example.com"
val invalidUrl = "invalid-url"

"valid URL" in {
val conf = config("my.url" -> validUrl)
val value = conf.get[URL]("my.url")
value must beEqualTo(new URL(validUrl))
}

"invalid URL" in {
val conf = config("my.url" -> invalidUrl)
def a: Nothing = { conf.get[URL]("my.url"); throw FailureException(failure("MalformedURLException should be thrown")) }
theBlock(a) must throwA[MalformedURLException]
}

}

"support getting URIs" in {

val validUri = "https://example.com"
val invalidUri = "%"

"valid URI" in {
val conf = config("my.uri" -> validUri)
val value = conf.get[URI]("my.uri")
value must beEqualTo(new URI(validUri))
}

"invalid URI" in {
val conf = config("my.uri" -> invalidUri)
def a: Nothing = { conf.get[URI]("my.uri"); throw FailureException(failure("URISyntaxException should be thrown")) }
theBlock(a) must throwA[URISyntaxException]
}

}

"support getting optional values via get[Option[...]]" in {
"when null" in {
config("foo.bar" -> null).get[Option[String]]("foo.bar") must beNone
Expand Down

0 comments on commit 1fe0c8b

Please sign in to comment.