From f08e8360bcfa7a13ea20c9dfb00127f16db96242 Mon Sep 17 00:00:00 2001 From: Mathias Date: Thu, 18 Jun 2015 16:29:16 +0200 Subject: [PATCH] !htc #17656 do not render host header default port values --- .../client/OutgoingConnectionBlueprint.scala | 14 ++++------ .../HttpRequestRendererFactory.scala | 6 ++--- .../main/scala/akka/http/scaladsl/Http.scala | 20 +++++++------- .../LowLevelOutgoingConnectionSpec.scala | 26 +++++++++---------- .../rendering/RequestRendererSpec.scala | 2 +- 5 files changed, 31 insertions(+), 37 deletions(-) diff --git a/akka-http-core/src/main/scala/akka/http/impl/engine/client/OutgoingConnectionBlueprint.scala b/akka-http-core/src/main/scala/akka/http/impl/engine/client/OutgoingConnectionBlueprint.scala index 17067ee887..0efe26335f 100644 --- a/akka-http-core/src/main/scala/akka/http/impl/engine/client/OutgoingConnectionBlueprint.scala +++ b/akka-http-core/src/main/scala/akka/http/impl/engine/client/OutgoingConnectionBlueprint.scala @@ -4,20 +4,16 @@ package akka.http.impl.engine.client -import akka.http.ClientConnectionSettings -import akka.stream.io.{ SessionBytes, SslTlsInbound, SendBytes, SslTlsOutbound } - import language.existentials -import java.net.InetSocketAddress import scala.annotation.tailrec -import scala.collection.immutable.Seq import scala.collection.mutable.ListBuffer -import akka.stream.stage._ +import akka.stream.io.{ SessionBytes, SslTlsInbound, SendBytes, SslTlsOutbound } import akka.util.ByteString import akka.event.LoggingAdapter import akka.stream._ import akka.stream.scaladsl._ -import akka.stream.OperationAttributes._ +import akka.http.ClientConnectionSettings +import akka.http.scaladsl.model.headers.Host import akka.http.scaladsl.model.{ IllegalResponseException, HttpMethod, HttpRequest, HttpResponse } import akka.http.impl.engine.rendering.{ RequestRenderingContext, HttpRequestRendererFactory } import akka.http.impl.engine.parsing._ @@ -47,7 +43,7 @@ private[http] object OutgoingConnectionBlueprint { | Merge |<------------------------------------------ V +------------+ */ - def apply(remoteAddress: InetSocketAddress, + def apply(hostHeader: Host, settings: ClientConnectionSettings, log: LoggingAdapter): Graph[ClientShape, Unit] = { import settings._ @@ -62,7 +58,7 @@ private[http] object OutgoingConnectionBlueprint { val requestRendererFactory = new HttpRequestRendererFactory(userAgentHeader, requestHeaderSizeHint, log) val requestRendering: Flow[HttpRequest, ByteString, Unit] = Flow[HttpRequest] - .map(RequestRenderingContext(_, remoteAddress)) + .map(RequestRenderingContext(_, hostHeader)) .via(Flow[RequestRenderingContext].transform(() ⇒ requestRendererFactory.newRenderer).named("renderer")) .flatten(FlattenStrategy.concat) diff --git a/akka-http-core/src/main/scala/akka/http/impl/engine/rendering/HttpRequestRendererFactory.scala b/akka-http-core/src/main/scala/akka/http/impl/engine/rendering/HttpRequestRendererFactory.scala index d18d1474ba..7458cfde6e 100644 --- a/akka-http-core/src/main/scala/akka/http/impl/engine/rendering/HttpRequestRendererFactory.scala +++ b/akka-http-core/src/main/scala/akka/http/impl/engine/rendering/HttpRequestRendererFactory.scala @@ -4,7 +4,6 @@ package akka.http.impl.engine.rendering -import java.net.InetSocketAddress import scala.annotation.tailrec import akka.event.LoggingAdapter import akka.util.ByteString @@ -14,7 +13,6 @@ import akka.http.scaladsl.model._ import akka.http.impl.util._ import RenderSupport._ import headers._ -import scala.util.control.NonFatal /** * INTERNAL API @@ -93,7 +91,7 @@ private[http] class HttpRequestRendererFactory(userAgentHeader: Option[headers.` } case Nil ⇒ - if (!hostHeaderSeen) r ~~ Host(ctx.serverAddress) ~~ CrLf + if (!hostHeaderSeen) r ~~ ctx.hostHeader ~~ CrLf if (!userAgentSeen && userAgentHeader.isDefined) r ~~ userAgentHeader.get ~~ CrLf if (entity.isChunked && !entity.isKnownEmpty && !transferEncodingSeen) r ~~ `Transfer-Encoding` ~~ ChunkedBytes ~~ CrLf @@ -132,4 +130,4 @@ private[http] class HttpRequestRendererFactory(userAgentHeader: Option[headers.` /** * INTERNAL API */ -private[http] final case class RequestRenderingContext(request: HttpRequest, serverAddress: InetSocketAddress) +private[http] final case class RequestRenderingContext(request: HttpRequest, hostHeader: Host) diff --git a/akka-http-core/src/main/scala/akka/http/scaladsl/Http.scala b/akka-http-core/src/main/scala/akka/http/scaladsl/Http.scala index f598ece862..c147a2aedd 100644 --- a/akka-http-core/src/main/scala/akka/http/scaladsl/Http.scala +++ b/akka-http-core/src/main/scala/akka/http/scaladsl/Http.scala @@ -8,21 +8,21 @@ import java.net.InetSocketAddress import java.util.concurrent.ConcurrentHashMap import java.util.{ Collection ⇒ JCollection } import javax.net.ssl.{ SSLParameters, SSLContext } -import akka.http.impl.util.StreamUtils -import akka.japi import com.typesafe.config.Config import scala.util.Try import scala.util.control.NonFatal import scala.collection.{ JavaConverters, immutable } import scala.concurrent.{ ExecutionContext, Promise, Future } +import akka.japi import akka.event.LoggingAdapter -import akka.io.Inet import akka.stream.FlowMaterializer import akka.stream.io._ import akka.stream.scaladsl._ +import akka.http.impl.util.StreamUtils import akka.http.impl.engine.client._ import akka.http.impl.engine.server._ import akka.http.scaladsl.util.FastFuture +import akka.http.scaladsl.model.headers.Host import akka.http.scaladsl.model._ import akka.http._ import akka.actor._ @@ -185,10 +185,10 @@ class HttpExt(config: Config)(implicit system: ActorSystem) extends akka.actor.E private def _outgoingConnection(host: String, port: Int, localAddress: Option[InetSocketAddress], settings: ClientConnectionSettings, httpsContext: Option[HttpsContext], log: LoggingAdapter): Flow[HttpRequest, HttpResponse, Future[OutgoingConnection]] = { - val remoteAddr = new InetSocketAddress(host, port) - val layer = clientLayer(remoteAddr, settings, log) + val hostHeader = if (port == (if (httpsContext.isEmpty) 80 else 443)) Host(host) else Host(host, port) + val layer = clientLayer(hostHeader, settings, log) val tlsStage = sslTlsStage(httpsContext, Client) - val transportFlow = Tcp().outgoingConnection(remoteAddr, localAddress, + val transportFlow = Tcp().outgoingConnection(new InetSocketAddress(host, port), localAddress, settings.socketOptions, settings.connectingTimeout, settings.idleTimeout) layer.atop(tlsStage).joinMat(transportFlow) { (_, tcpConnFuture) ⇒ @@ -214,16 +214,16 @@ class HttpExt(config: Config)(implicit system: ActorSystem) extends akka.actor.E /** * Constructs a [[ClientLayer]] stage using the configured default [[ClientConnectionSettings]]. */ - def clientLayer(remoteAddress: InetSocketAddress /* TODO: remove after #16168 is cleared */ ): ClientLayer = - clientLayer(remoteAddress, ClientConnectionSettings(system)) + def clientLayer(hostHeader: Host): ClientLayer = + clientLayer(hostHeader, ClientConnectionSettings(system)) /** * Constructs a [[ClientLayer]] stage using the given [[ClientConnectionSettings]]. */ - def clientLayer(remoteAddress: InetSocketAddress, // TODO: remove after #16168 is cleared + def clientLayer(hostHeader: Host, settings: ClientConnectionSettings, log: LoggingAdapter = system.log): ClientLayer = - BidiFlow.wrap(OutgoingConnectionBlueprint(remoteAddress, settings, log)) + BidiFlow.wrap(OutgoingConnectionBlueprint(hostHeader, settings, log)) /** * Starts a new connection pool to the given host and configuration and returns a [[Flow]] which dispatches diff --git a/akka-http-core/src/test/scala/akka/http/impl/engine/client/LowLevelOutgoingConnectionSpec.scala b/akka-http-core/src/test/scala/akka/http/impl/engine/client/LowLevelOutgoingConnectionSpec.scala index 2c61840b43..f258974095 100644 --- a/akka-http-core/src/test/scala/akka/http/impl/engine/client/LowLevelOutgoingConnectionSpec.scala +++ b/akka-http-core/src/test/scala/akka/http/impl/engine/client/LowLevelOutgoingConnectionSpec.scala @@ -30,7 +30,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -56,7 +56,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest(PUT, entity = HttpEntity(ContentTypes.`application/octet-stream`, 8, Source(probe)))) expectWireData( """PUT / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test |Content-Type: application/octet-stream |Content-Length: 8 @@ -92,7 +92,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -136,7 +136,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendComplete() expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -162,7 +162,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -202,7 +202,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -222,7 +222,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest(PUT, entity = HttpEntity(ContentTypes.`application/octet-stream`, 8, Source(probe)))) expectWireData( """PUT / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test |Content-Type: application/octet-stream |Content-Length: 8 @@ -247,7 +247,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest(PUT, entity = HttpEntity(ContentTypes.`application/octet-stream`, 8, Source(probe)))) expectWireData( """PUT / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test |Content-Type: application/octet-stream |Content-Length: 8 @@ -271,7 +271,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -292,7 +292,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -330,7 +330,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. requestsSub.sendNext(HttpRequest()) expectWireData( """GET / HTTP/1.1 - |Host: example.com:80 + |Host: example.com |User-Agent: akka-http/test | |""") @@ -350,7 +350,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. class TestSetup { val requests = TestPublisher.manualProbe[HttpRequest] val responses = TestSubscriber.manualProbe[HttpResponse] - val remoteAddress = new InetSocketAddress("example.com", 80) + val remoteAddress = new InetSocketAddress("example.com", 0) def settings = ClientConnectionSettings(system) .copy(userAgentHeader = Some(`User-Agent`(List(ProductVersion("akka-http", "test"))))) @@ -359,7 +359,7 @@ class LowLevelOutgoingConnectionSpec extends AkkaSpec("akka.loggers = []\n akka. val netOut = TestSubscriber.manualProbe[ByteString] val netIn = TestPublisher.manualProbe[ByteString] - FlowGraph.closed(OutgoingConnectionBlueprint(remoteAddress, settings, NoLogging)) { implicit b ⇒ + FlowGraph.closed(OutgoingConnectionBlueprint(Host(remoteAddress), settings, NoLogging)) { implicit b ⇒ client ⇒ import FlowGraph.Implicits._ Source(netIn) ~> Flow[ByteString].map(SessionBytes(null, _)) ~> client.in2 diff --git a/akka-http-core/src/test/scala/akka/http/impl/engine/rendering/RequestRendererSpec.scala b/akka-http-core/src/test/scala/akka/http/impl/engine/rendering/RequestRendererSpec.scala index 928ee4cfd5..d9301b052d 100644 --- a/akka-http-core/src/test/scala/akka/http/impl/engine/rendering/RequestRendererSpec.scala +++ b/akka-http-core/src/test/scala/akka/http/impl/engine/rendering/RequestRendererSpec.scala @@ -312,7 +312,7 @@ class RequestRendererSpec extends FreeSpec with Matchers with BeforeAndAfterAll def renderTo(expected: String): Matcher[HttpRequest] = equal(expected.stripMarginWithNewline("\r\n")).matcher[String] compose { request ⇒ val renderer = newRenderer - val byteStringSource = Await.result(Source.single(RequestRenderingContext(request, serverAddress)) + val byteStringSource = Await.result(Source.single(RequestRenderingContext(request, Host(serverAddress))) .transform(() ⇒ renderer).named("renderer") .runWith(Sink.head), 1.second) val future = byteStringSource.grouped(1000).runWith(Sink.head).map(_.reduceLeft(_ ++ _).utf8String)