You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cors_test.go 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. // Copyright 2019 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package integration
  4. import (
  5. "net/http"
  6. "testing"
  7. "code.gitea.io/gitea/modules/setting"
  8. "code.gitea.io/gitea/modules/test"
  9. "code.gitea.io/gitea/routers"
  10. "code.gitea.io/gitea/tests"
  11. "github.com/stretchr/testify/assert"
  12. )
  13. func TestCORS(t *testing.T) {
  14. defer tests.PrepareTestEnv(t)()
  15. t.Run("CORS enabled", func(t *testing.T) {
  16. defer test.MockVariableValue(&setting.CORSConfig.Enabled, true)()
  17. defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
  18. t.Run("API with CORS", func(t *testing.T) {
  19. // GET api with no CORS header
  20. req := NewRequest(t, "GET", "/api/v1/version")
  21. resp := MakeRequest(t, req, http.StatusOK)
  22. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  23. assert.Contains(t, resp.Header().Values("Vary"), "Origin")
  24. // OPTIONS api for CORS
  25. req = NewRequest(t, "OPTIONS", "/api/v1/version")
  26. req.Header.Set("Origin", "https://example.com")
  27. req.Header.Set("Access-Control-Request-Method", "GET")
  28. resp = MakeRequest(t, req, http.StatusOK)
  29. assert.NotEmpty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  30. assert.Contains(t, resp.Header().Values("Vary"), "Origin")
  31. })
  32. t.Run("Web with CORS", func(t *testing.T) {
  33. // GET userinfo with no CORS header
  34. req := NewRequest(t, "GET", "/login/oauth/userinfo")
  35. resp := MakeRequest(t, req, http.StatusUnauthorized)
  36. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  37. assert.Contains(t, resp.Header().Values("Vary"), "Origin")
  38. // OPTIONS userinfo for CORS
  39. req = NewRequest(t, "OPTIONS", "/login/oauth/userinfo")
  40. req.Header.Set("Origin", "https://example.com")
  41. req.Header.Set("Access-Control-Request-Method", "GET")
  42. resp = MakeRequest(t, req, http.StatusOK)
  43. assert.NotEmpty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  44. assert.Contains(t, resp.Header().Values("Vary"), "Origin")
  45. // OPTIONS userinfo for non-CORS
  46. req = NewRequest(t, "OPTIONS", "/login/oauth/userinfo")
  47. resp = MakeRequest(t, req, http.StatusMethodNotAllowed)
  48. assert.NotContains(t, resp.Header().Values("Vary"), "Origin")
  49. })
  50. })
  51. t.Run("CORS disabled", func(t *testing.T) {
  52. defer test.MockVariableValue(&setting.CORSConfig.Enabled, false)()
  53. defer test.MockVariableValue(&testWebRoutes, routers.NormalRoutes())()
  54. t.Run("API without CORS", func(t *testing.T) {
  55. req := NewRequest(t, "GET", "/api/v1/version")
  56. resp := MakeRequest(t, req, http.StatusOK)
  57. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  58. assert.Empty(t, resp.Header().Values("Vary"))
  59. req = NewRequest(t, "OPTIONS", "/api/v1/version")
  60. req.Header.Set("Origin", "https://example.com")
  61. req.Header.Set("Access-Control-Request-Method", "GET")
  62. resp = MakeRequest(t, req, http.StatusMethodNotAllowed)
  63. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  64. assert.Empty(t, resp.Header().Values("Vary"))
  65. })
  66. t.Run("Web without CORS", func(t *testing.T) {
  67. req := NewRequest(t, "GET", "/login/oauth/userinfo")
  68. resp := MakeRequest(t, req, http.StatusUnauthorized)
  69. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  70. assert.NotContains(t, resp.Header().Values("Vary"), "Origin")
  71. req = NewRequest(t, "OPTIONS", "/login/oauth/userinfo")
  72. req.Header.Set("Origin", "https://example.com")
  73. req.Header.Set("Access-Control-Request-Method", "GET")
  74. resp = MakeRequest(t, req, http.StatusMethodNotAllowed)
  75. assert.Empty(t, resp.Header().Get("Access-Control-Allow-Origin"))
  76. assert.NotContains(t, resp.Header().Values("Vary"), "Origin")
  77. })
  78. })
  79. }