Skip to content

Instantly share code, notes, and snippets.

@evantill
Created October 8, 2013 10:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evantill/6882766 to your computer and use it in GitHub Desktop.
Save evantill/6882766 to your computer and use it in GitHub Desktop.
some spray RequestTransformer example with Lenses
trait SprayContribForRequestTransformer {
object HttpRequestBuilderLens {
val queryLens = new Lens[Uri, Query] {
def get(c: Uri): Query = c.query
def set(c: Uri)(f: Query): Uri = c.copy(query = f)
}
val uriLens = new Lens[HttpRequest, Uri] {
def get(c: HttpRequest): Uri = c.uri
def set(c: HttpRequest)(f: Uri): HttpRequest = c.copy(uri = f)
}
val headersLens = new Lens[HttpRequest, List[HttpHeader]] {
def get(c: HttpRequest): List[HttpHeader] = c.headers
def set(c: HttpRequest)(f: List[HttpHeader]): HttpRequest = c.withHeaders(f)
}
def byLowercaseNameF(lowercaseName:String): HttpHeader => Boolean = _.isNot(lowercaseName)
val queryFromHttpRequestLens = queryLens.compose(uriLens)
def singleHeaderByNameLens(lowercaseName: String) = new Lens[List[HttpHeader], Option[HttpHeader]] {
val byLowercaseName = byLowercaseNameF(lowercaseName)
def get(c: List[HttpHeader]): Option[HttpHeader] = c.find(byLowercaseName)
def set(c: List[HttpHeader])(f: Option[HttpHeader]): List[HttpHeader] = f match {
case None => c.filterNot(byLowercaseName)
case Some(h) => c :+ h
}
}
def singleHeaderByNameFromHttpRequestLens(lowercaseName: String) = singleHeaderByNameLens(lowercaseName).compose(headersLens)
}
object HttpTransformerContrib {
type HeadersTransformer = List[HttpHeader]=>List[HttpHeader]
import HttpRequestBuilderLens._
def withQuery(q:Query):RequestTransformer = queryFromHttpRequestLens.set(_)(q)
def withQueryTransformer(f:Query=>Query):RequestTransformer = queryFromHttpRequestLens.modify(_)(f)
def withQueryParameter(kv:(String,String)):RequestTransformer = queryFromHttpRequestLens.modify(_)(kv +: _)
def withSingleValueHeader(h:HttpHeader):RequestTransformer = singleHeaderByNameFromHttpRequestLens(h.lowercaseName).set(_)(Some(h))
def withHeaderTransformer(f:HeadersTransformer) :RequestTransformer = headersLens.modify(_)(f)
def withoutHeader(lowercaseName:String):RequestTransformer = headersLens.modify(_)(_.filter(byLowercaseNameF(lowercaseName)))
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment