in http-server/src/main/scala/com/twitter/finatra/http/internal/routing/CallbackConverter.scala [195:228]
private def streamingTypes[RequestType: TypeTag, ResponseType: TypeTag](
requestCallback: Request => ResponseType,
manifested: Manifest[_]
): Request => Future[Response] = {
manifested match {
case asyncStreamBuf if asyncStreamBuf == manifest[AsyncStream[Buf]] =>
request: Request =>
val asyncStream = requestCallback(request).asInstanceOf[AsyncStream[Buf]]
responseBuilder.streaming(asyncStream).toFutureResponse()
case asyncStream if runtimeClassEqs[AsyncStream[_]](asyncStream) =>
request: Request =>
val asyncStream = requestCallback(request).asInstanceOf[AsyncStream[_]]
responseBuilder.streaming(asyncStream).toFutureResponse()
case readerBuf if readerBuf == manifest[Reader[Buf]] =>
request: Request =>
val reader = requestCallback(request).asInstanceOf[Reader[Buf]]
responseBuilder.streaming(reader).toFutureResponse()
case reader if runtimeClassEqs[Reader[_]](reader) =>
request: Request =>
val reader = requestCallback(request).asInstanceOf[Reader[_]]
responseBuilder.streaming(reader).toFutureResponse()
case streamingResponse if runtimeClassEqs[StreamingResponse[Any, _]](streamingResponse) =>
request: Request =>
streamingResponse.typeArguments.head match {
case _: Reader[_] =>
requestCallback(request).asInstanceOf[StreamingResponse[Reader, _]].toFutureResponse()
case _: AsyncStream[_] =>
requestCallback(request)
.asInstanceOf[StreamingResponse[AsyncStream, _]].toFutureResponse()
case _ =>
requestCallback(request).asInstanceOf[StreamingResponse[Any, _]].toFutureResponse()
}
}
}