http urls monitor.

config.go 2.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. package cors
  2. import (
  3. "net/http"
  4. "github.com/gin-gonic/gin"
  5. )
  6. type cors struct {
  7. allowAllOrigins bool
  8. allowCredentials bool
  9. allowOriginFunc func(string) bool
  10. allowOrigins []string
  11. exposeHeaders []string
  12. normalHeaders http.Header
  13. preflightHeaders http.Header
  14. }
  15. var (
  16. DefaultSchemas = []string{
  17. "http://",
  18. "https://",
  19. }
  20. ExtensionSchemas = []string{
  21. "chrome-extension://",
  22. "safari-extension://",
  23. "moz-extension://",
  24. "ms-browser-extension://",
  25. }
  26. )
  27. func newCors(config Config) *cors {
  28. if err := config.Validate(); err != nil {
  29. panic(err.Error())
  30. }
  31. return &cors{
  32. allowOriginFunc: config.AllowOriginFunc,
  33. allowAllOrigins: config.AllowAllOrigins,
  34. allowCredentials: config.AllowCredentials,
  35. allowOrigins: normalize(config.AllowOrigins),
  36. normalHeaders: generateNormalHeaders(config),
  37. preflightHeaders: generatePreflightHeaders(config),
  38. }
  39. }
  40. func (cors *cors) applyCors(c *gin.Context) {
  41. origin := c.Request.Header.Get("Origin")
  42. if len(origin) == 0 {
  43. // request is not a CORS request
  44. return
  45. }
  46. host := c.Request.Header.Get("Host")
  47. if origin == "http://"+host || origin == "https://"+host {
  48. // request is not a CORS request but have origin header.
  49. // for example, use fetch api
  50. return
  51. }
  52. if !cors.validateOrigin(origin) {
  53. c.AbortWithStatus(http.StatusForbidden)
  54. return
  55. }
  56. if c.Request.Method == "OPTIONS" {
  57. cors.handlePreflight(c)
  58. defer c.AbortWithStatus(200)
  59. } else {
  60. cors.handleNormal(c)
  61. }
  62. if !cors.allowAllOrigins {
  63. c.Header("Access-Control-Allow-Origin", origin)
  64. }
  65. }
  66. func (cors *cors) validateOrigin(origin string) bool {
  67. if cors.allowAllOrigins {
  68. return true
  69. }
  70. for _, value := range cors.allowOrigins {
  71. if value == origin {
  72. return true
  73. }
  74. }
  75. if cors.allowOriginFunc != nil {
  76. return cors.allowOriginFunc(origin)
  77. }
  78. return false
  79. }
  80. func (cors *cors) handlePreflight(c *gin.Context) {
  81. header := c.Writer.Header()
  82. for key, value := range cors.preflightHeaders {
  83. header[key] = value
  84. }
  85. }
  86. func (cors *cors) handleNormal(c *gin.Context) {
  87. header := c.Writer.Header()
  88. for key, value := range cors.normalHeaders {
  89. header[key] = value
  90. }
  91. }