diff --git a/akka-docs/rst/java/stream/migration-guide-2.0-2.4-java.rst b/akka-docs/rst/java/stream/migration-guide-2.0-2.4-java.rst index b723028d99..8867effbc2 100644 --- a/akka-docs/rst/java/stream/migration-guide-2.0-2.4-java.rst +++ b/akka-docs/rst/java/stream/migration-guide-2.0-2.4-java.rst @@ -132,3 +132,15 @@ Please consult the :class:`GraphStage` documentation (:ref:`graphstage-java`) an on migrating from :class:`AsyncStage` to :class:`GraphStage`. .. _`previous migration guide`: http://doc.akka.io/docs/akka-stream-and-http-experimental/2.0.2/java/migration-guide-1.0-2.x-java.html#AsyncStage_has_been_replaced_by_GraphStage + + +Changes in Akka HTTP +==================== + +Routing settings parameter name +------------------------------- + +``RoutingSettings`` were previously the only setting available on ``RequestContext``, +and were accessible via ``settings``. We now made it possible to configure the parsers +settings as well, so ``RoutingSettings`` is now ``routingSettings`` and ``ParserSettings`` is +now accessible via ``parserSettings``. \ No newline at end of file diff --git a/akka-docs/rst/scala/code/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala b/akka-docs/rst/scala/code/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala index ece31eaa4d..e4271de6aa 100644 --- a/akka-docs/rst/scala/code/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala +++ b/akka-docs/rst/scala/code/docs/http/scaladsl/server/directives/BasicDirectivesExamplesSpec.scala @@ -12,6 +12,7 @@ import akka.http.scaladsl.model._ import akka.http.scaladsl.model.headers.{ Server, RawHeader } import akka.http.scaladsl.server.RouteResult.{ Complete, Rejected } import akka.http.scaladsl.server._ +import akka.http.scaladsl.settings.RoutingSettings import akka.stream.ActorMaterializer import akka.stream.scaladsl.{ FileIO, Sink, Source } import akka.util.ByteString @@ -183,7 +184,7 @@ class BasicDirectivesExamplesSpec extends RoutingSpec { } "withSettings-0" in compileOnlySpec { //#withSettings-0 - val special = RoutingSettingsImpl(system).copy(fileIODispatcher = "special-io-dispatcher") + val special = RoutingSettings(system).withFileIODispatcher("special-io-dispatcher") def sample() = path("sample") { @@ -687,7 +688,7 @@ class BasicDirectivesExamplesSpec extends RoutingSpec { "extractSettings-examples" in { //#extractSettings-examples val route = - extractSettings { settings: RoutingSettingsImpl => + extractSettings { settings: RoutingSettings => complete(s"RoutingSettings.renderVanityFooter = ${settings.renderVanityFooter}") } @@ -700,12 +701,12 @@ class BasicDirectivesExamplesSpec extends RoutingSpec { "mapSettings-examples" in { //#mapSettings-examples val tunedSettings = mapSettings { settings => - settings.copy(fileGetConditional = false) + settings.withFileGetConditional(false) } val route = tunedSettings { - extractSettings { settings: RoutingSettingsImpl => + extractSettings { settings: RoutingSettings => complete(s"RoutingSettings.fileGetConditional = ${settings.fileGetConditional}") } } diff --git a/akka-docs/rst/scala/stream/migration-guide-2.0-2.4-scala.rst b/akka-docs/rst/scala/stream/migration-guide-2.0-2.4-scala.rst index 6df6c4d9af..d63b692a73 100644 --- a/akka-docs/rst/scala/stream/migration-guide-2.0-2.4-scala.rst +++ b/akka-docs/rst/scala/stream/migration-guide-2.0-2.4-scala.rst @@ -87,7 +87,7 @@ Routing settings parameter name ``RoutingSettings`` were previously the only setting available on ``RequestContext``, and were accessible via ``settings``. We now made it possible to configure the parsers -settings as well, so ``RoutingSettings`` is now ``routingSettings`` and ``ParserSetttings`` is +settings as well, so ``RoutingSettings`` is now ``routingSettings`` and ``ParserSettings`` is now accessible via ``parserSettings``. Changed Sources / Sinks diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/RoutingSettingsImpl.scala b/akka-http-core/src/main/scala/akka/http/impl/settings/RoutingSettingsImpl.scala similarity index 88% rename from akka-http/src/main/scala/akka/http/scaladsl/server/RoutingSettingsImpl.scala rename to akka-http-core/src/main/scala/akka/http/impl/settings/RoutingSettingsImpl.scala index fb88469005..8e7462179d 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/RoutingSettingsImpl.scala +++ b/akka-http-core/src/main/scala/akka/http/impl/settings/RoutingSettingsImpl.scala @@ -2,11 +2,10 @@ * Copyright (C) 2009-2014 Typesafe Inc. */ -package akka.http.scaladsl.server +package akka.http.impl.settings -import com.typesafe.config.Config -import akka.actor.ActorRefFactory import akka.http.impl.util._ +import com.typesafe.config.Config /** INTERNAL API */ final case class RoutingSettingsImpl( @@ -16,7 +15,7 @@ final case class RoutingSettingsImpl( rangeCountLimit: Int, rangeCoalescingThreshold: Long, decodeMaxBytesPerChunk: Int, - fileIODispatcher: String) + fileIODispatcher: String) extends akka.http.scaladsl.settings.RoutingSettings object RoutingSettingsImpl extends SettingsCompanion[RoutingSettingsImpl]("akka.http.routing") { def fromSubConfig(root: Config, c: Config) = new RoutingSettingsImpl( diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ClientConnectionSettings.scala b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ClientConnectionSettings.scala index 7005cd2db7..dbf2a7f16b 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ClientConnectionSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ClientConnectionSettings.scala @@ -15,7 +15,10 @@ import scala.collection.JavaConverters._ import scala.compat.java8.OptionConverters._ import scala.concurrent.duration.{ Duration, FiniteDuration } -abstract class ClientConnectionSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ClientConnectionSettings private[akka] () { self: ClientConnectionSettingsImpl ⇒ def getUserAgentHeader: Optional[UserAgent] def getConnectingTimeout: FiniteDuration def getIdleTimeout: Duration @@ -34,8 +37,6 @@ abstract class ClientConnectionSettings { def withSocketOptions(newValue: java.lang.Iterable[SocketOption]): ClientConnectionSettings = self.copy(socketOptions = newValue.asScala.toList) def withParserSettings(newValue: ParserSettings): ClientConnectionSettings = self.copy(parserSettings = newValue.asScala) - /** INTERNAL API: safe by construction */ - protected val self = this.asInstanceOf[ClientConnectionSettingsImpl] } object ClientConnectionSettings extends SettingsCompanion[ClientConnectionSettings] { diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ConnectionPoolSettings.scala b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ConnectionPoolSettings.scala index c380f4396e..5f14c49432 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ConnectionPoolSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ConnectionPoolSettings.scala @@ -9,7 +9,10 @@ import com.typesafe.config.Config import scala.concurrent.duration.Duration import akka.http.impl.util.JavaMapping.Implicits._ -abstract class ConnectionPoolSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ConnectionPoolSettings private[akka] () { self: ConnectionPoolSettingsImpl ⇒ def getMaxConnections: Int def getMaxRetries: Int def getMaxOpenRequests: Int @@ -25,9 +28,6 @@ abstract class ConnectionPoolSettings { def withPipeliningLimit(newValue: Int): ConnectionPoolSettings = self.copy(pipeliningLimit = newValue) def withIdleTimeout(newValue: Duration): ConnectionPoolSettings = self.copy(idleTimeout = newValue) def withConnectionSettings(newValue: ClientConnectionSettings): ConnectionPoolSettings = self.copy(connectionSettings = newValue.asScala) - - /** INTERNAL API */ - protected def self = this.asInstanceOf[ConnectionPoolSettingsImpl] } object ConnectionPoolSettings extends SettingsCompanion[ConnectionPoolSettings] { diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ParserSettings.scala b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ParserSettings.scala index d21bcc94b4..888dfdaadd 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ParserSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ParserSettings.scala @@ -16,7 +16,10 @@ import scala.compat.java8.OptionConverters import akka.http.javadsl.model.{ HttpMethod, StatusCode, Uri } import com.typesafe.config.Config -abstract class ParserSettings extends BodyPartParser.Settings { +/** + * Public API but not intended for subclassing + */ +abstract class ParserSettings private[akka] () extends BodyPartParser.Settings { self: ParserSettingsImpl ⇒ def getMaxUriLength: Int def getMaxMethodLength: Int def getMaxResponseReasonLength: Int @@ -56,17 +59,17 @@ abstract class ParserSettings extends BodyPartParser.Settings { // special --- + @varargs def withCustomMethods(methods: HttpMethod*): ParserSettings = { val map = methods.map(m ⇒ m.name -> m.asScala).toMap self.copy(customMethods = map.get) } + @varargs def withCustomStatusCodes(codes: StatusCode*): ParserSettings = { val map = codes.map(c ⇒ c.intValue -> c.asScala).toMap self.copy(customStatusCodes = map.get) } - /** INTERNAL API */ - protected def self = this.asInstanceOf[ParserSettingsImpl] } object ParserSettings extends SettingsCompanion[ParserSettings] { diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/settings/RoutingSettings.scala b/akka-http-core/src/main/scala/akka/http/javadsl/settings/RoutingSettings.scala new file mode 100644 index 0000000000..2850c42592 --- /dev/null +++ b/akka-http-core/src/main/scala/akka/http/javadsl/settings/RoutingSettings.scala @@ -0,0 +1,33 @@ +/* + * Copyright (C) 2016 Typesafe Inc. + */ +package akka.http.javadsl.settings + +import akka.http.impl.settings.RoutingSettingsImpl +import com.typesafe.config.Config + +/** + * Public API but not intended for subclassing + */ +abstract class RoutingSettings private[akka] () { self: RoutingSettingsImpl ⇒ + def getVerboseErrorMessages: Boolean + def getFileGetConditional: Boolean + def getRenderVanityFooter: Boolean + def getRangeCountLimit: Int + def getRangeCoalescingThreshold: Long + def getDecodeMaxBytesPerChunk: Int + def getFileIODispatcher: String + + def withVerboseErrorMessages(verboseErrorMessages: Boolean): RoutingSettings = self.copy(verboseErrorMessages = verboseErrorMessages) + def withFileGetConditional(fileGetConditional: Boolean): RoutingSettings = self.copy(fileGetConditional = fileGetConditional) + def withRenderVanityFooter(renderVanityFooter: Boolean): RoutingSettings = self.copy(renderVanityFooter = renderVanityFooter) + def withRangeCountLimit(rangeCountLimit: Int): RoutingSettings = self.copy(rangeCountLimit = rangeCountLimit) + def withRangeCoalescingThreshold(rangeCoalescingThreshold: Long): RoutingSettings = self.copy(rangeCoalescingThreshold = rangeCoalescingThreshold) + def withDecodeMaxBytesPerChunk(decodeMaxBytesPerChunk: Int): RoutingSettings = self.copy(decodeMaxBytesPerChunk = decodeMaxBytesPerChunk) + def withFileIODispatcher(fileIODispatcher: String): RoutingSettings = self.copy(fileIODispatcher = fileIODispatcher) +} + +object RoutingSettings extends SettingsCompanion[RoutingSettings] { + override def create(config: Config): RoutingSettings = RoutingSettingsImpl(config) + override def create(configOverrides: String): RoutingSettings = RoutingSettingsImpl(configOverrides) +} diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ServerSettings.scala b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ServerSettings.scala index 9b0b7fe078..f835a2c2e0 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/settings/ServerSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/settings/ServerSettings.scala @@ -15,7 +15,10 @@ import scala.compat.java8.OptionConverters._ import scala.concurrent.duration.{ Duration, FiniteDuration } -abstract class ServerSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ServerSettings { self: ServerSettingsImpl ⇒ def getServerHeader: Optional[Server] def getTimeouts: ServerSettings.Timeouts def getMaxConnections: Int @@ -48,8 +51,6 @@ abstract class ServerSettings { def withParserSettings(newValue: ParserSettings): ServerSettings = self.copy(parserSettings = newValue.asScala) def withWebsocketRandomFactory(newValue: java.util.function.Supplier[Random]): ServerSettings = self.copy(websocketRandomFactory = () ⇒ newValue.get()) - /** INTERNAL API */ - protected def self = this.asInstanceOf[ServerSettingsImpl] } object ServerSettings { diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ClientConnectionSettings.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ClientConnectionSettings.scala index 4c9a61118f..38eafe73a1 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ClientConnectionSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ClientConnectionSettings.scala @@ -20,7 +20,10 @@ import scala.compat.java8.OptionConverters import scala.concurrent.duration.{ FiniteDuration, Duration } import scala.collection.JavaConverters._ -abstract class ClientConnectionSettings extends akka.http.javadsl.settings.ClientConnectionSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ClientConnectionSettings private[akka] () extends akka.http.javadsl.settings.ClientConnectionSettings { self: ClientConnectionSettingsImpl ⇒ def userAgentHeader: Option[`User-Agent`] def connectingTimeout: FiniteDuration def idleTimeout: Duration diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ConnectionPoolSettings.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ConnectionPoolSettings.scala index 71954c8a07..dc58f8eebc 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ConnectionPoolSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ConnectionPoolSettings.scala @@ -3,14 +3,16 @@ */ package akka.http.scaladsl.settings -import akka.actor.ActorSystem import akka.http.impl.settings.ConnectionPoolSettingsImpl import akka.http.javadsl.{ settings ⇒ js } import com.typesafe.config.Config import scala.concurrent.duration.Duration -abstract class ConnectionPoolSettings extends js.ConnectionPoolSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ConnectionPoolSettings extends js.ConnectionPoolSettings { self: ConnectionPoolSettingsImpl ⇒ def maxConnections: Int def maxRetries: Int def maxOpenRequests: Int diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ParserSettings.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ParserSettings.scala index fabbd228c8..8c04d18b3a 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ParserSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ParserSettings.scala @@ -19,7 +19,10 @@ import scala.annotation.varargs import scala.collection.JavaConverters._ import scala.compat.java8.OptionConverters -abstract class ParserSettings extends akka.http.javadsl.settings.ParserSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ParserSettings private[akka] () extends akka.http.javadsl.settings.ParserSettings { self: ParserSettingsImpl ⇒ def maxUriLength: Int def maxMethodLength: Int def maxResponseReasonLength: Int diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/RoutingSettings.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/RoutingSettings.scala new file mode 100644 index 0000000000..87c2461e6c --- /dev/null +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/RoutingSettings.scala @@ -0,0 +1,43 @@ +/* + * Copyright (C) 2016 Typesafe Inc. + */ +package akka.http.scaladsl.settings + +import akka.http.impl.settings.RoutingSettingsImpl +import com.typesafe.config.Config + +/** + * Public API but not intended for subclassing + */ +abstract class RoutingSettings private[akka] () extends akka.http.javadsl.settings.RoutingSettings { self: RoutingSettingsImpl ⇒ + def verboseErrorMessages: Boolean + def fileGetConditional: Boolean + def renderVanityFooter: Boolean + def rangeCountLimit: Int + def rangeCoalescingThreshold: Long + def decodeMaxBytesPerChunk: Int + def fileIODispatcher: String + + /* Java APIs */ + def getVerboseErrorMessages: Boolean = verboseErrorMessages + def getFileGetConditional: Boolean = fileGetConditional + def getRenderVanityFooter: Boolean = renderVanityFooter + def getRangeCountLimit: Int = rangeCountLimit + def getRangeCoalescingThreshold: Long = rangeCoalescingThreshold + def getDecodeMaxBytesPerChunk: Int = decodeMaxBytesPerChunk + def getFileIODispatcher: String = fileIODispatcher + + override def withVerboseErrorMessages(verboseErrorMessages: Boolean): RoutingSettings = self.copy(verboseErrorMessages = verboseErrorMessages) + override def withFileGetConditional(fileGetConditional: Boolean): RoutingSettings = self.copy(fileGetConditional = fileGetConditional) + override def withRenderVanityFooter(renderVanityFooter: Boolean): RoutingSettings = self.copy(renderVanityFooter = renderVanityFooter) + override def withRangeCountLimit(rangeCountLimit: Int): RoutingSettings = self.copy(rangeCountLimit = rangeCountLimit) + override def withRangeCoalescingThreshold(rangeCoalescingThreshold: Long): RoutingSettings = self.copy(rangeCoalescingThreshold = rangeCoalescingThreshold) + override def withDecodeMaxBytesPerChunk(decodeMaxBytesPerChunk: Int): RoutingSettings = self.copy(decodeMaxBytesPerChunk = decodeMaxBytesPerChunk) + override def withFileIODispatcher(fileIODispatcher: String): RoutingSettings = self.copy(fileIODispatcher = fileIODispatcher) + +} + +object RoutingSettings extends SettingsCompanion[RoutingSettings] { + override def apply(config: Config): RoutingSettings = RoutingSettingsImpl(config) + override def apply(configOverrides: String): RoutingSettings = RoutingSettingsImpl(configOverrides) +} diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ServerSettings.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ServerSettings.scala index ae15b8e126..ffe0125221 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ServerSettings.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/settings/ServerSettings.scala @@ -20,7 +20,10 @@ import scala.compat.java8.OptionConverters import scala.concurrent.duration.{ FiniteDuration, Duration } import scala.language.implicitConversions -abstract class ServerSettings extends akka.http.javadsl.settings.ServerSettings { +/** + * Public API but not intended for subclassing + */ +abstract class ServerSettings private[akka] () extends akka.http.javadsl.settings.ServerSettings { self: ServerSettingsImpl ⇒ def serverHeader: Option[Server] def timeouts: ServerSettings.Timeouts def maxConnections: Int diff --git a/akka-http-testkit/src/main/scala/akka/http/javadsl/testkit/RouteTest.scala b/akka-http-testkit/src/main/scala/akka/http/javadsl/testkit/RouteTest.scala index 941b2c3bd2..8cc777bb80 100644 --- a/akka-http-testkit/src/main/scala/akka/http/javadsl/testkit/RouteTest.scala +++ b/akka-http-testkit/src/main/scala/akka/http/javadsl/testkit/RouteTest.scala @@ -4,6 +4,8 @@ package akka.http.javadsl.testkit +import akka.http.scaladsl.settings.RoutingSettings + import scala.annotation.varargs import scala.concurrent.ExecutionContextExecutor import scala.concurrent.duration._ @@ -15,14 +17,14 @@ import akka.http.javadsl.server.{ HttpApp, AllDirectives, Route, Directives } import akka.http.impl.util.JavaMapping.Implicits._ import akka.http.impl.server.RouteImplementation import akka.http.scaladsl.model.HttpResponse -import akka.http.scaladsl.server.{ RouteResult, RoutingSettingsImpl, Route ⇒ ScalaRoute } +import akka.http.scaladsl.server.{ RouteResult, Route ⇒ ScalaRoute } import akka.actor.ActorSystem import akka.event.NoLogging import akka.http.impl.util._ /** * A base class to create route tests for testing libraries. An implementation needs to provide - * code to provide and shutdown an [[ActorSystem]], [[Materializer]], and [[ExecutionContext]]. + * code to provide and shutdown an [[ActorSystem]], [[Materializer]], and [[ExecutionContextExecutor]]. * Also an implementation should provide instances of [[TestResponse]] to define the assertion * facilities of the testing library. * @@ -55,7 +57,7 @@ abstract class RouteTest extends AllDirectives { securedConnection = defaultHostInfo.isSecuredConnection(), defaultHostHeader = defaultHostInfo.getHost().asScala) - val result = scalaRoute(new server.RequestContextImpl(effectiveRequest, NoLogging, RoutingSettingsImpl(system))) + val result = scalaRoute(new server.RequestContextImpl(effectiveRequest, NoLogging, RoutingSettings(system))) result.awaitResult(awaitDuration) match { case RouteResult.Complete(response) ⇒ createTestResponse(response) diff --git a/akka-http-testkit/src/main/scala/akka/http/scaladsl/testkit/RouteTest.scala b/akka-http-testkit/src/main/scala/akka/http/scaladsl/testkit/RouteTest.scala index 4128289ebd..9afba3f1eb 100644 --- a/akka-http-testkit/src/main/scala/akka/http/scaladsl/testkit/RouteTest.scala +++ b/akka-http-testkit/src/main/scala/akka/http/scaladsl/testkit/RouteTest.scala @@ -4,6 +4,7 @@ package akka.http.scaladsl.testkit +import akka.http.scaladsl.settings.RoutingSettings import com.typesafe.config.{ ConfigFactory, Config } import scala.collection.immutable import scala.concurrent.{ ExecutionContext, Await, Future } @@ -134,7 +135,7 @@ trait RouteTest extends RequestBuilding with WSTestRequestBuilding with RouteTes } implicit def injectIntoRoute(implicit timeout: RouteTestTimeout, defaultHostInfo: DefaultHostInfo, - routingSettings: RoutingSettingsImpl, + routingSettings: RoutingSettings, executionContext: ExecutionContext, materializer: Materializer, routingLog: RoutingLog, diff --git a/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/FileAndResourceDirectivesSpec.scala b/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/FileAndResourceDirectivesSpec.scala index 685810dfe8..6d61f08808 100644 --- a/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/FileAndResourceDirectivesSpec.scala +++ b/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/FileAndResourceDirectivesSpec.scala @@ -6,6 +6,9 @@ package akka.http.scaladsl.server package directives import java.io.File + +import akka.http.scaladsl.settings.RoutingSettings + import scala.concurrent.duration._ import scala.concurrent.{ ExecutionContext, Future } import scala.util.Properties @@ -229,7 +232,7 @@ class FileAndResourceDirectivesSpec extends RoutingSpec with Inspectors with Ins val base = new File(getClass.getClassLoader.getResource("").toURI).getPath new File(base, "subDirectory/emptySub").mkdir() def eraseDateTime(s: String) = s.replaceAll("""\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d""", "xxxx-xx-xx xx:xx:xx") - implicit val settings = RoutingSettingsImpl.default.copy(renderVanityFooter = false) + implicit val settings = RoutingSettings.default.withRenderVanityFooter(false) "properly render a simple directory" in { Get() ~> listDirectoryContents(base + "/someDir") ~> check { diff --git a/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/RangeDirectivesSpec.scala b/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/RangeDirectivesSpec.scala index fc599e8b7d..572970e7b0 100644 --- a/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/RangeDirectivesSpec.scala +++ b/akka-http-tests/src/test/scala/akka/http/scaladsl/server/directives/RangeDirectivesSpec.scala @@ -17,7 +17,7 @@ import org.scalatest.{ Inside, Inspectors } class RangeDirectivesSpec extends RoutingSpec with Inspectors with Inside { lazy val wrs = - mapSettings(_.copy(rangeCountLimit = 10, rangeCoalescingThreshold = 1L)) & + mapSettings(_.withRangeCountLimit(10).withRangeCoalescingThreshold(1L)) & withRangeSupport def bytes(length: Byte) = Array.tabulate[Byte](length)(_.toByte) diff --git a/akka-http/src/main/scala/akka/http/impl/server/RequestContextImpl.scala b/akka-http/src/main/scala/akka/http/impl/server/RequestContextImpl.scala index baa9d86216..5f92455b3a 100644 --- a/akka-http/src/main/scala/akka/http/impl/server/RequestContextImpl.scala +++ b/akka-http/src/main/scala/akka/http/impl/server/RequestContextImpl.scala @@ -5,6 +5,7 @@ package akka.http.impl.server import akka.http.javadsl.model.ContentType +import akka.http.javadsl.settings.{ RoutingSettings, ParserSettings } import akka.http.scaladsl.model.HttpEntity import akka.stream.Materializer import scala.concurrent.{ ExecutionContextExecutor, Future } @@ -52,4 +53,7 @@ private[http] final case class RequestContextImpl(underlying: ScalaRequestContex def executionContext(): ExecutionContextExecutor = underlying.executionContext def materializer(): Materializer = underlying.materializer + + override def settings: RoutingSettings = underlying.settings + override def parserSettings: ParserSettings = underlying.parserSettings } diff --git a/akka-http/src/main/scala/akka/http/javadsl/server/RequestContext.scala b/akka-http/src/main/scala/akka/http/javadsl/server/RequestContext.scala index 3415e2fbf7..9c88068e5a 100644 --- a/akka-http/src/main/scala/akka/http/javadsl/server/RequestContext.scala +++ b/akka-http/src/main/scala/akka/http/javadsl/server/RequestContext.scala @@ -6,6 +6,7 @@ package akka.http.javadsl.server import scala.concurrent.ExecutionContextExecutor import akka.http.javadsl.model._ +import akka.http.javadsl.settings.{ RoutingSettings, ParserSettings } import akka.stream.Materializer import java.util.concurrent.CompletionStage @@ -30,6 +31,16 @@ trait RequestContext { /** Returns the Materializer of this RequestContext */ def materializer(): Materializer + /** + * The default RoutingSettings to be used for configuring directives. + */ + def settings: RoutingSettings + + /** + * The default ParserSettings to be used for configuring directives. + */ + def parserSettings: ParserSettings + /** * Completes the request with a value of type T and marshals it using the given * marshaller. diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/ExceptionHandler.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/ExceptionHandler.scala index 422a1a608a..b900514219 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/ExceptionHandler.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/ExceptionHandler.scala @@ -5,6 +5,7 @@ package akka.http.scaladsl.server import scala.util.control.NonFatal +import akka.http.scaladsl.settings.RoutingSettings import akka.http.scaladsl.model._ import StatusCodes._ @@ -18,7 +19,7 @@ trait ExceptionHandler extends ExceptionHandler.PF { /** * "Seals" this handler by attaching a default handler as fallback if necessary. */ - def seal(settings: RoutingSettingsImpl): ExceptionHandler + def seal(settings: RoutingSettings): ExceptionHandler } object ExceptionHandler { @@ -32,11 +33,11 @@ object ExceptionHandler { def apply(error: Throwable) = pf(error) def withFallback(that: ExceptionHandler): ExceptionHandler = if (!knownToBeSealed) ExceptionHandler(knownToBeSealed = false)(this orElse that) else this - def seal(settings: RoutingSettingsImpl): ExceptionHandler = + def seal(settings: RoutingSettings): ExceptionHandler = if (!knownToBeSealed) ExceptionHandler(knownToBeSealed = true)(this orElse default(settings)) else this } - def default(settings: RoutingSettingsImpl): ExceptionHandler = + def default(settings: RoutingSettings): ExceptionHandler = apply(knownToBeSealed = true) { case IllegalRequestException(info, status) ⇒ ctx ⇒ { ctx.log.warning("Illegal request {}\n\t{}\n\tCompleting with '{}' response", @@ -53,6 +54,6 @@ object ExceptionHandler { * Creates a sealed ExceptionHandler from the given one. Returns the default handler if the given one * is `null`. */ - def seal(handler: ExceptionHandler)(implicit settings: RoutingSettingsImpl): ExceptionHandler = + def seal(handler: ExceptionHandler)(implicit settings: RoutingSettings): ExceptionHandler = if (handler ne null) handler.seal(settings) else ExceptionHandler.default(settings) } diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContext.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContext.scala index e447be55dd..77f23830ea 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContext.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContext.scala @@ -9,7 +9,7 @@ import akka.stream.Materializer import akka.event.LoggingAdapter import akka.http.scaladsl.marshalling.ToResponseMarshallable import akka.http.scaladsl.model._ -import akka.http.scaladsl.settings.ParserSettings +import akka.http.scaladsl.settings.{ RoutingSettings, ParserSettings } /** * Immutable object encapsulating the context of an [[akka.http.scaladsl.model.HttpRequest]] @@ -41,7 +41,7 @@ trait RequestContext { /** * The default RoutingSettings to be used for configuring directives. */ - def settings: RoutingSettingsImpl + def settings: RoutingSettings /** * The default ParserSettings to be used for configuring directives. @@ -55,7 +55,7 @@ trait RequestContext { executionContext: ExecutionContextExecutor = executionContext, materializer: Materializer = materializer, log: LoggingAdapter = log, - settings: RoutingSettingsImpl = settings): RequestContext + settings: RoutingSettings = settings): RequestContext /** * Completes the request with the given ToResponseMarshallable. @@ -97,7 +97,7 @@ trait RequestContext { /** * Returns a copy of this context with the new RoutingSettings. */ - def withRoutingSettings(settings: RoutingSettingsImpl): RequestContext + def withRoutingSettings(settings: RoutingSettings): RequestContext /** * Returns a copy of this context with the new [[ParserSettings]]. diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContextImpl.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContextImpl.scala index 868a4fdd92..16682045c3 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContextImpl.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/RequestContextImpl.scala @@ -7,7 +7,7 @@ package akka.http.scaladsl.server import scala.concurrent.{ Future, ExecutionContextExecutor } import akka.stream.{ ActorMaterializer, Materializer } import akka.event.LoggingAdapter -import akka.http.scaladsl.settings.ParserSettings +import akka.http.scaladsl.settings.{ RoutingSettings, ParserSettings } import akka.http.scaladsl.marshalling.{ Marshal, ToResponseMarshallable } import akka.http.scaladsl.model._ import akka.http.scaladsl.util.FastFuture @@ -22,16 +22,16 @@ private[http] class RequestContextImpl( val executionContext: ExecutionContextExecutor, val materializer: Materializer, val log: LoggingAdapter, - val settings: RoutingSettingsImpl, + val settings: RoutingSettings, val parserSettings: ParserSettings) extends RequestContext { - def this(request: HttpRequest, log: LoggingAdapter, settings: RoutingSettingsImpl, parserSettings: ParserSettings)(implicit ec: ExecutionContextExecutor, materializer: Materializer) = + def this(request: HttpRequest, log: LoggingAdapter, settings: RoutingSettings, parserSettings: ParserSettings)(implicit ec: ExecutionContextExecutor, materializer: Materializer) = this(request, request.uri.path, ec, materializer, log, settings, parserSettings) - def this(request: HttpRequest, log: LoggingAdapter, settings: RoutingSettingsImpl)(implicit ec: ExecutionContextExecutor, materializer: Materializer) = + def this(request: HttpRequest, log: LoggingAdapter, settings: RoutingSettings)(implicit ec: ExecutionContextExecutor, materializer: Materializer) = this(request, request.uri.path, ec, materializer, log, settings, ParserSettings(ActorMaterializer.downcast(materializer).system)) - def reconfigure(executionContext: ExecutionContextExecutor, materializer: Materializer, log: LoggingAdapter, settings: RoutingSettingsImpl): RequestContext = + def reconfigure(executionContext: ExecutionContextExecutor, materializer: Materializer, log: LoggingAdapter, settings: RoutingSettings): RequestContext = copy(executionContext = executionContext, materializer = materializer, log = log, routingSettings = settings) override def complete(trm: ToResponseMarshallable): Future[RouteResult] = @@ -61,7 +61,7 @@ private[http] class RequestContextImpl( override def withLog(log: LoggingAdapter): RequestContext = if (log != this.log) copy(log = log) else this - override def withRoutingSettings(routingSettings: RoutingSettingsImpl): RequestContext = + override def withRoutingSettings(routingSettings: RoutingSettings): RequestContext = if (routingSettings != this.settings) copy(routingSettings = routingSettings) else this override def withParserSettings(parserSettings: ParserSettings): RequestContext = @@ -94,7 +94,7 @@ private[http] class RequestContextImpl( executionContext: ExecutionContextExecutor = executionContext, materializer: Materializer = materializer, log: LoggingAdapter = log, - routingSettings: RoutingSettingsImpl = settings, + routingSettings: RoutingSettings = settings, parserSettings: ParserSettings = parserSettings) = new RequestContextImpl(request, unmatchedPath, executionContext, materializer, log, routingSettings, parserSettings) } diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/Route.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/Route.scala index 4f81f9193c..7bb8ec9685 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/Route.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/Route.scala @@ -5,8 +5,7 @@ package akka.http.scaladsl.server import akka.NotUsed -import akka.actor.ActorSystem -import akka.http.scaladsl.settings.ParserSettings +import akka.http.scaladsl.settings.{ RoutingSettings, ParserSettings } import akka.stream.{ ActorMaterializer, Materializer } import scala.concurrent.{ ExecutionContextExecutor, Future } @@ -24,7 +23,7 @@ object Route { /** * "Seals" a route by wrapping it with exception handling and rejection conversion. */ - def seal(route: Route)(implicit routingSettings: RoutingSettingsImpl, + def seal(route: Route)(implicit routingSettings: RoutingSettings, parserSettings: ParserSettings = null, rejectionHandler: RejectionHandler = RejectionHandler.default, exceptionHandler: ExceptionHandler = null): Route = { @@ -41,7 +40,7 @@ object Route { * * This conversion is also implicitly available through [[RouteResult.route2HandlerFlow]]. */ - def handlerFlow(route: Route)(implicit routingSettings: RoutingSettingsImpl, + def handlerFlow(route: Route)(implicit routingSettings: RoutingSettings, parserSettings: ParserSettings, materializer: Materializer, routingLog: RoutingLog, @@ -53,7 +52,7 @@ object Route { /** * Turns a `Route` into an async handler function. */ - def asyncHandler(route: Route)(implicit routingSettings: RoutingSettingsImpl, + def asyncHandler(route: Route)(implicit routingSettings: RoutingSettings, parserSettings: ParserSettings, materializer: Materializer, routingLog: RoutingLog, diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/RouteResult.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/RouteResult.scala index ae5c306a50..772a4c824f 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/RouteResult.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/RouteResult.scala @@ -4,11 +4,10 @@ package akka.http.scaladsl.server -import akka.NotUsed -import akka.http.scaladsl.settings.ParserSettings - import scala.collection.immutable import scala.concurrent.ExecutionContext +import akka.NotUsed +import akka.http.scaladsl.settings.{ RoutingSettings, ParserSettings } import akka.stream.Materializer import akka.stream.scaladsl.Flow import akka.http.scaladsl.model.{ HttpRequest, HttpResponse } @@ -25,7 +24,7 @@ object RouteResult { final case class Complete(response: HttpResponse) extends RouteResult final case class Rejected(rejections: immutable.Seq[Rejection]) extends RouteResult - implicit def route2HandlerFlow(route: Route)(implicit routingSettings: RoutingSettingsImpl, + implicit def route2HandlerFlow(route: Route)(implicit routingSettings: RoutingSettings, parserSettings: ParserSettings, materializer: Materializer, routingLog: RoutingLog, diff --git a/akka-http/src/main/scala/akka/http/scaladsl/server/directives/BasicDirectives.scala b/akka-http/src/main/scala/akka/http/scaladsl/server/directives/BasicDirectives.scala index 0536fa9865..15646befae 100644 --- a/akka-http/src/main/scala/akka/http/scaladsl/server/directives/BasicDirectives.scala +++ b/akka-http/src/main/scala/akka/http/scaladsl/server/directives/BasicDirectives.scala @@ -9,7 +9,7 @@ import scala.concurrent.{ Future, ExecutionContextExecutor } import scala.collection.immutable import akka.event.LoggingAdapter import akka.stream.Materializer -import akka.http.scaladsl.settings.ParserSettings +import akka.http.scaladsl.settings.{ RoutingSettings, ParserSettings } import akka.http.scaladsl.server.util.Tuple import akka.http.scaladsl.util.FastFuture import akka.http.scaladsl.model._ @@ -165,21 +165,21 @@ trait BasicDirectives { BasicDirectives._extractLog /** - * Runs its inner route with the given alternative [[RoutingSettingsImpl]]. + * Runs its inner route with the given alternative [[RoutingSettings]]. */ - def withSettings(settings: RoutingSettingsImpl): Directive0 = + def withSettings(settings: RoutingSettings): Directive0 = mapRequestContext(_ withRoutingSettings settings) /** * Runs the inner route with settings mapped by the given function. */ - def mapSettings(f: RoutingSettingsImpl ⇒ RoutingSettingsImpl): Directive0 = + def mapSettings(f: RoutingSettings ⇒ RoutingSettings): Directive0 = mapRequestContext(ctx ⇒ ctx.withRoutingSettings(f(ctx.settings))) /** - * Extracts the [[RoutingSettingsImpl]] from the [[RequestContext]]. + * Extracts the [[RoutingSettings]] from the [[RequestContext]]. */ - def extractSettings: Directive1[RoutingSettingsImpl] = + def extractSettings: Directive1[RoutingSettings] = BasicDirectives._extractSettings /** @@ -201,7 +201,7 @@ object BasicDirectives extends BasicDirectives { private val _extractExecutionContext: Directive1[ExecutionContextExecutor] = extract(_.executionContext) private val _extractMaterializer: Directive1[Materializer] = extract(_.materializer) private val _extractLog: Directive1[LoggingAdapter] = extract(_.log) - private val _extractSettings: Directive1[RoutingSettingsImpl] = extract(_.settings) + private val _extractSettings: Directive1[RoutingSettings] = extract(_.settings) private val _extractParserSettings: Directive1[ParserSettings] = extract(_.parserSettings) private val _extractRequestContext: Directive1[RequestContext] = extract(conforms) }