On Windows 7, a Play framework V2.4.1 serves a large file (near 650Mb) on localhost:8080.
I can download it from my web browser chrome.
When I try to do the same thing with Akka-http based client, I have an error described at the end of this post.
If I replace the big file by a small one (5Mb), all is ok.
Thanks for any help.
See bellow all details.
Returned error
==============
[ERROR] [07/02/2015 09:27:33.125] [MySys-akka.actor.default-dispatcher-2] [ActorSystem(MySys)] Outgoing request stream error
akka.http.scaladsl.model.IllegalResponseException: Response Content-Length 731408384 exceeds the configured limit of 8388608
at akka.http.impl.engine.client.OutgoingConnectionBlueprint$$anonfun$2.applyOrElse(OutgoingConnectionBlueprint.scala:76)
at akka.http.impl.engine.client.OutgoingConnectionBlueprint$$anonfun$2.applyOrElse(OutgoingConnectionBlueprint.scala:73)
at akka.stream.impl.fusing.Collect.onPush(Ops.scala:82)
at akka.stream.impl.fusing.Collect.onPush(Ops.scala:77)
at akka.stream.impl.fusing.OneBoundedInterpreter$$anon$1.run(Interpreter.scala:436)
at akka.stream.impl.fusing.OneBoundedInterpreter$State$class.progress(Interpreter.scala:245)
at akka.stream.impl.fusing.OneBoundedInterpreter$$anon$1.progress(Interpreter.scala:434)
at akka.stream.impl.fusing.OneBoundedInterpreter.akka$stream$impl$fusing$OneBoundedInterpreter$$execute(Interpreter.scala:580)
at akka.stream.impl.fusing.OneBoundedInterpreter$State$class.execute(Interpreter.scala:241)
at akka.stream.impl.fusing.OneBoundedInterpreter$EntryState.execute(Interpreter.scala:666)
at akka.stream.stage.AbstractStage.enterAndPush(Stage.scala:65)
at akka.stream.impl.fusing.BatchingActorInputBoundary$$anonfun$upstreamRunning$1.applyOrElse(ActorInterpreter.scala:157)
at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:36)
at akka.stream.impl.SubReceive.apply(Transfer.scala:16)
at akka.stream.impl.SubReceive.apply(Transfer.scala:12)
at scala.PartialFunction$class.applyOrElse(PartialFunction.scala:123)
at akka.stream.impl.SubReceive.applyOrElse(Transfer.scala:12)
at scala.PartialFunction$OrElse.applyOrElse(PartialFunction.scala:170)
at akka.actor.Actor$class.aroundReceive(Actor.scala:467)
at akka.stream.impl.fusing.ActorInterpreter.aroundReceive(ActorInterpreter.scala:366)
at akka.actor.ActorCell.receiveMessage(ActorCell.scala:516)
at akka.actor.ActorCell.invoke(ActorCell.scala:487)
at akka.dispatch.Mailbox.processMailbox(Mailbox.scala:238)
at akka.dispatch.Mailbox.run(Mailbox.scala:220)
at akka.dispatch.ForkJoinExecutorConfigurator$AkkaForkJoinTask.exec(AbstractDispatcher.scala:397)
at scala.concurrent.forkjoin.ForkJoinTask.doExec(ForkJoinTask.java:260)
at scala.concurrent.forkjoin.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1339)
at scala.concurrent.forkjoin.ForkJoinPool.runWorker(ForkJoinPool.java:1979)
at scala.concurrent.forkjoin.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:107)
Play framework
==============
routes :
GET / controllers.Application.url_index
application.scala :
class Application extends Controller {
def url_index = Action { Ok.sendFile(new File("c:/tmp/big_file.avi")) }
}
Downloader.scala : client side application
==========================================
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import scala.util.Failure
import scala.util.Success
import akka.actor.ActorSystem
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.impl.util._
import akka.stream.ActorMaterializer
import akka.stream.scaladsl.Sink
import akka.stream.scaladsl.Source
import akka.util.ByteString
import com.typesafe.config.Config
import com.typesafe.config.ConfigFactory
object Downloader extends App {
val config: Config = ConfigFactory.parseString(
"""
akka.http.client.parsing.max-content-length = 800m
""")
implicit val system = ActorSystem("MySys", config)
implicit val materializer = ActorMaterializer()
import system.dispatcher
val host = "localhost"
val port = 8080
val uri = "http://%s:%s".format(host, port)
println("URI=" + uri)
val result = Http().singleRequest(HttpRequest(uri = uri))
result.map(_.header[headers.Server]) onComplete {
case Success(res) =>
val responseOpt = result.value
val resp = responseOpt.get.get
val sourceDataBytes: Source[ByteString, Any] = resp.entity.dataBytes
sourceDataBytes.runForeach(
x => {
val fos = new FileOutputStream("c:/tmp1/z/tutu", true)
fos.write(x.toArray)
fos.close()
}
)
//system.shutdown()
case Failure(error) =>
println("ERROR FAILURE")
println(error)
system.shutdown()
}
}