app/com/gu/viewer/proxy/PreviewSession.scala (53 lines of code) (raw):

package com.gu.viewer.proxy import play.api.mvc.{Cookie, Cookies, Session, DefaultCookieHeaderEncoding} case class PreviewSession(sessionCookie: Option[String] = None, authCookie: Option[String] = None, returnUrl: Option[String] = None, private val playSession: Session = Session()) { def asCookies: Seq[Cookie] = Seq( authCookie.map(Cookie(PreviewSession.COOKIE_PREVIEW_AUTH, _)), sessionCookie.map(Cookie(PreviewSession.COOKIE_PREVIEW_SESSION, _)) ).flatten def asSessionPairs: Seq[(String, Option[String])] = { import PreviewSession._ Seq( SESSION_KEY_PREVIEW_SESSION -> sessionCookie, SESSION_KEY_PREVIEW_AUTH -> authCookie, SESSION_KEY_RETURN_URL -> returnUrl) } def asPlaySession: Session = asSessionPairs.foldLeft(playSession) { (session: Session, p: (String, Option[String])) => p match { case (key, Some(value)) => session + (key, value) case (key, None) => session - key } } def withPlaySessionFrom(other: PreviewSession): PreviewSession = copy(playSession = other.playSession) def withReturnUrl(returnUrl: Option[String]): PreviewSession = copy(returnUrl = returnUrl) def withoutReturnUrl: PreviewSession = copy(returnUrl = None) } object PreviewSession extends DefaultCookieHeaderEncoding { private val COOKIE_PREVIEW_SESSION = "PLAY_SESSION" private val COOKIE_PREVIEW_AUTH = "GU_PV_AUTH" private val SESSION_KEY_PREVIEW_SESSION = "preview-session" private val SESSION_KEY_PREVIEW_AUTH = "preview-auth" private val SESSION_KEY_RETURN_URL = "preview-auth-return-url" def apply(session: Session): PreviewSession = PreviewSession( session.get(SESSION_KEY_PREVIEW_SESSION), session.get(SESSION_KEY_PREVIEW_AUTH), session.get(SESSION_KEY_RETURN_URL), session ) def fromResponseHeaders(response: ProxyResponse): PreviewSession = { def extractCookies(headerName: String, transformer: Option[String] => Cookies) = response.allHeaders.get(headerName).map { _.flatMap { h => transformer(Some(h)) } } val allCookies = ( extractCookies("Set-Cookie", fromSetCookieHeader) ++ extractCookies("Cookie", fromCookieHeader) ).flatten.groupBy(_.name).view.mapValues(_.head.value) PreviewSession(allCookies.get(COOKIE_PREVIEW_SESSION), allCookies.get(COOKIE_PREVIEW_AUTH)) } }