diff --git a/akka-http-core/src/main/mima-filters/10.1.3.backwards.excludes b/akka-http-core/src/main/mima-filters/10.1.3.backwards.excludes index 438730831b5..814f3d68b64 100644 --- a/akka-http-core/src/main/mima-filters/10.1.3.backwards.excludes +++ b/akka-http-core/src/main/mima-filters/10.1.3.backwards.excludes @@ -10,3 +10,9 @@ ProblemFilters.exclude[IncompatibleResultTypeProblem]("akka.http.scaladsl.settin ProblemFilters.exclude[DirectMissingMethodProblem]("akka.http.scaladsl.settings.Http2ServerSettings#Http2ServerSettingsImpl.apply") ProblemFilters.exclude[DirectMissingMethodProblem]("akka.http.scaladsl.settings.Http2ServerSettings#Http2ServerSettingsImpl.copy") ProblemFilters.exclude[DirectMissingMethodProblem]("akka.http.scaladsl.settings.Http2ServerSettings#Http2ServerSettingsImpl.this") + +# #2149: additions to @DoNotInherit classes + +ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.http.javadsl.HttpsConnectionContext.withHttp2") +ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.http.javadsl.HttpConnectionContext.withHttp2") +ProblemFilters.exclude[ReversedMissingMethodProblem]("akka.http.javadsl.ConnectionContext.withHttp2") diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/ConnectHttp.scala b/akka-http-core/src/main/scala/akka/http/javadsl/ConnectHttp.scala index 22a5231a257..8e640d7f5d0 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/ConnectHttp.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/ConnectHttp.scala @@ -7,6 +7,8 @@ package akka.http.javadsl import java.util.Locale import java.util.Optional +import scala.compat.java8.OptionConverters._ + import akka.annotation.{ DoNotInherit, InternalApi } import akka.http.javadsl.model.Uri import akka.http.scaladsl.UseHttp2.Negotiated @@ -21,11 +23,14 @@ abstract class ConnectHttp { def http2: UseHttp2 final def effectiveHttpsConnectionContext(fallbackContext: HttpsConnectionContext): HttpsConnectionContext = - connectionContext.orElse(fallbackContext) + connectionContext.asScala + .getOrElse(fallbackContext) + .withHttp2(http2) final def effectiveConnectionContext(fallbackContext: ConnectionContext): ConnectionContext = - if (connectionContext.isPresent) connectionContext.get() - else fallbackContext + connectionContext.asScala // Optional doesn't deal well with covariance + .getOrElse(fallbackContext) + .withHttp2(http2) override def toString = s"ConnectHttp($host,$port,$isHttps,$connectionContext,$http2)" } diff --git a/akka-http-core/src/main/scala/akka/http/javadsl/ConnectionContext.scala b/akka-http-core/src/main/scala/akka/http/javadsl/ConnectionContext.scala index a0109e20e3b..c63b15c69e1 100644 --- a/akka-http-core/src/main/scala/akka/http/javadsl/ConnectionContext.scala +++ b/akka-http-core/src/main/scala/akka/http/javadsl/ConnectionContext.scala @@ -65,6 +65,8 @@ abstract class ConnectionContext { def sslConfig: Option[AkkaSSLConfig] def http2: UseHttp2 + def withHttp2(newValue: UseHttp2): ConnectionContext + @deprecated("'default-http-port' and 'default-https-port' configuration properties are used instead", since = "10.0.11") def getDefaultPort: Int } @@ -74,6 +76,8 @@ abstract class HttpConnectionContext(override val http2: UseHttp2) extends akka. override final def isSecure = false override final def getDefaultPort = 80 override def sslConfig: Option[AkkaSSLConfig] = None + + override def withHttp2(newValue: UseHttp2): HttpConnectionContext } @DoNotInherit @@ -81,6 +85,8 @@ abstract class HttpsConnectionContext(override val http2: UseHttp2) extends akka override final def isSecure = true override final def getDefaultPort = 443 + override def withHttp2(newValue: UseHttp2): HttpsConnectionContext + /** Java API */ def getEnabledCipherSuites: Optional[JCollection[String]] /** Java API */ diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/ConnectionContext.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/ConnectionContext.scala index 8e398145b9e..b0273ad1bf6 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/ConnectionContext.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/ConnectionContext.scala @@ -11,6 +11,7 @@ import com.typesafe.sslconfig.akka.AkkaSSLConfig import scala.collection.JavaConverters._ import java.util.{ Optional, Collection ⇒ JCollection } +import akka.http.javadsl import akka.http.scaladsl.UseHttp2.Negotiated import javax.net.ssl._ @@ -93,11 +94,22 @@ final class HttpsConnectionContext( override def getEnabledProtocols: Optional[JCollection[String]] = enabledProtocols.map(_.asJavaCollection).asJava override def getClientAuth: Optional[TLSClientAuth] = clientAuth.asJava override def getSslParameters: Optional[SSLParameters] = sslParameters.asJava + + override def withHttp2(newValue: javadsl.UseHttp2): javadsl.HttpsConnectionContext = + withHttp2(newValue.asScala) + def withHttp2(newValue: UseHttp2): javadsl.HttpsConnectionContext = + new HttpsConnectionContext(sslContext, sslConfig, enabledCipherSuites, enabledProtocols, clientAuth, sslParameters, newValue) } sealed class HttpConnectionContext(http2: UseHttp2) extends akka.http.javadsl.HttpConnectionContext(http2) with ConnectionContext { def this() = this(Negotiated) + + override def withHttp2(newValue: javadsl.UseHttp2): javadsl.HttpConnectionContext = + withHttp2(newValue.asScala) + def withHttp2(newValue: UseHttp2): javadsl.HttpConnectionContext = + new HttpConnectionContext(newValue) } + final object HttpConnectionContext extends HttpConnectionContext(Negotiated) { /** Java API */ def getInstance() = this diff --git a/akka-http-core/src/test/scala/akka/http/javadsl/ConnectHttpSpec.scala b/akka-http-core/src/test/scala/akka/http/javadsl/ConnectHttpSpec.scala index 9547b8ef875..05f472b359e 100644 --- a/akka-http-core/src/test/scala/akka/http/javadsl/ConnectHttpSpec.scala +++ b/akka-http-core/src/test/scala/akka/http/javadsl/ConnectHttpSpec.scala @@ -99,5 +99,14 @@ class ConnectHttpSpec extends WordSpec with Matchers with BeforeAndAfterAll { } ex.getMessage should include("non https scheme!") } + "connect toHost HTTP/2 only" in { + val connect = ConnectHttp.toHost("http://127.0.0.1", 8080, UseHttp2.always) + connect.effectiveConnectionContext(httpsContext).http2 should equal(UseHttp2.always) + } + "connect toHostHttps HTTP/2 only" in { + val connect = ConnectHttp.toHostHttps("https://127.0.0.1", 8080, UseHttp2.always) + connect.effectiveConnectionContext(httpsContext).http2 should equal(UseHttp2.always) + } + } }