Categorygithub.com/gin-contrib/cors
repositorypackage
1.7.6
Repository: https://github.com/gin-contrib/cors.git
Documentation: pkg.go.dev

# README

gin-contrib/cors

Run Tests codecov Go Report Card GoDoc


Overview

CORS (Cross-Origin Resource Sharing) middleware for Gin.

  • Enables flexible CORS handling for your Gin-based APIs.
  • Highly configurable: origins, methods, headers, credentials, and more.

Installation

go get github.com/gin-contrib/cors

Import in your Go code:

import "github.com/gin-contrib/cors"

Quick Start

Allow all origins (default):

import (
  "github.com/gin-contrib/cors"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  router.Use(cors.Default()) // All origins allowed by default
  router.Run()
}

⚠️ Warning: Allowing all origins disables cookies for clients. For credentialed requests, do not allow all origins.


Advanced Usage

Custom Configuration

Configure allowed origins, methods, headers, and more:

import (
  "time"
  "github.com/gin-contrib/cors"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  router.Use(cors.New(cors.Config{
    AllowOrigins:     []string{"https://foo.com"},
    AllowMethods:     []string{"PUT", "PATCH"},
    AllowHeaders:     []string{"Origin"},
    ExposeHeaders:    []string{"Content-Length"},
    AllowCredentials: true,
    AllowOriginFunc: func(origin string) bool {
      return origin == "https://github.com"
    },
    MaxAge: 12 * time.Hour,
  }))
  router.Run()
}

DefaultConfig Reference

Start with library defaults and customize as needed:

import (
  "github.com/gin-contrib/cors"
  "github.com/gin-gonic/gin"
)

func main() {
  router := gin.Default()
  config := cors.DefaultConfig()
  config.AllowOrigins = []string{"http://google.com"}
  // config.AllowOrigins = []string{"http://google.com", "http://facebook.com"}
  // config.AllowAllOrigins = true

  router.Use(cors.New(config))
  router.Run()
}

Note: Default() allows all origins, but DefaultConfig() does not. To allow all origins, set AllowAllOrigins = true.


Default() Convenience

Enable all origins with a single call:

router.Use(cors.Default()) // Equivalent to AllowAllOrigins = true

Configuration Reference

The middleware is controlled via the cors.Config struct. All fields are optional unless otherwise stated.

FieldTypeDefaultDescription
AllowAllOriginsboolfalseIf true, allows all origins. Credentials cannot be used.
AllowOrigins[]string[]List of allowed origins. Supports exact match, *, and wildcards.
AllowOriginFuncfunc(string) boolnilCustom function to validate origin. If set, AllowOrigins is ignored.
AllowOriginWithContextFuncfunc(*gin.Context,string)boolnilLike AllowOriginFunc, but with request context.
AllowMethods[]string[]string{"GET", "POST", "PUT", "PATCH", "DELETE", "HEAD", "OPTIONS"}Allowed HTTP methods.
AllowPrivateNetworkboolfalseAdds Private Network Access CORS header.
AllowHeaders[]string[]List of non-simple headers permitted in requests.
AllowCredentialsboolfalseAllow cookies, HTTP auth, or client certs. Only if precise origins are used.
ExposeHeaders[]string[]Headers exposed to the browser.
MaxAgetime.Duration12 * time.HourCache time for preflight requests.
AllowWildcardboolfalseEnables wildcards in origins (e.g. https://*.example.com).
AllowBrowserExtensionsboolfalseAllow browser extension schemes as origins (e.g. chrome-extension://).
CustomSchemas[]stringnilAdditional allowed URI schemes (e.g. tauri://).
AllowWebSocketsboolfalseAllow ws:// and wss:// schemas.
AllowFilesboolfalseAllow file:// origins (dangerous; use only if necessary).
OptionsResponseStatusCodeint204Custom status code for OPTIONS responses.

Notes on Configuration

  • Only one of AllowAllOrigins, AllowOrigins, AllowOriginFunc, or AllowOriginWithContextFunc should be set.
  • If AllowAllOrigins is true, other origin settings are ignored and credentialed requests are not allowed.
  • If AllowWildcard is enabled, only one * is allowed per origin string.
  • Use AllowBrowserExtensions, AllowWebSockets, or AllowFiles to permit non-HTTP(s) protocols as origins.
  • Custom schemas allow, for example, usage in desktop apps via custom URI schemes (tauri://, etc.).
  • If both AllowOriginFunc and AllowOriginWithContextFunc are set, the context-specific function is preferred.

Examples

Advanced Options

config := cors.Config{
  AllowOrigins:           []string{"https://*.foo.com", "https://bar.com"},
  AllowWildcard:          true,
  AllowMethods:           []string{"GET", "POST"},
  AllowHeaders:           []string{"Authorization", "Content-Type"},
  AllowCredentials:       true,
  AllowBrowserExtensions: true,
  AllowWebSockets:        true,
  AllowFiles:             false,
  CustomSchemas:          []string{"tauri://"},
  MaxAge:                 24 * time.Hour,
  ExposeHeaders:          []string{"X-Custom-Header"},
  AllowPrivateNetwork:    true,
}

Custom Origin Validation

config := cors.Config{
  AllowOriginFunc: func(origin string) bool {
    // Allow any github.com subdomain or a custom rule
    return strings.HasSuffix(origin, "github.com")
  },
}

With Gin Context

config := cors.Config{
  AllowOriginWithContextFunc: func(c *gin.Context, origin string) bool {
    // Allow only if a certain header is present
    return c.Request.Header.Get("X-Allow-CORS") == "yes"
  },
}

Helper Methods

Dynamically add methods or headers to the config:

config.AddAllowMethods("DELETE", "OPTIONS")
config.AddAllowHeaders("X-My-Header")
config.AddExposeHeaders("X-Other-Header")

Validation & Error Handling

  • Calling Validate() on a Config checks for misconfiguration (called internally).
  • If AllowAllOrigins is set, you cannot also set AllowOrigins or any AllowOriginFunc.
  • If neither AllowAllOrigins, AllowOriginFunc, nor AllowOrigins is set, an error is raised.
  • If an AllowOrigin contains a wildcard but AllowWildcard is not enabled, or more than one * is present, a panic is triggered.
  • Invalid origin schemas or unsupported wildcards are rejected.

Important Notes

  • Enabling all origins disables cookies: When AllowAllOrigins is enabled, Gin cannot set cookies for clients. If you need credential sharing (cookies, authentication headers), do not allow all origins.
  • For detailed documentation and configuration options, see the GoDoc.