2016-12-30 7 views
0

Я использовал Network.Wai.Middleware.Cors «s simpleCors, она работала должным образом для GET запросов, но когда я пытаюсь сделать POST запрос я получаю следующую задачуHaskell Йесод - CORS проблемы с браузерами OPTIONS запросов при выполнении POST запросы

OPTIONS /users 
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
    Status: 400 Bad Request 0.032443s 

единственный способ, которым я был в состоянии сделать это работа удалением simpleCors из следующей части в Application.hs

-- | Convert our foundation to a WAI Application by calling @[email protected] and 
-- applying some additional middlewares. 
makeApplication :: App -> IO Application 
makeApplication foundation = do 
    logWare <- makeLogWare foundation 
    -- Create the WAI application and apply middlewares 
    appPlain <- toWaiAppPlain foundation 
    return $ logWare $ defaultMiddlewaresNoLogging $ simpleCors $ appPlain 

и добавив OPTIONS Метод ответа

optionsNewUserR :: Handler RepPlain 
optionsNewUserR = do 
    return $ RepPlain $ toContent ("" :: Text) 

и добавление заголовков CORS ... Но это грязное решение, потому что я должен был бы изменить все мои обработчики API! Любая помощь высоко ценится!

ответ

1

Я считаю, что проблема заключается в том, что simpleCors построен вне simpleCorsResourcePolicy, который охватывает только simpleMethods, который не охватывает OPTIONS.

Вы можете исправить эту проблему, используя те же методы, что и рулон любого необходимого промежуточного программного обеспечения.

Вот один я использую для OPTIONS проблемы вы описали:

{-# LANGUAGE OverloadedStrings #-} 

module Middlewares where 

import Network.Wai      (Middleware) 
import Network.Wai.Middleware.AddHeaders (addHeaders) 
import Network.Wai.Middleware.Cors  (CorsResourcePolicy(..), cors) 

-- | @[email protected] allowance. 
-- The following header will be set: @Access-Control-Allow-Headers: [email protected] 
allowCsrf :: Middleware 
allowCsrf = addHeaders [("Access-Control-Allow-Headers", "x-csrf-token,authorization")] 

-- | CORS middleware configured with 'appCorsResourcePolicy'. 
corsified :: Middleware 
corsified = cors (const $ Just appCorsResourcePolicy) 

-- | Cors resource policy to be used with 'corsified' middleware. 
-- 
-- This policy will set the following: 
-- 
-- * RequestHeaders: @[email protected] 
-- * MethodsAllowed: @OPTIONS, GET, PUT, [email protected] 
appCorsResourcePolicy :: CorsResourcePolicy 
appCorsResourcePolicy = CorsResourcePolicy { 
    corsOrigins  = Nothing 
    , corsMethods  = ["OPTIONS", "GET", "PUT", "POST"] 
    , corsRequestHeaders = ["Authorization", "Content-Type"] 
    , corsExposedHeaders = Nothing 
    , corsMaxAge   = Nothing 
    , corsVaryOrigin  = False 
    , corsRequireOrigin = False 
    , corsIgnoreFailures = False 
} 

А потом просто сочинить вам нужно промежуточное программное как вы уже делаете:

run port $ logger . allowCsrf . corsified $ app cfg 
+0

На самом деле я был в правильный путь, я сделал то же, что и вы, по сравнению с реализацией simpleCors, но вместо 'corsRequestHeaders = [" Authorization "," Content-Type "]' Я использовал 'corsRequestHeaders = []'. Что делает эта часть? Другое дело, что IDE/Editor вы используете для кодирования в Haskell :)? – FtheBuilder

+0

Другое дело, мне пришлось добавить 'import Prelude' – FtheBuilder

+1

Документация - ваш друг! Проверьте https://hackage.haskell.org/package/wai-cors-0.2.5/docs/src/Network.Wai.Middleware.Cors.html#corsMethods Ваш проект должен исключать Прелюдию по всему миру, возможно? Я просто использую Sublime Text или Vim, но это, вероятно, более общие вопросы, подходящие для обсуждения вне темы! – Mario