!htc #17656 do not render host header default port values

This commit is contained in:
Mathias 2015-06-18 16:29:16 +02:00
parent b4272b77c2
commit f08e8360bc
5 changed files with 31 additions and 37 deletions

View file

@ -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)

View file

@ -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)

View file

@ -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

View file

@ -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

View file

@ -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)