Merge pull request #15725 from ktoso/wip-transformerFactory-ktoso
!str #15271 make transform() take a factory instead of Transformer
This commit is contained in:
commit
55e48918fd
26 changed files with 368 additions and 281 deletions
|
|
@ -44,14 +44,14 @@ private[http] class HttpClientPipeline(effectiveSettings: ClientConnectionSettin
|
|||
Duct[(HttpRequest, Any)]
|
||||
.broadcast(contextBypassSubscriber)
|
||||
.map(requestMethodByPass)
|
||||
.transform(responseRendererFactory.newRenderer)
|
||||
.transform("renderer", () ⇒ responseRendererFactory.newRenderer)
|
||||
.flatten(FlattenStrategy.concat)
|
||||
.transform(errorLogger(log, "Outgoing request stream error"))
|
||||
.transform("errorLogger", () ⇒ errorLogger(log, "Outgoing request stream error"))
|
||||
.produceTo(tcpConn.outputStream)(materializer)
|
||||
|
||||
val responsePublisher =
|
||||
Flow(tcpConn.inputStream)
|
||||
.transform(rootParser.copyWith(warnOnIllegalHeader, requestMethodByPass))
|
||||
.transform("rootParser", () ⇒ rootParser.copyWith(warnOnIllegalHeader, requestMethodByPass))
|
||||
.splitWhen(_.isInstanceOf[MessageStart])
|
||||
.headAndTail(materializer)
|
||||
.collect {
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@ sealed trait HttpEntity extends japi.HttpEntity {
|
|||
*/
|
||||
def toStrict(timeout: FiniteDuration, materializer: FlowMaterializer)(implicit ec: ExecutionContext): Future[HttpEntity.Strict] =
|
||||
Flow(dataBytes(materializer))
|
||||
.transform(new TimerTransformer[ByteString, HttpEntity.Strict] {
|
||||
.timerTransform("toStrict", () ⇒ new TimerTransformer[ByteString, HttpEntity.Strict] {
|
||||
var bytes = ByteString.newBuilder
|
||||
scheduleOnce("", timeout)
|
||||
|
||||
|
|
|
|||
|
|
@ -106,12 +106,12 @@ private[http] class HttpRequestRendererFactory(userAgentHeader: Option[headers.`
|
|||
case HttpEntity.Default(_, contentLength, data) ⇒
|
||||
renderContentLength(contentLength)
|
||||
renderByteStrings(r,
|
||||
Flow(data).transform(new CheckContentLengthTransformer(contentLength)).toPublisher()(materializer),
|
||||
Flow(data).transform("checkContentLenght", () ⇒ new CheckContentLengthTransformer(contentLength)).toPublisher()(materializer),
|
||||
materializer)
|
||||
|
||||
case HttpEntity.Chunked(_, chunks) ⇒
|
||||
r ~~ `Transfer-Encoding` ~~ ChunkedBytes ~~ CrLf ~~ CrLf
|
||||
renderByteStrings(r, Flow(chunks).transform(new ChunkTransformer).toPublisher()(materializer), materializer)
|
||||
renderByteStrings(r, Flow(chunks).transform("chunkTransform", () ⇒ new ChunkTransformer).toPublisher()(materializer), materializer)
|
||||
}
|
||||
|
||||
renderRequestLine()
|
||||
|
|
|
|||
|
|
@ -132,7 +132,7 @@ private[http] class HttpResponseRendererFactory(serverHeader: Option[headers.Ser
|
|||
renderHeaders(headers.toList)
|
||||
renderEntityContentType(r, entity)
|
||||
r ~~ `Content-Length` ~~ contentLength ~~ CrLf ~~ CrLf
|
||||
byteStrings(Flow(data).transform(new CheckContentLengthTransformer(contentLength)).toPublisher()(materializer))
|
||||
byteStrings(Flow(data).transform("checkContentLenght", () ⇒ new CheckContentLengthTransformer(contentLength)).toPublisher()(materializer))
|
||||
|
||||
case HttpEntity.CloseDelimited(_, data) ⇒
|
||||
renderHeaders(headers.toList, alwaysClose = true)
|
||||
|
|
@ -149,7 +149,7 @@ private[http] class HttpResponseRendererFactory(serverHeader: Option[headers.Ser
|
|||
if (!entity.isKnownEmpty || ctx.requestMethod == HttpMethods.HEAD)
|
||||
r ~~ `Transfer-Encoding` ~~ ChunkedBytes ~~ CrLf
|
||||
r ~~ CrLf
|
||||
byteStrings(Flow(chunks).transform(new ChunkTransformer).toPublisher()(materializer))
|
||||
byteStrings(Flow(chunks).transform("checkContentLenght", () ⇒ new ChunkTransformer).toPublisher()(materializer))
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ private[http] class HttpServerPipeline(settings: ServerSettings,
|
|||
|
||||
val requestPublisher =
|
||||
Flow(tcpConn.inputStream)
|
||||
.transform(rootParser.copyWith(warnOnIllegalHeader))
|
||||
.transform("rootParser", () ⇒ rootParser.copyWith(warnOnIllegalHeader))
|
||||
// this will create extra single element `[MessageEnd]` substreams, that will
|
||||
// be filtered out by the above `collect` for the applicationBypass and the
|
||||
// below `collect` for the actual request handling
|
||||
|
|
@ -58,10 +58,10 @@ private[http] class HttpServerPipeline(settings: ServerSettings,
|
|||
val responseSubscriber =
|
||||
Duct[HttpResponse]
|
||||
.merge(applicationBypassPublisher)
|
||||
.transform(applyApplicationBypass)
|
||||
.transform(responseRendererFactory.newRenderer)
|
||||
.transform("applyApplicationBypass", () ⇒ applyApplicationBypass)
|
||||
.transform("renderer", () ⇒ responseRendererFactory.newRenderer)
|
||||
.flatten(FlattenStrategy.concat)
|
||||
.transform(errorLogger(log, "Outgoing response stream error"))
|
||||
.transform("errorLogger", () ⇒ errorLogger(log, "Outgoing response stream error"))
|
||||
.produceTo(tcpConn.outputStream)(materializer)
|
||||
|
||||
Http.IncomingConnection(tcpConn.remoteAddress, requestPublisher, responseSubscriber)
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ package object util {
|
|||
|
||||
private[http] implicit class FlowWithPrintEvent[T](val underlying: Flow[T]) {
|
||||
def printEvent(marker: String): Flow[T] =
|
||||
underlying.transform {
|
||||
new Transformer[T, T] {
|
||||
underlying.transform("transform",
|
||||
() ⇒ new Transformer[T, T] {
|
||||
def onNext(element: T) = {
|
||||
println(s"$marker: $element")
|
||||
element :: Nil
|
||||
|
|
@ -47,8 +47,7 @@ package object util {
|
|||
println(s"$marker: Terminated with error $e")
|
||||
Nil
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private[http] def errorLogger(log: LoggingAdapter, msg: String): Transformer[ByteString, ByteString] =
|
||||
|
|
|
|||
|
|
@ -354,7 +354,7 @@ class RequestParserSpec extends FreeSpec with Matchers with BeforeAndAfterAll {
|
|||
val future =
|
||||
Flow(input.toList)
|
||||
.map(ByteString.apply)
|
||||
.transform(parser)
|
||||
.transform("parser", () ⇒ parser)
|
||||
.splitWhen(_.isInstanceOf[ParserOutput.MessageStart])
|
||||
.headAndTail(materializer)
|
||||
.collect {
|
||||
|
|
|
|||
|
|
@ -213,7 +213,7 @@ class ResponseParserSpec extends FreeSpec with Matchers with BeforeAndAfterAll {
|
|||
val future =
|
||||
Flow(input.toList)
|
||||
.map(ByteString.apply)
|
||||
.transform(newParser(requestMethod))
|
||||
.transform("parser", () ⇒ newParser(requestMethod))
|
||||
.splitWhen(_.isInstanceOf[ParserOutput.MessageStart])
|
||||
.headAndTail(materializer)
|
||||
.collect {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue