in app/controllers/PreferencesProxy.scala [22:54]
private def proxyRequest(relativePath: String) = APIAuthAction(parse.byteString).async { request =>
val url = s"${config.preferencesUrl}/$relativePath"
val requestHeaders = request.headers.toSimpleMap + (
"Host" -> config.preferencesHost
)
val requestBody = if (request.hasBody) {
InMemoryBody(request.body)
} else {
EmptyBody
}
wsClient.url(url)
.withHttpHeaders(requestHeaders.toSeq: _*)
.withBody(requestBody)
.withFollowRedirects(false) // ensure browser handles all redirects NOT this proxy
.execute(request.method)
.map { response =>
val responseHeaders = response.headers.view.mapValues(_.head).toMap + (
"Cache-Control" -> "private, no-cache, no-store, must-revalidate, max-age=0", // do not cache whatsoever
)
new Status(response.status)(response.bodyAsBytes)
.withHeaders(responseHeaders.removed("Content-Type").toSeq: _*)
.as(responseHeaders.getOrElse("Content-Type", "application/octet-stream"))
}
.recover {
case _ if config.isDev =>
TemporaryRedirect( // this ensures PUT doesn't get transformed to GET, see https://developer.mozilla.org/en-US/docs/Web/HTTP/Redirections#temporary_redirections
url.replaceAll(Dev.appDomain, Code.appDomain)
)
case e =>
logger.error(s"Error proxying request to $url", e)
InternalServerError
}
}