2017-06-04 4 views
5

CORS要求を受け入れるSuave APIを取得しようとしています。SuaveでCORSで複数のヘッダーを許可する

http://www.fssnip.net/mL/title/CORS-response-with-Suave

私はここに再作成されます:私はここに、このスニペット続いてきた

let setCORSHeaders = 
    setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "content-type" 

let allow_cors : WebPart = 
    choose [ 
     OPTIONS >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> OK "CORS approved") 
    ] 

let webSite = 
    choose [ 
     allow_cors 
     GET >=> OK "URLs are for wimps. GETting something? This is what you get." 
    ] 

をしかし、今、私は中に渡されるトークンを必要とするエンドポイントを持って、そしてこれらのエンドポイントは、エラーを与えていますCORSの許可されたヘッダーがないために発生します。私のトークンヘッダーは単純に "トークン"なので、私は2つのことを試みましたが、どちらも問題を解決していません。

試み#1

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "content-type" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 

これはcontent-typeはもはや受け入れられたと言っていないエラーが返さ - これが最後のsetHeaderは最初のものを上書きすることを暗示しているようだ、あなたはここにソースコードを表示:https://github.com/SuaveIO/suave/blob/master/src/Suave.Tests/HttpWriters.fsを、113行目には、これが望ましい動作であることを意味するテストがあります。この質問への応答に基づいて

試み#2

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "Content-Type,token" 

しかし、これは、その後を示すエラーを与えた: How to set a Json response in suave webpart、私は、カンマで区切ったリストを経由して、両方のヘッダーを設定しようとしましたCORSは完全に失敗していました。

No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:4200' is therefore not allowed access. The response had HTTP status code 401. 

また、この同じ質問に基づいて、私はf ollowing:この応答を与えた

setHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers:content-type" "Accept" 
    >=> setHeader "Access-Control-Allow-Headers:token" "Accept" 

Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.だから、

、私はサーブでCORSリクエストのヘッダーの任意の量を許可しますか?

編集

試み#3

私はaddHeaderの代わりsetHeaderを使用:今言っている

let setCORSHeaders = 
    setHeader "Access-Control-Allow-Origin" "*" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Headers" "token" 

... No 'Access-Control-Allow-Origin' header is present on the requested resource.

私がいることを変更した場合最初にsetHeaderからaddHeaderまでは、私はまだ同じ応答を得ています。

修正

addHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Methods" "GET,POST,PUT" 

仕事をした - この後、送信されたもので問題はなかったが、CORS自体でより多くの何も。

答えて

4

setHeaderの代わりにaddHeaderを試してみてください。わずか数行さらに下にあなたが見つかったユニットテストでは、それはあなたが探している意味を持っていることを示してaddHeaderのテストがありますし、そのドキュメントは言う:

が与えられたとヘッダーキーを追加します。そのヘッダがすでに存在していても、返されたヘッダのリストに値を設定します。これは、Suaveがkeyというヘッダーを持つ応答を提供する可能性があることを意味します。

これはあなたが望む動作のようです。

+0

これは理にかなっていて、簡単に適用することができたので、当然それはまだ壊れています:(上記の編集を参照してください。 – Max

+0

https://www.html5rocks.com/en/tutorials/cors/は 'Access-Control -Allow-Methods'も必要ですが、どこに設定していますか?そうでない場合は、実際の問題は 'Access-Control-Allow-Methods'ヘッダがなく、エラーメッセージが誤解を招く可能性があります。この時点で推測するだけです。私は、https://www.html5rocks.com/en/tutorials/cors/を読んで、CORSヘッダーの正しいセットを見つけるまで、さまざまなヘッダーの組み合わせを試してみるといいでしょう。 – rmunn

+0

これは私を正しい方向に導いてくれます - それは全体の 'Suave.CORS'名前空間があることが判明しました。私はこれまでずっと使っていたかもしれません。 – Max

1

私は同様の問題がありました。私はSuave 2.2.1が利用可能であるにもかかわらず、従来の理由のために、バージョン1.1.3の瞬間に固執しています。私は、F#と本当に慣れていないんだけど、最終的に私はこのようなsomehtingでこの作業を取得するために管理:

let setCORSHeaders = 
    addHeader "Access-Control-Allow-Origin" "*" 
    >=> setHeader "Access-Control-Allow-Headers" "token" 
    >=> addHeader "Access-Control-Allow-Headers" "content-type" 
    >=> addHeader "Access-Control-Allow-Methods" "GET,POST,PUT" 

let app = 
    choose [ 
     GET >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> choose 
         [ pathRegex "(.*?)\.(dll|mdb|log)$" >=> dllFilesRequest 
         pathRegex "(.*?)\.(html|css|js|png|jpg|ico|bmp)$" >=> staticFilesRequest 

         path "/" >=> indexRequest 
         path "/index" >=> indexRequest 
         path "/static" >=> staticFilesRequest 
         // ... 
         ]) 

     POST >=> 
      fun context -> 
       context |> (
        setCORSHeaders 
        >=> choose 
         [ 
         path "/something" >=> runSomething 
         // ... 
         ]) 
    ] 

私はpretierの方法があることを確認しています。

関連する問題