Hi,

I didn't find a counterpart of mapRequestContext in akka-http, so I just 
allow all the methods I have in my route. Here is my shot at CORS in 
akka-http:

import akka.http.scaladsl.model.HttpMethods._
import akka.http.scaladsl.model.HttpResponse
import akka.http.scaladsl.model.headers._
import akka.http.scaladsl.server.Directives._
import akka.http.scaladsl.server.{AuthenticationFailedRejection, Directive0, 
RejectionHandler, Route}
import com.typesafe.config.ConfigFactory

trait CorsSupport {
  lazy val allowedOrigin = {
    val config = ConfigFactory.load()
    val sAllowedOrigin = config.getString("cors.allowed-origin")
    HttpOrigin(sAllowedOrigin)
  }

  //this directive adds access control headers to normal responses
  private def addAccessControlHeaders: Directive0 = {
    mapResponseHeaders { headers =>
      `Access-Control-Allow-Origin`(allowedOrigin) +:
        `Access-Control-Allow-Credentials`(true) +:
        `Access-Control-Allow-Headers`("Authorization", "Content-Type", 
"X-Requested-With") +:
        headers
    }
  }

  //this handles preflight OPTIONS requests. TODO: see if can be done with 
rejection handler,
  //otherwise has to be under addAccessControlHeaders
  private def preflightRequestHandler: Route = options {
    complete(HttpResponse(200).withHeaders(
      `Access-Control-Allow-Methods`(OPTIONS, POST, PUT, GET, DELETE)
    )
    )
  }

  def corsHandler(r: Route) = addAccessControlHeaders {
    preflightRequestHandler ~ r
  }
}


you may notice I take allowed origin from the config file option 
"cors.allowed-origin". I mix this trait into my class which contains a 
route I want to handle CORS and wrap the route into corsHandler like so:

corsHandler {
  path("") { ... }

}



On Tuesday, March 10, 2015 at 4:14:53 PM UTC+2, Ganta Murali Krishna wrote:
>
> Hello,
>
> I am currently experimenting with Akka-http on one of our modules. *Below 
> (or attached) is my current CORS file for spray*. I am struggling with 
> conversion, for e.g.: I cant find alternative to mapRequestContext. Can 
> any help me to rewrite/convert this please. So I can use this with 
> akka-http. Any help is appreciated.
>
> Regards
> Murali
>
> import spray.http.{HttpMethods, HttpMethod, HttpResponse, AllOrigins}
> import spray.http.HttpHeaders._
> import spray.http.HttpMethods._
> import spray.routing._
>
> trait CORSSupport {
>   this: HttpService =>
>   private val allowOriginHeader = `Access-Control-Allow-Origin`(AllOrigins)
>   private val optionsCorsHeaders = List(
>     `Access-Control-Allow-Headers`("Origin, 
> X-Requested-With,Authorization,Content-Type, Accept, Accept-Encoding, 
> Accept-Language, Host, Referer, User-Agent,apiKey"),
>     `Access-Control-Max-Age`(1728000))
>
>   def cors[T]: Directive0 = mapRequestContext { ctx => 
> ctx.withRouteResponseHandling({
>     //It is an option requeset for a resource that responds to some other 
> method
>     case Rejected(x) if (ctx.request.method.equals(HttpMethods.OPTIONS) && 
> !x.filter(_.isInstanceOf[MethodRejection]).isEmpty) => {
>       val allowedMethods: List[HttpMethod] = 
> x.filter(_.isInstanceOf[MethodRejection]).map(rejection => {
>         rejection.asInstanceOf[MethodRejection].supported
>       })
>       ctx.complete(HttpResponse().withHeaders(
>         `Access-Control-Allow-Methods`(OPTIONS, allowedMethods: _*) :: 
> allowOriginHeader ::
>           optionsCorsHeaders
>       ))
>     }
>   }).withHttpResponseHeadersMapped { headers =>
>     allowOriginHeader :: headers
>   }
>   }
> }
>
>

-- 
>>>>>>>>>>      Read the docs: http://akka.io/docs/
>>>>>>>>>>      Check the FAQ: 
>>>>>>>>>> http://doc.akka.io/docs/akka/current/additional/faq.html
>>>>>>>>>>      Search the archives: https://groups.google.com/group/akka-user
--- 
You received this message because you are subscribed to the Google Groups "Akka 
User List" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/akka-user.
For more options, visit https://groups.google.com/d/optout.

Reply via email to