Permitiendo peticiones de origen cruzado en Yesod
Mi aplicación utiliza un bookmarklet, y necesito permitir que CORSMyRouteR
así que mi código de bookmarklet puede usar esta ruta para solicitudes AJAX.
En mi primer borrador de config / rutas diMyRouteR
soporte para un solo método de solicitud, PUT. Pero resultó (duh) que también tendría que admitir el método OPTIONS, que los navegadores utilizan para las solicitudes de verificación previa de CORS.
Terminé con lo siguiente en configuración / rutas:
/myroute MyRouteR PUT OPTIONS
Tenía la esperanza de que hubiera alguna maquinaria relevante en la plantilla de Haskell que procesara configuración / rutas para que la adición de OPCIONES a la lista de métodos de esta ruta resultara automáticamente en el soporte de CORS, pero no en dados. No es el fin del mundo, pero habría tenido sentido y se habría sentido elegante de esa manera.
Para hacer que CORS funcione, le di a la ruta un manejador de OPCIONES:
optionsMyRouteR :: Handler RepPlain
optionsMyRouteR = do
addHeader "Access-Control-Allow-Origin" "*"
addHeader "Access-Control-Allow-Methods" "PUT, OPTIONS"
return $ RepPlain $ toContent ("" :: Text)
putMyRouteR :: Handler RepJson
putMyRouteR = do
addHeader "Access-Control-Allow-Origin" "*"
-- more stuff ...
Esto funciona, pero se siente un poco no yesódico porque es muy repetitivo. Entonces, dos preguntas:
¿Tenemos un adjetivo mejor que Yesodic?¿Hay alguna otra forma mejor de permitir que una ruta admita solicitudes de origen cruzado?