Collection of Gin middleware for Creafly Go microservices.
go get github.com/creafly/creago-middlewareGenerates or propagates request IDs for request tracing.
import middleware "github.com/creafly/creago-middleware"
r := gin.New()
r.Use(middleware.RequestID())Reads X-Request-ID header if present, otherwise generates a new UUID.
Configurable Cross-Origin Resource Sharing middleware.
r.Use(middleware.CORS(middleware.CORSConfig{
AllowedOrigins: []string{"https://app.creafly.io"},
AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Authorization", "Content-Type"},
AllowCredentials: true,
MaxAge: 86400,
}))Or use the default configuration:
r.Use(middleware.CORS(middleware.DefaultCORSConfig()))Adds security-related HTTP headers.
r.Use(middleware.SecurityHeaders())Headers added:
X-Content-Type-Options: nosniffX-Frame-Options: DENYX-XSS-Protection: 1; mode=blockReferrer-Policy: strict-origin-when-cross-originCache-Control: no-store, no-cache, must-revalidate, privatePragma: no-cacheContent-Security-Policy: default-src 'none'; frame-ancestors 'none'Permissions-Policy: geolocation=(), microphone=(), camera=()
HTTP Strict Transport Security header.
r.Use(middleware.HSTS(true))IP-based rate limiting with automatic cleanup.
r.Use(middleware.RateLimit(middleware.RateLimitConfig{
Enabled: true,
RequestsPerSecond: 100,
BurstSize: 200,
CleanupInterval: 10 * time.Minute,
}))Or use the default configuration:
r.Use(middleware.RateLimit(middleware.DefaultRateLimitConfig()))Request logging using creago-logger.
import logger "github.com/creafly/creago-logger"
logger.InitFromEnv("my-service")
r := gin.New()
r.Use(middleware.RequestID())
r.Use(middleware.Logging())Gzip compression for responses.
r.Use(middleware.Compression())Locale detection from Accept-Language header or query parameter.
r.Use(middleware.Locale())
func handler(c *gin.Context) {
locale := middleware.GetLocale(c)
}Supported locales: en-US, ru-RU
package main
import (
"time"
"github.com/gin-gonic/gin"
logger "github.com/creafly/creago-logger"
middleware "github.com/creafly/creago-middleware"
)
func main() {
logger.InitFromEnv("my-service")
r := gin.New()
r.Use(middleware.RequestID())
r.Use(middleware.SecurityHeaders())
r.Use(middleware.HSTS(true))
r.Use(middleware.CORS(middleware.DefaultCORSConfig()))
r.Use(middleware.RateLimit(middleware.DefaultRateLimitConfig()))
r.Use(middleware.Logging())
r.Use(middleware.Locale())
r.Use(middleware.Compression())
r.GET("/health", func(c *gin.Context) {
c.JSON(200, gin.H{"status": "ok"})
})
r.Run(":8080")
}| Type | Description |
|---|---|
CORSConfig |
CORS middleware configuration |
RateLimitConfig |
Rate limiting configuration |
SecurityConfig |
Security headers configuration |
| Function | Description |
|---|---|
RequestID() HandlerFunc |
Request ID middleware |
CORS(cfg CORSConfig) HandlerFunc |
CORS middleware |
DefaultCORSConfig() CORSConfig |
Default CORS configuration |
SecurityHeaders() HandlerFunc |
Security headers middleware |
HSTS(enabled bool) HandlerFunc |
HSTS middleware |
RateLimit(cfg RateLimitConfig) HandlerFunc |
Rate limiting middleware |
DefaultRateLimitConfig() RateLimitConfig |
Default rate limit configuration |
Logging() HandlerFunc |
Request logging middleware |
Compression() HandlerFunc |
Gzip compression middleware |
Locale() HandlerFunc |
Locale detection middleware |
GetLocale(c *gin.Context) string |
Get locale from context |
GetClientIP(c *gin.Context) string |
Get client IP with proxy support |
| Constant | Value | Description |
|---|---|---|
RequestIDHeader |
X-Request-ID |
Request ID header name |
LocaleContextKey |
locale |
Locale context key |
DefaultLocale |
en-US |
Default locale |
github.com/creafly/creago-logger- Logginggithub.com/gin-gonic/gin- Web frameworkgithub.com/google/uuid- UUID generationgolang.org/x/time/rate- Rate limiting
Internal use only - Creafly