为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Gin 测试 CORS 中间件

使用 Gin 测试 CORS 中间件

Go
慕村9548890 2022-06-01 16:45:49
我正在尝试编写一个测试来验证我的 API 的 CORS 设置是否正确。API 用 Go 编写并使用 GIN。我有不同的 CORS 设置,具体取决于路由器组。看起来像:router := gin.New()router.Use(gin.Recovery())domainOneCORS := cors.New(cors.Config{  AllowOrigins:  []string{"https://domainone.com"},  AllowMethods:  []string{"GET", "POST", "PUT", "DELETE", "PATCH"},  AllowHeaders:  []string{"Authorization", "Content-Length", "Content-Type", "Origin"},  ExposeHeaders: []string{"Content-Length"},  MaxAge:        12 * time.Hour,})domainTwoCORS := cors.New(cors.Config{  AllowOrigins:  []string{"https://domaintwo.com"},  AllowMethods:  []string{"GET", "POST", "PUT", "DELETE", "PATCH"},  AllowHeaders:  []string{"Authorization", "Content-Length", "Content-Type", "Origin"},  ExposeHeaders: []string{"Content-Length"},  MaxAge:        12 * time.Hour,})domainOneAPI := router.Group("/one")domainOneAPI.Use(domainOneCORS){  domainOneAPI.GET("", handler.DomainOneHealth)}domainTwoAPI := router.Group("/two")domainTwoAPI.Use(domainTwoCORS){  domainTwoAPI.GET("", handler.DomainTwoHealth)}我试图找出测试我的配置的最佳方法。我发现的大多数测试都使用处理程序并跳过路由器中间件部分。测试它有意义吗?即使我可以模拟出路由器和响应,也只是确认 HTTP 客户端可以访问端点。不验证不同域上的 Web 应用程序可以访问 API。我发现这个问题很相似,但对于回声。
查看完整描述

1 回答

?
交互式爱情

TA贡献1712条经验 获得超3个赞

要测试 CORS 配置,您可以简单地创建http.Client并检查标头。由于gin.Engineimplements http.Handler,您可以利用httptest.Server类似这样的东西:


func TestCors(t *testing.T) {

    r := // create your GIN router with middleware config here

    origin := // The allowed origin that you want to check


    server := httptest.NewServer(r)

    defer server.Close()


    client := &http.Client{}

    req, _ := http.NewRequest(

        "GET",

        "http://"+server.Listener.Addr().String()+"/api",

        nil,

    )

    req.Header.Add("Origin", origin)


    get, err := client.Do(req)

    if err != nil {

        t.Fatal(err)

    }


    // You should get your origin (or a * depending on your config) if the

    // passed origin is allowed.

    o := get.Header.Get("Access-Control-Allow-Origin")

    if o != origin {

        t.Errorf("Got '%s' ; expecting origin '%s'", o, origin)

    }

}

保持类似的测试策略作为基础,您甚至可以编写一个表测试来检查多个来源和Access-Control-Allow-Origin.


查看完整回答
反对 回复 2022-06-01
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信