-
-
Save pcting/2e65c36f868c5cee7d6a to your computer and use it in GitHub Desktop.
import akka.http.scaladsl.model.HttpHeader | |
import akka.http.scaladsl.model.HttpMethods._ | |
import akka.http.scaladsl.model.HttpResponse | |
import akka.http.scaladsl.model.headers.`Access-Control-Allow-Credentials` | |
import akka.http.scaladsl.model.headers.`Access-Control-Allow-Methods` | |
import akka.http.scaladsl.model.headers.`Access-Control-Allow-Origin` | |
import akka.http.scaladsl.model.headers.Origin | |
import akka.http.scaladsl.server.Directive0 | |
import akka.http.scaladsl.server.Directives._ | |
import akka.http.scaladsl.server.MethodRejection | |
import akka.http.scaladsl.server.RejectionHandler | |
trait CorsSupport { | |
protected def corsAllowOrigins: List[String] | |
protected def corsAllowedHeaders: List[String] | |
protected def corsAllowCredentials: Boolean | |
protected def optionsCorsHeaders: List[HttpHeader] | |
protected def corsRejectionHandler(allowOrigin: `Access-Control-Allow-Origin`) = RejectionHandler | |
.newBuilder().handle { | |
case MethodRejection(supported) => | |
complete(HttpResponse().withHeaders( | |
`Access-Control-Allow-Methods`(OPTIONS, supported) :: | |
allowOrigin :: | |
optionsCorsHeaders | |
)) | |
} | |
.result() | |
private def originToAllowOrigin(origin: Origin): Option[`Access-Control-Allow-Origin`] = | |
if (corsAllowOrigins.contains("*") || corsAllowOrigins.contains(origin.value)) | |
origin.origins.headOption.map(`Access-Control-Allow-Origin`.apply) | |
else | |
None | |
def cors[T]: Directive0 = mapInnerRoute { route => context => | |
((context.request.method, context.request.header[Origin].flatMap(originToAllowOrigin)) match { | |
case (OPTIONS, Some(allowOrigin)) => | |
handleRejections(corsRejectionHandler(allowOrigin)) { | |
respondWithHeaders(allowOrigin, `Access-Control-Allow-Credentials`(corsAllowCredentials)) { | |
route | |
} | |
} | |
case (_, Some(allowOrigin)) => | |
respondWithHeaders(allowOrigin, `Access-Control-Allow-Credentials`(corsAllowCredentials)) { | |
route | |
} | |
case (_, _) => | |
route | |
})(context) | |
} | |
} |
... | |
object Main extends App with CorsSupport { | |
override val corsAllowOrigins: List[String] = List("*") | |
override val corsAllowedHeaders: List[String] = List("Origin", "X-Requested-With", "Content-Type", "Accept", "Accept-Encoding", "Accept-Language", "Host", "Referer", "User-Agent") | |
override val corsAllowCredentials: Boolean = true | |
override val optionsCorsHeaders: List[HttpHeader] = List[HttpHeader]( | |
`Access-Control-Allow-Headers`(corsAllowedHeaders.mkString(", ")), | |
`Access-Control-Max-Age`(60 * 60 * 24 * 20), // cache pre-flight response for 20 days | |
`Access-Control-Allow-Credentials`(corsAllowCredentials) | |
) | |
val routes = cors { | |
complete("CORS YES!") | |
} | |
... | |
} |
Hello,
it is not working in this situation:
`
final case class RequestContent(obj: String)
// collect your json format instances into a support trait:
trait JsonSupport extends SprayJsonSupport with DefaultJsonProtocol {
implicit val requestFormat = jsonFormat1(RequestContent) // contains List[Item]
}
class MyRoute extends Directives with CorsSupport with JsonSupport {
override val corsAllowOrigins: List[String] = List("http://localhost:8080")
override val corsAllowedHeaders: List[String] = List("Access-Control-Allow-Origin", "Access-Control-Allow-Headers", "Origin", "X-Requested-With", "Content-Type", "Accept", "Accept-Encoding", "Accept-Language", "Host", "Referer", "User-Agent", "Authorization")
override val corsAllowCredentials: Boolean = true
override val optionsCorsHeaders: List[HttpHeader] = List[HttpHeader](
Access-Control-Allow-Methods
(OPTIONS, POST),
Access-Control-Allow-Headers
(corsAllowedHeaders.mkString(", ")),
Access-Control-Max-Age
(60 * 60 * 24 * 20), // cache pre-flight response for 20 days
Access-Control-Allow-Credentials
(corsAllowCredentials)
)
def defineRoute() = {
val route = cors {
path("crawler") {
post {
// decompress gzipped or deflated requests if required
entity(as[RequestContent]) { content =>
print("req")
complete("handled")
}
}
}
}
route
}
}
`
But if i put the complete statement outside of the entity statement and remove the entity statement it works well. Could you help me fix this problem please. Thank you
How I can setup in the CORs the content-type, in order to restrict to specified format. ?
Ex. I would like that the payload only accept : 'Content-Type', 'application/json'
Regards,
Angel Figueroa