Skip to content

Instantly share code, notes, and snippets.

@tobnee
Created September 26, 2013 20:42
Show Gist options
  • Save tobnee/6720240 to your computer and use it in GitHub Desktop.
Save tobnee/6720240 to your computer and use it in GitHub Desktop.
Change the Accept header based on a query parameter in Play. (http://mysite/stuff/1?as=json)
import play.api.http.{ HeaderNames, MimeTypes }
import play.api.mvc.{ Headers, Handler, RequestHeader }
import scala.collection.mutable.ArrayBuffer
import play.api.GlobalSettings
object Global extends GlobalSettings {
override def onRequestReceived(request: RequestHeader): (RequestHeader, Handler) = {
val defaultHeader = super.onRequestReceived(request)
val (header, handler) = defaultHeader
if (header.path.startsWith("/assets/")) defaultHeader
else {
val newRequest = for {
asValue <- header.getQueryString("as")
mimeType <- mapMimeType(asValue)
requestHeader <- overrideAcceptHeader(mimeType, request)
} yield (requestHeader, handler)
newRequest.getOrElse(defaultHeader)
}
}
def mapMimeType(value: String) = value match {
case "json" => Some(MimeTypes.JSON)
case "html" => Some(MimeTypes.HTML)
case "mol" => Some("chemical/x-mdl-molfile")
case _ => None
}
def overrideAcceptHeader(mineType: String, requestHeader: RequestHeader) =
requestHeader.headers.get(HeaderNames.ACCEPT)
.map(header => newReq(requestHeader, mineType + "," + header))
def newReq(header: RequestHeader, newAccept: String) = new RequestHeader {
def uri = header.uri
def remoteAddress = header.remoteAddress
def queryString = header.queryString
def method = header.method
def headers: Headers = new Headers {
protected val data =
header.headers.toMap
.updated(HeaderNames.ACCEPT, ArrayBuffer(newAccept)).toSeq
}
def path = header.path
def version = header.version
def tags = header.tags
def id: Long = header.id
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment