使用 Gin 测试 CORS 中间件
Testing CORS Middleware with Gin
我正在尝试编写一个测试来验证我的 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。
我发现 this 问题与回声类似。
要测试 CORS 配置,您只需创建一个 http.Client
并检查 headers。由于 gin.Engine
实现了 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)
}
}
保持与基础相似的测试策略,你甚至可以写一个table-test来检查多个来源和Access-Control-Allow-Origin
的期望值。
我正在尝试编写一个测试来验证我的 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。 我发现 this 问题与回声类似。
要测试 CORS 配置,您只需创建一个 http.Client
并检查 headers。由于 gin.Engine
实现了 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)
}
}
保持与基础相似的测试策略,你甚至可以写一个table-test来检查多个来源和Access-Control-Allow-Origin
的期望值。