2015-08-26 14:17:30.249 14:17:30.231UTC [A4Resource] INFO c.l.a4resource.actor.FileUploadActor A4Resource-akka.actor.default-dispatcher-2 akka://A4Resource/user/http_request_handler/$a - Set request-timeout to Duration.Inf
2015-08-26 14:17:30.251 14:17:30.248UTC [A4Resource] WARN s.can.server.HttpServerConnection A4Resource-akka.actor.default-dispatcher-2 akka://A4Resource/user/IO-HTTP/listener-0/13 - command pipeline: dropped CommandWrapper(SetIdleTimeout(Duration.Inf))
Relevant Code:
application.conf:
spray.can.server {
request-timeout = 20 s
idle-timeout = 60s
}
HttpRequestCustomHandler.scala:
class HttpRequestCustomHandler(routes: Route)
extends HttpServiceActor
with FileUploadService
with ActorLogging
with GlobalConfig {
val normal = routes
val chunked = chunkedRoute()
val customReceive: Receive = {
case _: Http.Connected =>
sender ! Http.Register(self)
case r: HttpRequest =>
normal(RequestContext(r, sender(), r.uri.path).withDefaultSender(sender()))
case s@ChunkedRequestStart(HttpRequest(PUT, path, _, _, _)) =>
chunked(RequestContext(s.request, sender(), s.request.uri.path).withDefaultSender(sender()))
case Timedout(HttpRequest(method, uri, _, _, _)) =>
sender() ! HttpResponse(status = 500, entity = "The " + method + " request to '" + uri + "' has timed out...")
}
override def receive: Receive = customReceive orElse super.runRoute(routes)
}
FileUploadHandler.scala:
class FileUploadActor(client: ActorRef, request: HttpRequest, ctx: RequestContext)
extends Actor with ActorLogging with GlobalConfig {
import request._
var bytes: Array[Byte] = "".getBytes
log.info(s"Set request-timeout to ${Duration.Inf}")
client ! CommandWrapper(SetRequestTimeout(Duration.Inf))
client ! CommandWrapper(SetIdleTimeout(Duration.Inf))
def receive = {
case c: MessageChunk =>
bytes ++= c.data.toByteArray
case e: ChunkedMessageEnd =>
log.info(s"Got end of chunked request $method $uri.")
Try(saveBinaryFile(bytes)) match {
case Success(_) =>
client ! HttpResponse(StatusCodes.Created, entity = "success")
case Failure(f) =>
f.printStackTrace(); ctx.complete(HttpResponse(StatusCodes.InternalServerError, entity = "failure"))
}
client ! CommandWrapper(SetRequestTimeout(SprayCanServerRequestTimeout)) // reset timeout to original value
client ! CommandWrapper(SetRequestTimeout(SprayCanServerIdleTimeout)) // reset timeout to original value
context.stop(self)
case x => log.error(s"Unknown message: $x" )
}
}
Thanks in advance for any help!
Lakshmi