router

package
v1.0.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 19, 2025 License: MIT Imports: 16 Imported by: 0

Documentation

Overview

Package router provides a flexible and feature-rich HTTP routing framework. It supports middleware, sub-routers, generic handlers, and various configuration options.

Package router provides a flexible and feature-rich HTTP routing framework. It supports middleware, sub-routers, generic handlers, and various configuration options.

Index

Constants

View Source
const (
	// ParamsKey is the key used to store httprouter.Params in the request context.
	// This allows route parameters to be accessed from handlers and middleware.
	ParamsKey contextKey = "params"
)

Variables

This section is empty.

Functions

func GetParam

func GetParam(r *http.Request, name string) string

GetParam retrieves a specific parameter from the request context. It's a convenience function that combines GetParams and ByName.

func GetParams

func GetParams(r *http.Request) httprouter.Params

GetParams retrieves the httprouter.Params from the request context. This allows handlers to access route parameters extracted from the URL.

func GetUserID added in v1.0.0

func GetUserID[T comparable, U any](r *http.Request) (T, bool)

GetUserID retrieves the user ID from the request context. Returns the user ID if it exists in the context, the zero value of T otherwise.

func RegisterGenericRoute

func RegisterGenericRoute[Req any, Resp any, UserID comparable, User any](r *Router[UserID, User], route RouteConfig[Req, Resp])

RegisterGenericRoute registers a route with generic request and response types. This is a standalone function rather than a method because Go methods cannot have type parameters. It creates a handler that uses the codec to decode the request and encode the response, applies middleware, and registers the route with the router.

Types

type AuthLevel added in v1.0.0

type AuthLevel int

AuthLevel defines the authentication level for a route. It determines how authentication is handled for the route.

const (
	// NoAuth indicates that no authentication is required for the route.
	// The route will be accessible without any authentication.
	NoAuth AuthLevel = iota

	// AuthOptional indicates that authentication is optional for the route.
	// If authentication credentials are provided, they will be validated and the user
	// will be added to the request context if valid. If no credentials are provided
	// or they are invalid, the request will still proceed without a user in the context.
	AuthOptional

	// AuthRequired indicates that authentication is required for the route.
	// If authentication fails, the request will be rejected with a 401 Unauthorized response.
	// If authentication succeeds, the user will be added to the request context.
	AuthRequired
)

type Codec

type Codec[T any, U any] interface {
	// Decode extracts and deserializes data from an HTTP request into a value of type T.
	// It reads the request body and converts it from the wire format (e.g., JSON, Protocol Buffers)
	// into the appropriate Go type. If the deserialization fails, it returns an error.
	// The type T represents the request data type.
	Decode(r *http.Request) (T, error)

	// Encode serializes a value of type U and writes it to the HTTP response.
	// It converts the Go value to the wire format (e.g., JSON, Protocol Buffers) and
	// sets appropriate headers (e.g., Content-Type). If the serialization fails, it returns an error.
	// The type U represents the response data type.
	Encode(w http.ResponseWriter, resp U) error
}

Codec defines an interface for marshaling and unmarshaling request and response data. It provides methods for decoding request data from an HTTP request and encoding response data to an HTTP response. This allows for different data formats (e.g., JSON, Protocol Buffers). The framework includes implementations for JSON and Protocol Buffers in the codec package.

type GenericHandler

type GenericHandler[T any, U any] func(r *http.Request, data T) (U, error)

GenericHandler defines a handler function with generic request and response types. It takes an http.Request and a typed request data object, and returns a typed response object and an error. This allows for strongly-typed request and response handling. The type parameters T and U represent the request and response data types respectively. When used with RegisterGenericRoute, the framework automatically handles decoding the request and encoding the response using the specified Codec.

type HTTPError

type HTTPError struct {
	StatusCode int    // HTTP status code (e.g., 400, 404, 500)
	Message    string // Error message to be sent in the response body
}

HTTPError represents an HTTP error with a status code and message. It can be used to return specific HTTP errors from handlers. When returned from a handler, the router will use the status code and message to generate an appropriate HTTP response. This allows handlers to control the exact error response sent to clients.

func NewHTTPError

func NewHTTPError(statusCode int, message string) *HTTPError

NewHTTPError creates a new HTTPError with the specified status code and message. It's a convenience function for creating HTTP errors in handlers.

func (*HTTPError) Error

func (e *HTTPError) Error() string

Error implements the error interface. It returns a string representation of the HTTP error in the format "status: message".

type MetricsConfig added in v1.0.3

type MetricsConfig struct {
	// Collector is the metrics collector to use.
	// If nil, a default collector will be used if metrics are enabled.
	Collector interface{} // metrics.Collector

	// Exporter is the metrics exporter to use.
	// If nil, a default exporter will be used if metrics are enabled.
	Exporter interface{} // metrics.Exporter

	// MiddlewareFactory is the factory for creating metrics middleware.
	// If nil, a default middleware factory will be used if metrics are enabled.
	MiddlewareFactory interface{} // metrics.MiddlewareFactory

	// Namespace for metrics.
	Namespace string

	// Subsystem for metrics.
	Subsystem string

	// EnableLatency enables latency metrics.
	EnableLatency bool

	// EnableThroughput enables throughput metrics.
	EnableThroughput bool

	// EnableQPS enables queries per second metrics.
	EnableQPS bool

	// EnableErrors enables error metrics.
	EnableErrors bool
}

MetricsConfig defines the configuration for metrics collection. It allows customization of how metrics are collected and exposed.

type Middleware

type Middleware = common.Middleware

Middleware is an alias for common.Middleware. It represents a function that wraps an http.Handler to provide additional functionality.

func LoggingMiddleware

func LoggingMiddleware(logger *zap.Logger, enableTraceID bool) Middleware

LoggingMiddleware is a middleware that logs HTTP requests and responses. It captures the request method, path, status code, and duration. If enableTraceID is true, it will include the trace ID in the logs if present.

type PrometheusConfig

type PrometheusConfig struct{}

PrometheusConfig is removed in favor of MetricsConfig with v2 metrics system. This type is kept for reference but should not be used. Deprecated: Use MetricsConfig instead.

type RouteConfig

type RouteConfig[T any, U any] struct {
	Path           string                                // Route path (will be prefixed with sub-router path prefix if applicable)
	Methods        []string                              // HTTP methods this route handles
	AuthLevel      AuthLevel                             // Authentication level for this route (NoAuth, AuthOptional, or AuthRequired)
	Timeout        time.Duration                         // Override timeout for this specific route
	MaxBodySize    int64                                 // Override max body size for this specific route
	RateLimit      *middleware.RateLimitConfig[any, any] // Rate limit for this specific route
	Codec          Codec[T, U]                           // Codec for marshaling/unmarshaling request and response
	Handler        GenericHandler[T, U]                  // Generic handler function
	Middlewares    []common.Middleware                   // Middlewares applied to this specific route
	SourceType     SourceType                            // How to retrieve request data (defaults to Body)
	SourceKey      string                                // Query parameter name (only used for query parameters)
	CacheResponse  bool                                  // Whether to cache responses for this route
	CacheKeyPrefix string                                // Prefix for cache keys to avoid collisions
}

RouteConfig defines a route with generic request and response types. It extends RouteConfigBase with type parameters for request and response data, allowing for strongly-typed handlers and automatic marshaling/unmarshaling.

type RouteConfigBase

type RouteConfigBase struct {
	Path        string                                // Route path (will be prefixed with sub-router path prefix if applicable)
	Methods     []string                              // HTTP methods this route handles
	AuthLevel   AuthLevel                             // Authentication level for this route (NoAuth, AuthOptional, or AuthRequired)
	Timeout     time.Duration                         // Override timeout for this specific route
	MaxBodySize int64                                 // Override max body size for this specific route
	RateLimit   *middleware.RateLimitConfig[any, any] // Rate limit for this specific route
	Handler     http.HandlerFunc                      // Standard HTTP handler function
	Middlewares []common.Middleware                   // Middlewares applied to this specific route
}

RouteConfigBase defines the base configuration for a route without generics. It includes settings for path, HTTP methods, authentication, timeouts, and middleware.

type Router

type Router[T comparable, U any] struct {
	// contains filtered or unexported fields
}

Router is the main router struct that implements http.Handler. It provides routing, middleware support, graceful shutdown, and other features.

func NewRouter

func NewRouter[T comparable, U any](config RouterConfig, authFunction func(context.Context, string) (U, bool), userIdFromuserFunction func(U) T) *Router[T, U]

NewRouter creates a new Router with the given configuration. It initializes the underlying httprouter, sets up logging, and registers routes from sub-routers.

func (*Router[T, U]) RegisterRoute

func (r *Router[T, U]) RegisterRoute(route RouteConfigBase)

RegisterRoute registers a route with the router. It creates a handler with all middlewares applied and registers it with the underlying httprouter. For generic routes with type parameters, use RegisterGenericRoute function instead.

func (*Router[T, U]) ServeHTTP

func (r *Router[T, U]) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTP implements the http.Handler interface. It handles HTTP requests by applying metrics and tracing if enabled, and then delegating to the underlying httprouter.

func (*Router[T, U]) Shutdown

func (r *Router[T, U]) Shutdown(ctx context.Context) error

Shutdown gracefully shuts down the router. It stops accepting new requests and waits for existing requests to complete. If the context is canceled before all requests complete, it returns the context's error.

type RouterConfig

type RouterConfig struct {
	Logger             *zap.Logger                           // Logger for all router operations
	GlobalTimeout      time.Duration                         // Default response timeout for all routes
	GlobalMaxBodySize  int64                                 // Default maximum request body size in bytes
	GlobalRateLimit    *middleware.RateLimitConfig[any, any] // Default rate limit for all routes
	IPConfig           *middleware.IPConfig                  // Configuration for client IP extraction
	EnableMetrics      bool                                  // Enable metrics collection
	EnableTracing      bool                                  // Enable distributed tracing
	EnableTraceID      bool                                  // Enable trace ID logging
	PrometheusConfig   *PrometheusConfig                     // Prometheus metrics configuration (optional, deprecated)
	MetricsConfig      *MetricsConfig                        // Metrics configuration (optional)
	SubRouters         []SubRouterConfig                     // Sub-routers with their own configurations
	Middlewares        []common.Middleware                   // Global middlewares applied to all routes
	AddUserObjectToCtx bool                                  // Add user object to context
	CacheGet           func(string) ([]byte, bool)           // Function to retrieve cached responses
	CacheSet           func(string, []byte) error            // Function to store responses in the cache
	CacheKeyPrefix     string                                // Prefix for cache keys to avoid collisions
}

RouterConfig defines the global configuration for the router. It includes settings for logging, timeouts, metrics, and middleware.

type SourceType added in v1.0.5

type SourceType int

SourceType defines where to retrieve request data from. It determines how the request data is extracted and decoded.

const (
	// Body retrieves data from the request body (default).
	// The request body is read and passed directly to the codec for decoding.
	Body SourceType = iota

	// Base64QueryParameter retrieves data from a base64-encoded query parameter.
	// The query parameter value is decoded from base64 before being passed to the codec.
	Base64QueryParameter

	// Base62QueryParameter retrieves data from a base62-encoded query parameter.
	// The query parameter value is decoded from base62 before being passed to the codec.
	Base62QueryParameter

	// Base64PathParameter retrieves data from a base64-encoded path parameter.
	// The path parameter value is decoded from base64 before being passed to the codec.
	Base64PathParameter

	// Base62PathParameter retrieves data from a base62-encoded path parameter.
	// The path parameter value is decoded from base62 before being passed to the codec.
	Base62PathParameter
)

type SubRouterConfig

type SubRouterConfig struct {
	PathPrefix          string                                // Common path prefix for all routes in this sub-router
	TimeoutOverride     time.Duration                         // Override global timeout for all routes in this sub-router
	MaxBodySizeOverride int64                                 // Override global max body size for all routes in this sub-router
	RateLimitOverride   *middleware.RateLimitConfig[any, any] // Override global rate limit for all routes in this sub-router
	Routes              []RouteConfigBase                     // Routes in this sub-router
	Middlewares         []common.Middleware                   // Middlewares applied to all routes in this sub-router
	CacheResponse       bool                                  // Whether to cache responses for routes in this sub-router
	CacheKeyPrefix      string                                // Prefix for cache keys to avoid collisions
}

SubRouterConfig defines configuration for a group of routes with a common path prefix. This allows for organizing routes into logical groups and applying shared configuration.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL