pekko/akka-http/src/main/scala/akka/http/Servlet30Context.scala

70 lines
2.1 KiB
Scala
Raw Normal View History

/**
* Copyright (C) 2009-2011 Scalable Solutions AB <http://scalablesolutions.se>
*/
package akka.http
import javax.servlet. {AsyncContext, AsyncListener, AsyncEvent};
import Types._
/**
* @author Garrick Evans
*/
trait Servlet30Context extends AsyncListener with akka.util.Logging
{
import javax.servlet.http.HttpServletResponse
import MistSettings._
val builder: () => tAsyncRequestContext
val context: Option[tAsyncRequestContext] = Some(builder())
def go = context.isDefined
protected val _ac: AsyncContext = {
val ac = context.get.asInstanceOf[AsyncContext]
ac setTimeout DefaultTimeout
ac addListener this
ac
}
def suspended = true
def timeout(ms: Long): Boolean = {
try {
_ac setTimeout ms
true
}
catch {
case ex: IllegalStateException =>
2010-11-24 13:42:41 +01:00
log.slf4j.info("Cannot update timeout - already returned to container")
false
}
}
//
// AsyncListener
//
def onComplete(e: AsyncEvent) {}
def onError(e: AsyncEvent) = e.getThrowable match {
2010-11-24 13:42:41 +01:00
case null => log.slf4j.warn("Error occured...")
case t => log.slf4j.warn("Error occured", t)
}
def onStartAsync(e: AsyncEvent) {}
def onTimeout(e: AsyncEvent) = {
e.getSuppliedResponse.asInstanceOf[HttpServletResponse].addHeader(ExpiredHeaderName, ExpiredHeaderValue)
e.getAsyncContext.complete
}
}
object Servlet30ContextMethodFactory extends RequestMethodFactory {
def Delete(f: () => tAsyncRequestContext): RequestMethod = new Delete(f) with Servlet30Context
def Get(f: () => tAsyncRequestContext): RequestMethod = new Get(f) with Servlet30Context
def Head(f: () => tAsyncRequestContext): RequestMethod = new Head(f) with Servlet30Context
def Options(f: () => tAsyncRequestContext): RequestMethod = new Options(f) with Servlet30Context
def Post(f: () => tAsyncRequestContext): RequestMethod = new Post(f) with Servlet30Context
def Put(f: () => tAsyncRequestContext): RequestMethod = new Put(f) with Servlet30Context
def Trace(f: () => tAsyncRequestContext): RequestMethod = new Trace(f) with Servlet30Context
}