package dispatch
trait Threads extends Http with FuturableExecutor {
override val client = new ThreadSafeHttpClient
def shutdown() = client.getConnectionManager.shutdown()
}
trait FuturableExecutor extends HttpExecutor {
import dispatch.futures.Futures
def on_error (error: PartialFunction[Throwable, Unit]) = new FuturableExecutor {
val execute = FuturableExecutor.this.execute
type HttpPackage[T] = FuturableExecutor.this.HttpPackage[T]
def pack[T](result: => T) = try { FuturableExecutor.this.pack(result) } catch {
case e if error.isDefinedAt(e) => error(e); throw e
}
override def http_future = FuturableExecutor.this.http_future
}
lazy val future = new HttpExecutor {
val execute = FuturableExecutor.this.execute
type HttpPackage[T] = Futures.Future[FuturableExecutor.this.HttpPackage[T]]
def pack[T](result: => T) = http_future.future(FuturableExecutor.this.pack(result))
}
def http_future: Futures = dispatch.futures.DefaultFuture
}
class ThreadSafeHttpClient extends ConfiguredHttpClient {
import org.apache.http.conn.scheme.{Scheme,SchemeRegistry,PlainSocketFactory}
import org.apache.http.conn.ssl.SSLSocketFactory
import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager
override def createClientConnectionManager() = {
val registry = new SchemeRegistry()
registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80))
registry.register(new Scheme("https", SSLSocketFactory.getSocketFactory(), 443))
new ThreadSafeClientConnManager(getParams(), registry)
}
}