Merge pull request #15725 from ktoso/wip-transformerFactory-ktoso

!str #15271 make transform() take a factory instead of Transformer
This commit is contained in:
Konrad Malawski 2014-08-26 16:15:36 +02:00
commit 55e48918fd
26 changed files with 368 additions and 281 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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