在Suave中允许使用CORS的多个标头

Max*_*Max 6 f# suave

我正在尝试让我的Suave API接受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."
    ]
Run Code Online (Sandbox Code Playgroud)

但是现在我的端点需要传入令牌,并且由于CORS中缺少允许的头,这些端点会出错.我的令牌标题只是"令牌",所以我尝试了两件事,但都没有解决问题.

尝试#1

    setHeader  "Access-Control-Allow-Origin" "*"
    >=> setHeader "Access-Control-Allow-Headers" "content-type"
    >=> setHeader "Access-Control-Allow-Headers" "token"
Run Code Online (Sandbox Code Playgroud)

这返回了一个错误,说content-type不再被接受 - 这似乎暗示最后一个setHeader覆盖了第一个,当你在这里查看源代码时:https://github.com/SuaveIO/suave/blob/master/src/Suave .Tests/HttpWriters.fs,在第113行,有一个测试,对我来说暗示这是所需的行为.

尝试#2

基于对此问题的响应:如何在suave webpart中设置Json响应,我尝试通过逗号分隔列表设置两个标头:

    setHeader  "Access-Control-Allow-Origin" "*"
    >=> setHeader "Access-Control-Allow-Headers" "Content-Type,token"
Run Code Online (Sandbox Code Playgroud)

但是这给出了一个错误,表明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.
Run Code Online (Sandbox Code Playgroud)

同样根据同样的问题,我尝试了以下方法:

    setHeader  "Access-Control-Allow-Origin" "*"
    >=> setHeader "Access-Control-Allow-Headers:content-type" "Accept"
    >=> setHeader "Access-Control-Allow-Headers:token" "Accept"
Run Code Online (Sandbox Code Playgroud)

哪个回复: Request header field token is not allowed by Access-Control-Allow-Headers in preflight response.

那么,如何在Suave的CORS请求中允许任意数量的标头?

编辑

尝试#3

我使用addHeader而不是setHeader:

let setCORSHeaders =
    setHeader  "Access-Control-Allow-Origin" "*"
    >=> addHeader "Access-Control-Allow-Headers" "content-type"
    >=> addHeader "Access-Control-Allow-Headers" "token"
Run Code Online (Sandbox Code Playgroud)

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

如果我改变,首先setHeaderaddHeader,我仍然得到同样的答复.

固定

    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" 
Run Code Online (Sandbox Code Playgroud)

这项工作 - 在此之后,发送的内容存在问题,但CORS本身也没有问题.

rmu*_*unn 5

尝试使用addHeader而不是setHeader.在你发现的单元测试中只有几行,有一个测试addHeader表明它有你正在寻找的语义,它的文档说:

将具有给定值的标头密钥添加到返回标头列表中,即使该标头已存在.这意味着Suave将使用由key可能不同的值表示的标题提供响应.

这看起来像你想要的行为.