!htc #17656 do not render host header default port values
This commit is contained in:
parent
b4272b77c2
commit
f08e8360bc
5 changed files with 31 additions and 37 deletions
|
|
@ -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)
|
||||
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue