Documentation
¶
Index ¶
- Constants
- Variables
- func CleanPath(p string) string
- func DefaultHandleRecovery(c Context, _ any)
- func DefaultMethodNotAllowedHandler(c Context)
- func DefaultNotFoundHandler(c Context)
- func DefaultOptionsHandler(c Context)
- func ErrNotSupported() error
- func FixTrailingSlash(path string) string
- func NewTestContext(w http.ResponseWriter, r *http.Request, opts ...GlobalOption) (*Router, *TestContext)
- func SplitHostPath(url string) (host, path string)
- type ClientIPResolver
- type ClientIPResolverFunc
- type Context
- type ContextCloser
- type GlobalOption
- func DefaultOptions() GlobalOption
- func WithAutoOptions(enable bool) GlobalOption
- func WithMaxRouteParamKeyBytes(max uint16) GlobalOption
- func WithMaxRouteParams(max uint16) GlobalOption
- func WithMiddlewareFor(scope HandlerScope, m ...MiddlewareFunc) GlobalOption
- func WithNoMethod(enable bool) GlobalOption
- func WithNoMethodHandler(handler HandlerFunc) GlobalOption
- func WithNoRouteHandler(handler HandlerFunc) GlobalOption
- func WithOptionsHandler(handler HandlerFunc) GlobalOption
- type HandlerFunc
- type HandlerScope
- type Iter
- func (it Iter) All() iter.Seq2[string, *Route]
- func (it Iter) Methods() iter.Seq[string]
- func (it Iter) Prefix(methods iter.Seq[string], prefix string) iter.Seq2[string, *Route]
- func (it Iter) Reverse(methods iter.Seq[string], host, path string) iter.Seq2[string, *Route]
- func (it Iter) Routes(methods iter.Seq[string], pattern string) iter.Seq2[string, *Route]
- type MiddlewareFunc
- type Option
- type Param
- type Params
- type RecoveryFunc
- type ResponseWriter
- type Route
- func (r *Route) Annotation(key any) any
- func (r *Route) ClientIPResolver() ClientIPResolver
- func (r *Route) Handle(c Context)
- func (r *Route) HandleMiddleware(c Context, _ ...struct{})
- func (r *Route) Hostname() string
- func (r *Route) IgnoreTrailingSlashEnabled() bool
- func (r *Route) ParamsLen() int
- func (r *Route) Path() string
- func (r *Route) Pattern() string
- func (r *Route) RedirectTrailingSlashEnabled() bool
- type RouteConflictError
- type RouteOption
- type Router
- func (fox *Router) Delete(method, pattern string) (*Route, error)
- func (fox *Router) Handle(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
- func (fox *Router) HandleRoute(method string, route *Route) error
- func (fox *Router) Has(method, pattern string) bool
- func (fox *Router) Iter() Iter
- func (fox *Router) Len() int
- func (fox *Router) Lookup(w ResponseWriter, r *http.Request) (route *Route, cc ContextCloser, tsr bool)
- func (fox *Router) MustHandle(method, pattern string, handler HandlerFunc, opts ...RouteOption) *Route
- func (fox *Router) NewRoute(pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
- func (fox *Router) Reverse(method, host, path string) (route *Route, tsr bool)
- func (fox *Router) Route(method, pattern string) *Route
- func (fox *Router) ServeHTTP(w http.ResponseWriter, r *http.Request)
- func (fox *Router) Stats() RouterInfo
- func (fox *Router) Txn(write bool) *Txn
- func (fox *Router) Update(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
- func (fox *Router) UpdateRoute(method string, route *Route) error
- func (fox *Router) Updates(fn func(txn *Txn) error) error
- func (fox *Router) View(fn func(txn *Txn) error) error
- type RouterInfo
- type TestContext
- func (c TestContext) AddHeader(key, value string)
- func (c TestContext) Blob(code int, contentType string, buf []byte) (err error)
- func (c TestContext) ClientIP() (*net.IPAddr, error)
- func (c TestContext) Clone() Context
- func (c TestContext) CloneWith(w ResponseWriter, r *http.Request) ContextCloser
- func (c TestContext) Close()
- func (c TestContext) Fox() *Router
- func (c TestContext) Header(key string) string
- func (c TestContext) Host() string
- func (c TestContext) Method() string
- func (c TestContext) Param(name string) string
- func (c TestContext) Params() iter.Seq[Param]
- func (c TestContext) Path() string
- func (c TestContext) Pattern() string
- func (c TestContext) QueryParam(name string) string
- func (c TestContext) QueryParams() url.Values
- func (c TestContext) Redirect(code int, url string) error
- func (c TestContext) RemoteIP() *net.IPAddr
- func (c TestContext) Request() *http.Request
- func (c TestContext) Route() *Route
- func (c TestContext) Scope() HandlerScope
- func (c TestContext) SetHeader(key, value string)
- func (c *TestContext) SetParams(params Params)
- func (c TestContext) SetRequest(r *http.Request)
- func (c *TestContext) SetRoute(route *Route)
- func (c *TestContext) SetScope(scope HandlerScope)
- func (c TestContext) SetWriter(w ResponseWriter)
- func (c TestContext) Stream(code int, contentType string, r io.Reader) (err error)
- func (c TestContext) String(code int, format string, values ...any) (err error)
- func (c TestContext) Writer() ResponseWriter
- type Txn
- func (txn *Txn) Abort()
- func (txn *Txn) Commit()
- func (txn *Txn) Delete(method, pattern string) (*Route, error)
- func (txn *Txn) Handle(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
- func (txn *Txn) HandleRoute(method string, route *Route) error
- func (txn *Txn) Has(method, pattern string) bool
- func (txn *Txn) Iter() Iter
- func (txn *Txn) Len() int
- func (txn *Txn) Lookup(w ResponseWriter, r *http.Request) (route *Route, cc ContextCloser, tsr bool)
- func (txn *Txn) Reverse(method, host, path string) (route *Route, tsr bool)
- func (txn *Txn) Route(method, pattern string) *Route
- func (txn *Txn) Snapshot() *Txn
- func (txn *Txn) Truncate(methods ...string) error
- func (txn *Txn) Update(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
- func (txn *Txn) UpdateRoute(method string, route *Route) error
Examples ¶
Constants ¶
const ( MIMEApplicationJSON = "application/json" MIMEApplicationJSONCharsetUTF8 = MIMEApplicationJSON + "; " + charsetUTF8 MIMEApplicationJavaScript = "application/javascript" MIMEApplicationJavaScriptCharsetUTF8 = MIMEApplicationJavaScript + "; " + charsetUTF8 MIMEApplicationXML = "application/xml" MIMEApplicationXMLCharsetUTF8 = MIMEApplicationXML + "; " + charsetUTF8 MIMETextXML = "text/xml" MIMETextXMLCharsetUTF8 = MIMETextXML + "; " + charsetUTF8 MIMEApplicationForm = "application/x-www-form-urlencoded" MIMEApplicationProtobuf = "application/protobuf" MIMEApplicationMsgpack = "application/msgpack" MIMETextHTML = "text/html" MIMETextHTMLCharsetUTF8 = MIMETextHTML + "; " + charsetUTF8 MIMETextPlain = "text/plain" MIMETextPlainCharsetUTF8 = MIMETextPlain + "; " + charsetUTF8 MIMEMultipartForm = "multipart/form-data" MIMEOctetStream = "application/octet-stream" )
MIME types
const ( HeaderAccept = "Accept" HeaderAcceptEncoding = "Accept-Encoding" HeaderAllow = "Allow" HeaderAuthorization = "Authorization" HeaderProxyAuthorization = "Proxy-Authorization" HeaderContentDisposition = "Content-Disposition" HeaderContentEncoding = "Content-Encoding" HeaderContentLength = "Content-Length" HeaderContentType = "Content-Type" HeaderCookie = "Cookie" HeaderSetCookie = "Set-Cookie" HeaderIfModifiedSince = "If-Modified-Since" HeaderLastModified = "Last-Modified" HeaderLocation = "Location" HeaderRetryAfter = "Retry-After" HeaderUpgrade = "Upgrade" HeaderVary = "Vary" HeaderWWWAuthenticate = "WWW-Authenticate" HeaderXForwardedFor = "X-Forwarded-For" HeaderForwarded = "Forwarded" HeaderXForwardedProto = "X-Forwarded-Proto" HeaderXForwardedProtocol = "X-Forwarded-Protocol" HeaderXForwardedSsl = "X-Forwarded-Ssl" HeaderXUrlScheme = "X-Url-Scheme" HeaderXHTTPMethodOverride = "X-HTTP-Method-Override" HeaderXRequestID = "X-Request-Id" HeaderXCorrelationID = "X-Correlation-Id" HeaderXRequestedWith = "X-Requested-With" HeaderServer = "Server" HeaderOrigin = "Origin" HeaderHost = "Host" HeaderCacheControl = "Cache-Control" HeaderConnection = "Connection" HeaderETag = "ETag" // Access control HeaderAccessControlRequestMethod = "Access-Control-Request-Method" HeaderAccessControlRequestHeaders = "Access-Control-Request-Headers" HeaderAccessControlAllowOrigin = "Access-Control-Allow-Origin" HeaderAccessControlAllowMethods = "Access-Control-Allow-Methods" HeaderAccessControlAllowHeaders = "Access-Control-Allow-Headers" HeaderAccessControlAllowCredentials = "Access-Control-Allow-Credentials" HeaderAccessControlExposeHeaders = "Access-Control-Expose-Headers" HeaderAccessControlMaxAge = "Access-Control-Max-Age" // Security HeaderStrictTransportSecurity = "Strict-Transport-Security" HeaderXContentTypeOptions = "X-Content-Type-Options" HeaderXXSSProtection = "X-XSS-Protection" HeaderXFrameOptions = "X-Frame-Options" HeaderContentSecurityPolicy = "Content-Security-Policy" HeaderContentSecurityPolicyReportOnly = "Content-Security-Policy-Report-Only" // nolint:gosec HeaderXCSRFToken = "X-CSRF-Token" HeaderReferrerPolicy = "Referrer-Policy" // Platform Header for single IP HeaderCFConnectionIP = "CF-Connecting-IP" HeaderTrueClientIP = "True-Client-IP" HeaderFastClientIP = "Fastly-Client-IP" HeaderXAzureClientIP = "X-Azure-ClientIP" HeaderXAzureSocketIP = "X-Azure-SocketIP" HeaderXAppengineRemoteAddr = "X-Appengine-Remote-Addr" HeaderFlyClientIP = "Fly-Client-IP" HeaderXRealIP = "X-Real-Ip" )
Headers
Variables ¶
var ( ErrRouteNotFound = errors.New("route not found") ErrRouteExist = errors.New("route already registered") ErrRouteConflict = errors.New("route conflict") ErrInvalidRoute = errors.New("invalid route") ErrDiscardedResponseWriter = errors.New("discarded response writer") ErrInvalidRedirectCode = errors.New("invalid redirect code") ErrNoClientIPResolver = errors.New("no client ip resolver") ErrReadOnlyTxn = errors.New("write on read-only transaction") ErrSettledTxn = errors.New("transaction settled") ErrParamKeyTooLarge = errors.New("parameter key too large") ErrTooManyParams = errors.New("too many params") ErrInvalidConfig = errors.New("invalid config") )
Functions ¶
func CleanPath ¶
CleanPath is the URL version of path.Clean, it returns a canonical URL path for p, eliminating . and .. elements.
The following rules are applied iteratively until no further processing can be done:
- Replace multiple slashes with a single slash.
- Eliminate each . path name element (the current directory).
- Eliminate each inner .. path name element (the parent directory) along with the non-.. element that precedes it.
- Eliminate .. elements that begin a rooted path: that is, replace "/.." by "/" at the beginning of a path.
If the result of this process is an empty string, "/" is returned
func DefaultHandleRecovery ¶ added in v0.7.2
DefaultHandleRecovery is a default implementation of the RecoveryFunc. It responds with a status code 500 and writes a generic error message.
func DefaultMethodNotAllowedHandler ¶ added in v0.7.6
func DefaultMethodNotAllowedHandler(c Context)
DefaultMethodNotAllowedHandler is a simple HandlerFunc that replies to each request with a “405 Method Not Allowed” reply.
func DefaultNotFoundHandler ¶ added in v0.7.6
func DefaultNotFoundHandler(c Context)
DefaultNotFoundHandler is a simple HandlerFunc that replies to each request with a “404 page not found” reply.
func DefaultOptionsHandler ¶ added in v0.13.0
func DefaultOptionsHandler(c Context)
DefaultOptionsHandler is a simple HandlerFunc that replies to each request with a "200 OK" reply.
func ErrNotSupported ¶ added in v0.16.0
func ErrNotSupported() error
ErrNotSupported returns an error that Is http.ErrNotSupported, but is not == to it.
func FixTrailingSlash ¶ added in v0.16.0
FixTrailingSlash ensures a consistent trailing slash handling for a given path. If the path has more than one character and ends with a slash, it removes the trailing slash. Otherwise, it adds a trailing slash to the path.
func NewTestContext ¶ added in v0.7.0
func NewTestContext(w http.ResponseWriter, r *http.Request, opts ...GlobalOption) (*Router, *TestContext)
NewTestContext returns a new Router and its associated Context, designed only for testing purpose.
func SplitHostPath ¶ added in v0.18.0
SplitHostPath separates the host and path from a URL string. If url includes a valid numeric port, the port is stripped from the host; otherwise, it remains part of the host. If url is empty or lacks a path, the path defaults to "/". SplitHostPath does not perform host validation.
Types ¶
type ClientIPResolver ¶ added in v0.19.0
type ClientIPResolver interface { // ClientIP returns the "real" client IP according to the implemented resolver. It returns an error if no valid IP // address can be derived. This is typically considered a misconfiguration error, unless the resolver involves // obtaining an untrustworthy or optional value. ClientIP(c Context) (*net.IPAddr, error) }
ClientIPResolver define a resolver for obtaining the "real" client IP from HTTP requests. The resolver used must be chosen and tuned for your network configuration. This should result in a resolver never returning an error i.e., never failing to find a candidate for the "real" IP. Consequently, getting an error result should be treated as an application error, perhaps even worthy of panicking. Builtin best practices resolver can be found in the github.com/tigerwill90/fox/clientip package.
type ClientIPResolverFunc ¶ added in v0.19.0
The ClientIPResolverFunc type is an adapter to allow the use of ordinary functions as ClientIPResolver. If f is a function with the appropriate signature, ClientIPResolverFunc(f) is a ClientIPResolverFunc that calls f.
type Context ¶ added in v0.7.0
type Context interface { // Request returns the current [http.Request]. Request() *http.Request // SetRequest sets the [*http.Request]. SetRequest(r *http.Request) // Writer method returns a custom [ResponseWriter] implementation. Writer() ResponseWriter // SetWriter sets the [ResponseWriter]. SetWriter(w ResponseWriter) // RemoteIP parses the IP from [http.Request.RemoteAddr], normalizes it, and returns an IP address. The returned [net.IPAddr] // may contain a zone identifier. RemoteIP never returns nil, even if parsing the IP fails. RemoteIP() *net.IPAddr // ClientIP returns the "real" client IP address based on the configured [ClientIPResolver]. // The resolver is set using the [WithClientIPResolver] option. There is no sane default, so if no resolver is configured, // the method returns [ErrNoClientIPResolver]. // // The resolver used must be chosen and tuned for your network configuration. This should result // in a resolver never returning an error -- i.e., never failing to find a candidate for the "real" IP. // Consequently, getting an error result should be treated as an application error, perhaps even // worthy of panicking. // // The returned [net.IPAddr] may contain a zone identifier. ClientIP() (*net.IPAddr, error) // Pattern returns the registered route pattern or an empty string if the handler is called in a scope other than [RouteHandler]. Pattern() string // Route returns the registered [Route] or nil if the handler is called in a scope other than [RouteHandler]. Route() *Route // Params returns a range iterator over the matched wildcard parameters for the current route. Params() iter.Seq[Param] // Param retrieve a matching wildcard parameter by name. Param(name string) string // Method returns the request method. Method() string // Path returns the request URL path. Path() string // Host returns the request host. Host() string // QueryParams parses the [http.Request] raw query and returns the corresponding values. QueryParams() url.Values // QueryParam returns the first query value associated with the given key. QueryParam(name string) string // SetHeader sets the response header for the given key to the specified value. SetHeader(key, value string) // AddHeader add the response header for the given key to the specified value. AddHeader(key, value string) // Header retrieves the value of the request header for the given key. Header(key string) string // String sends a formatted string with the specified status code. String(code int, format string, values ...any) error // Blob sends a byte slice with the specified status code and content type. Blob(code int, contentType string, buf []byte) error // Stream sends data from an [io.Reader] with the specified status code and content type. Stream(code int, contentType string, r io.Reader) error // Redirect sends an HTTP redirect response with the given status code and URL. Redirect(code int, url string) error // Clone returns a copy of the [Context] that is safe to use after the [HandlerFunc] returns. Clone() Context // CloneWith returns a shallow copy of the current [Context], substituting its [ResponseWriter] and [http.Request] // with the provided ones. The method is designed for zero allocation during the copy process. The returned // [ContextCloser] must be closed once no longer needed. This functionality is particularly beneficial for // middlewares that need to wrap their custom [ResponseWriter] while preserving the state of the original [Context]. CloneWith(w ResponseWriter, r *http.Request) ContextCloser // Scope returns the [HandlerScope] associated with the current [Context]. // This indicates the scope in which the handler is being executed, such as [RouteHandler], [NoRouteHandler], etc. Scope() HandlerScope // Fox returns the [Router] instance. Fox() *Router }
Context represents the context of the current HTTP request. It provides methods to access request data and to write a response. Be aware that the Context API is not thread-safe and its lifetime should be limited to the duration of the HandlerFunc execution, as the underlying implementation may be reused a soon as the handler return. (see [Context.Clone] method).
type ContextCloser ¶ added in v0.7.0
type ContextCloser interface { Context // Close releases the context to be reused later. Close() }
ContextCloser extends Context for manually created instances, adding a Close method to release resources after use.
type GlobalOption ¶ added in v0.16.0
type GlobalOption interface {
// contains filtered or unexported methods
}
func DefaultOptions ¶ added in v0.7.0
func DefaultOptions() GlobalOption
DefaultOptions configure the router to use the Recovery middleware for the RouteHandler scope, the Logger middleware for AllHandlers scope and enable automatic OPTIONS response. Note that DefaultOptions push the Recovery and Logger middleware respectively to the first and second position of the middleware chains.
func WithAutoOptions ¶ added in v0.9.0
func WithAutoOptions(enable bool) GlobalOption
WithAutoOptions enables automatic response to OPTIONS requests with, by default, a 200 OK status code. Use the WithOptionsHandler option to customize the response. When this option is enabled, the router automatically determines the "Allow" header value based on the methods registered for the given route. Note that custom OPTIONS handler take priority over automatic replies. This option is automatically enabled when providing a custom handler with the option WithOptionsHandler.
func WithMaxRouteParamKeyBytes ¶ added in v0.19.0
func WithMaxRouteParamKeyBytes(max uint16) GlobalOption
WithMaxRouteParamKeyBytes set the maximum number of bytes allowed per parameter key in a route. The default max is math.MaxUint16.
func WithMaxRouteParams ¶ added in v0.19.0
func WithMaxRouteParams(max uint16) GlobalOption
WithMaxRouteParams set the maximum number of parameters allowed in a route. The default max is math.MaxUint16.
func WithMiddlewareFor ¶ added in v0.7.6
func WithMiddlewareFor(scope HandlerScope, m ...MiddlewareFunc) GlobalOption
WithMiddlewareFor attaches middleware to the router for a specified scope. Middlewares provided will be chained in the order they were added. The scope parameter determines which types of handlers the middleware will be applied to. Possible scopes include RouteHandler (regular routes), NoRouteHandler, NoMethodHandler, RedirectHandler, OptionsHandler, and any combination of these. Use this option when you need fine-grained control over where the middleware is applied.
func WithNoMethod ¶ added in v0.9.0
func WithNoMethod(enable bool) GlobalOption
WithNoMethod enable to returns 405 Method Not Allowed instead of 404 Not Found when the route exist for another http verb. The "Allow" header it automatically set before calling the handler. Note that this option is automatically enabled when providing a custom handler with the option WithNoMethodHandler.
func WithNoMethodHandler ¶ added in v0.9.0
func WithNoMethodHandler(handler HandlerFunc) GlobalOption
WithNoMethodHandler register an HandlerFunc which is called when the request cannot be routed, but the same route exist for other methods. The "Allow" header it automatically set before calling the handler. By default, the DefaultMethodNotAllowedHandler is used. Note that this option automatically enable WithNoMethod.
func WithNoRouteHandler ¶ added in v0.9.0
func WithNoRouteHandler(handler HandlerFunc) GlobalOption
WithNoRouteHandler register an HandlerFunc which is called when no matching route is found. By default, the DefaultNotFoundHandler is used.
func WithOptionsHandler ¶ added in v0.9.0
func WithOptionsHandler(handler HandlerFunc) GlobalOption
WithOptionsHandler register an HandlerFunc which is called on automatic OPTIONS requests. By default, the router respond with a 200 OK status code. The "Allow" header it automatically set before calling the handler. Note that custom OPTIONS handler take priority over automatic replies. By default, DefaultOptionsHandler is used. Note that this option automatically enable WithAutoOptions.
type HandlerFunc ¶
type HandlerFunc func(c Context)
HandlerFunc is a function type that responds to an HTTP request. It enforces the same contract as http.Handler but provides additional feature like matched wildcard route segments via the Context type. The Context is freed once the HandlerFunc returns and may be reused later to save resources. If you need to hold the context longer, you have to copy it (see [Context.Clone] method).
Similar to http.Handler, to abort a HandlerFunc so the client sees an interrupted response, panic with the value http.ErrAbortHandler.
HandlerFunc functions should be thread-safe, as they will be called concurrently.
func WrapF ¶
func WrapF(f http.HandlerFunc) HandlerFunc
WrapF is an adapter for wrapping http.HandlerFunc and returns a HandlerFunc function. The route parameters are being accessed by the wrapped handler through the context.
func WrapH ¶
func WrapH(h http.Handler) HandlerFunc
WrapH is an adapter for wrapping http.Handler and returns a HandlerFunc function. The route parameters are being accessed by the wrapped handler through the context.
type HandlerScope ¶ added in v0.17.0
type HandlerScope uint8
HandlerScope represents different scopes where a handler may be called. It also allows for fine-grained control over where middleware is applied.
const ( // RouteHandler scope applies to regular routes registered in the router. RouteHandler HandlerScope = 1 << (8 - 1 - iota) // NoRouteHandler scope applies to the NoRoute handler, which is invoked when no route matches the request. NoRouteHandler // NoMethodHandler scope applies to the NoMethod handler, which is invoked when a route exists, but the method is not allowed. NoMethodHandler // RedirectHandler scope applies to the internal redirect handler, used for handling requests with trailing slashes. RedirectHandler // OptionsHandler scope applies to the automatic OPTIONS handler, which handles pre-flight or cross-origin requests. OptionsHandler // AllHandlers is a combination of all the above scopes, which can be used to apply middlewares to all types of handlers. AllHandlers = RouteHandler | NoRouteHandler | NoMethodHandler | RedirectHandler | OptionsHandler )
type Iter ¶ added in v0.16.0
type Iter struct {
// contains filtered or unexported fields
}
Iter provide a set of range iterators for traversing registered methods and routes. Iter capture a point-in-time snapshot of the routing tree. Therefore, all iterators returned by Iter will not observe subsequent write on the router or on the transaction from which the Iter is created.
func (Iter) All ¶ added in v0.16.0
All returns a range iterator over all routes registered in the routing tree at the time Iter is created. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
Example ¶
f, _ := New() it := f.Iter() for method, route := range it.All() { fmt.Println(method, route.Pattern()) }
Output:
func (Iter) Methods ¶ added in v0.16.0
Methods returns a range iterator over all HTTP methods registered in the routing tree at the time Iter is created. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
Example ¶
f, _ := New() it := f.Iter() for method := range it.Methods() { fmt.Println(method) }
Output:
func (Iter) Prefix ¶ added in v0.16.0
Prefix returns a range iterator over all routes in the routing tree that match a given prefix and HTTP methods at the time Iter is created. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
Example ¶
f, _ := New() it := f.Iter() for method, route := range it.Prefix(slices.Values([]string{"GET", "POST"}), "/foo") { fmt.Println(method, route.Pattern()) }
Output:
func (Iter) Reverse ¶ added in v0.16.0
Reverse returns a range iterator over all routes registered in the routing tree that match the given host and path for the provided HTTP methods. Unlike Iter.Routes, which matches an exact route, Reverse is used to match an url (e.g., a path from an incoming request) to a registered routes in the tree. The iterator reflect a snapshot of the routing tree at the time Iter is created.
If WithIgnoreTrailingSlash or WithRedirectTrailingSlash option is enabled on a route, Reverse will match it regardless of whether a trailing slash is present. If the path is empty, a default slash is automatically added.
This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
Example ¶
f, _ := New() it := f.Iter() for method, route := range it.Reverse(slices.Values([]string{"GET", "POST"}), "exemple.com", "/foo") { fmt.Println(method, route.Pattern()) }
Output:
func (Iter) Routes ¶ added in v0.16.0
Routes returns a range iterator over all registered routes in the routing tree that exactly match the provided route pattern for the given HTTP methods. The iterator reflect a snapshot of the routing tree at the time Iter is created. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
Example ¶
f, _ := New() it := f.Iter() for method, route := range it.Routes(slices.Values([]string{"GET", "POST"}), "/hello/{name}") { fmt.Println(method, route.Pattern()) }
Output:
type MiddlewareFunc ¶ added in v0.7.0
type MiddlewareFunc func(next HandlerFunc) HandlerFunc
MiddlewareFunc is a function type for implementing HandlerFunc middleware. The returned HandlerFunc usually wraps the input HandlerFunc, allowing you to perform operations before and/or after the wrapped HandlerFunc is executed. MiddlewareFunc functions should be thread-safe, as they will be called concurrently.
func CustomRecovery ¶ added in v0.14.0
func CustomRecovery(handle RecoveryFunc) MiddlewareFunc
CustomRecovery returns a middleware that recovers from any panics, logs the error, request details, and stack trace, and then calls the provided handle function to handle the recovery.
func CustomRecoveryWithLogHandler ¶ added in v0.14.0
func CustomRecoveryWithLogHandler(handler slog.Handler, handle RecoveryFunc) MiddlewareFunc
CustomRecoveryWithLogHandler returns a middleware for a given slog.Handler that recovers from any panics, logs the error, request details, and stack trace, and then calls the provided handle function to handle the recovery.
func Logger ¶ added in v0.14.0
func Logger() MiddlewareFunc
Logger returns a middleware that logs request information to os.Stdout or os.Stderr (for ERROR level). It logs details such as the remote or client IP, HTTP method, request path, status code and latency.
func LoggerWithHandler ¶ added in v0.14.0
func LoggerWithHandler(handler slog.Handler) MiddlewareFunc
LoggerWithHandler returns a middleware that logs request information using the provided slog.Handler. It logs details such as the remote or client IP, HTTP method, request path, status code and latency.
func Recovery ¶ added in v0.7.0
func Recovery() MiddlewareFunc
Recovery returns a middleware that recovers from any panics, logs the error, request details, and stack trace, and writes a 500 status code response if a panic occurs.
type Option ¶ added in v0.5.0
type Option interface { GlobalOption RouteOption }
func WithClientIPResolver ¶ added in v0.19.0
func WithClientIPResolver(resolver ClientIPResolver) Option
WithClientIPResolver sets the resolver for obtaining the "real" client IP address from HTTP requests. This resolver is used by the [Context.ClientIP] method. The resolver must be chosen and tuned for your network configuration to ensure it never returns an error -- i.e., never fails to find a candidate for the "real" IP. Consequently, getting an error result should be treated as an application error, perhaps even worthy of panicking. There is no sane default, so if no resolver is configured, [Context.ClientIP] returns ErrNoClientIPResolver.
This option can be applied on a per-route basis or globally:
- If applied globally, it affects all routes by default.
- If applied to a specific route, it will override the global setting for that route.
- Setting the resolver to nil is equivalent to no resolver configured.
func WithIgnoreTrailingSlash ¶ added in v0.14.0
WithIgnoreTrailingSlash allows the router to match routes regardless of whether a trailing slash is present or not. E.g. /foo/bar/ and /foo/bar would both match the same handler. This option prevents the router from issuing a redirect and instead matches the request directly.
This option can be applied on a per-route basis or globally:
- If applied globally, it affects all routes by default.
- If applied to a specific route, it will override the global setting for that route.
Note that this option is mutually exclusive with WithRedirectTrailingSlash, and if enabled will automatically deactivate WithRedirectTrailingSlash.
func WithMiddleware ¶ added in v0.7.0
func WithMiddleware(m ...MiddlewareFunc) Option
WithMiddleware attaches middleware to the router or to a specific route. The middlewares are executed in the order they are added. When applied globally, the middleware affects all handlers, including special handlers such as NotFound, MethodNotAllowed, AutoOption, and the internal redirect handler.
This option can be applied on a per-route basis or globally: - If applied globally, the middleware will be applied to all routes and handlers by default. - If applied to a specific route, the middleware will only apply to that route and will be chained after any global middleware.
Example ¶
This example demonstrates how to register a global middleware that will be applied to all routes.
// Define a custom middleware to measure the time taken for request processing and // log the URL, route, time elapsed, and status code. metrics := func(next HandlerFunc) HandlerFunc { return func(c Context) { start := time.Now() next(c) log.Printf( "url=%s; route=%s; time=%d; status=%d", c.Request().URL, c.Pattern(), time.Since(start), c.Writer().Status(), ) } } f, _ := New(WithMiddleware(metrics)) f.MustHandle(http.MethodGet, "/hello/{name}", func(c Context) { _ = c.String(200, "Hello %s\n", c.Param("name")) })
Output:
func WithRedirectTrailingSlash ¶ added in v0.5.0
WithRedirectTrailingSlash enable automatic redirection fallback when the current request does not match but another handler is found with/without an additional trailing slash. E.g. /foo/bar/ request does not match but /foo/bar would match. The client is redirected with a http status code 301 for GET requests and 308 for all other methods.
This option can be applied on a per-route basis or globally:
- If applied globally, it affects all routes by default.
- If applied to a specific route, it will override the global setting for that route.
Note that this option is mutually exclusive with WithIgnoreTrailingSlash, and if enabled will automatically deactivate WithIgnoreTrailingSlash.
type Params ¶
type Params []Param
func ParamsFromContext ¶
ParamsFromContext is a helper to retrieve params from context.Context when a http.Handler is registered using WrapF or WrapH.
type RecoveryFunc ¶ added in v0.7.0
RecoveryFunc is a function type that defines how to handle panics that occur during the handling of an HTTP request.
type ResponseWriter ¶ added in v0.7.0
type ResponseWriter interface { http.ResponseWriter io.StringWriter io.ReaderFrom // Status recorded after Write and WriteHeader. Status() int // Written returns true if the response has been written. Written() bool // Size returns the size of the written response. Size() int // FlushError flushes buffered data to the client. If flush is not supported, FlushError returns an error // matching [http.ErrNotSupported]. See [http.Flusher] for more details. FlushError() error // Hijack lets the caller take over the connection. If hijacking the connection is not supported, Hijack returns // an error matching [http.ErrNotSupported]. See [http.Hijacker] for more details. Hijack() (net.Conn, *bufio.ReadWriter, error) // Push initiates an HTTP/2 server push. Push returns [http.ErrNotSupported] if the client has disabled push or if push // is not supported on the underlying connection. See [http.Pusher] for more details. Push(target string, opts *http.PushOptions) error // SetReadDeadline sets the deadline for reading the entire request, including the body. Reads from the request // body after the deadline has been exceeded will return an error. A zero value means no deadline. Setting the read // deadline after it has been exceeded will not extend it. If SetReadDeadline is not supported, it returns // an error matching [http.ErrNotSupported]. SetReadDeadline(deadline time.Time) error // SetWriteDeadline sets the deadline for writing the response. Writes to the response body after the deadline has // been exceeded will not block, but may succeed if the data has been buffered. A zero value means no deadline. // Setting the write deadline after it has been exceeded will not extend it. If SetWriteDeadline is not supported, // it returns an error matching [http.ErrNotSupported]. SetWriteDeadline(deadline time.Time) error // EnableFullDuplex indicates that the request handler will interleave reads from [http.Request.Body] // with writes to the [ResponseWriter]. // // For HTTP/1 requests, the Go HTTP server by default consumes any unread portion of // the request body before beginning to write the response, preventing handlers from // concurrently reading from the request and writing the response. // Calling EnableFullDuplex disables this behavior and permits handlers to continue to read // from the request while concurrently writing the response. // // For HTTP/2 requests, the Go HTTP server always permits concurrent reads and responses. // If EnableFullDuplex is not supported, it returns an error matching [http.ErrNotSupported]. EnableFullDuplex() error }
ResponseWriter extends http.ResponseWriter and provides methods to retrieve the recorded status code, written state, and response size.
type Route ¶ added in v0.16.0
type Route struct {
// contains filtered or unexported fields
}
Route represents an immutable HTTP route with associated handlers and settings.
func (*Route) Annotation ¶ added in v0.20.0
Annotation returns the value associated with this Route for key, or nil if no value is associated with key. Successive calls to Annotation with the same key returns the same result.
func (*Route) ClientIPResolver ¶ added in v0.21.0
func (r *Route) ClientIPResolver() ClientIPResolver
ClientIPResolver returns the ClientIPResolver configured for the route, if any.
func (*Route) Handle ¶ added in v0.16.0
Handle calls the handler with the provided Context. See also Route.HandleMiddleware.
func (*Route) HandleMiddleware ¶ added in v0.17.0
HandleMiddleware calls the handler with route-specific middleware applied, using the provided Context.
func (*Route) Hostname ¶ added in v0.18.0
Hostname returns the hostname part of the registered pattern if any.
func (*Route) IgnoreTrailingSlashEnabled ¶ added in v0.16.0
IgnoreTrailingSlashEnabled returns whether the route is configured to ignore trailing slashes in requests when matching routes.
func (*Route) ParamsLen ¶ added in v0.21.0
ParamsLen returns the number of wildcard parameter for the route.
func (*Route) RedirectTrailingSlashEnabled ¶ added in v0.16.0
RedirectTrailingSlashEnabled returns whether the route is configured to automatically redirect requests that include or omit a trailing slash.
type RouteConflictError ¶
type RouteConflictError struct { Method string Path string Matched []string // contains filtered or unexported fields }
RouteConflictError is a custom error type used to represent conflicts when registering or updating routes in the router. It holds information about the conflicting method, path, and the matched routes that caused the conflict.
func (*RouteConflictError) Error ¶
func (e *RouteConflictError) Error() string
Error returns a formatted error message for the RouteConflictError.
func (*RouteConflictError) Unwrap ¶
func (e *RouteConflictError) Unwrap() error
Unwrap returns the sentinel value ErrRouteConflict.
type RouteOption ¶ added in v0.18.0
type RouteOption interface {
// contains filtered or unexported methods
}
func WithAnnotation ¶ added in v0.17.0
func WithAnnotation(key, value any) RouteOption
WithAnnotation attach arbitrary metadata to routes. Annotations are key-value pairs that allow middleware, handler or any other components to modify behavior based on the attached metadata. Unlike context-based metadata, which is tied to the request lifetime, annotations are bound to the route's lifetime and remain static across all requests for that route. The provided key must be comparable and should not be of type string or any other built-in type to avoid collisions between packages that use route annotation.
type Router ¶
type Router struct {
// contains filtered or unexported fields
}
Router is a lightweight high performance HTTP request router that support mutation on its routing tree while handling request concurrently.
func New ¶
func New(opts ...GlobalOption) (*Router, error)
New returns a ready to use instance of Fox router.
Example ¶
This example demonstrates how to create a simple router using the default options, which include the Recovery and Logger middleware. A basic route is defined, along with a custom middleware to log the request metrics.
// Create a new router with default options, which include the Recovery and Logger middleware r, _ := New(DefaultOptions()) // Define a route with the path "/hello/{name}", and set a simple handler that greets the // user by their name. r.MustHandle(http.MethodGet, "/hello/{name}", func(c Context) { _ = c.String(200, "Hello %s\n", c.Param("name")) }) // Start the HTTP server using fox router and listen on port 8080 log.Fatalln(http.ListenAndServe(":8080", r))
Output:
func (*Router) Delete ¶
Delete deletes an existing route for the given method and pattern. On success, it returns the deleted Route.
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method or pattern is invalid.
It's safe to delete a handler while the router is serving requests. This function is safe for concurrent use by multiple goroutine.
func (*Router) Handle ¶ added in v0.7.0
func (fox *Router) Handle(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
Handle registers a new route for the given method and pattern. On success, it returns the newly registered Route. If an error occurs, it returns one of the following:
- ErrRouteExist: If the route is already registered.
- ErrRouteConflict: If the route conflicts with another.
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrInvalidConfig: If the provided route options are invalid.
It's safe to add a new handler while the router is serving requests. This function is safe for concurrent use by multiple goroutine. To override an existing handler, use Router.Update.
func (*Router) HandleRoute ¶ added in v0.21.0
HandleRoute registers a new Route for the given method. If an error occurs, it returns one of the following:
- ErrRouteExist: If the route is already registered.
- ErrRouteConflict: If the route conflicts with another.
- ErrInvalidRoute: If the provided method is invalid or the route is missing.
- ErrInvalidConfig: If the provided route options are invalid.
It's safe to add a new route while the router is serving requests. This function is safe for concurrent use by multiple goroutine. To override an existing route, use Router.UpdateRoute.
func (*Router) Has ¶ added in v0.18.0
Has allows to check if the given method and route pattern exactly match a registered route. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing. See also Router.Route as an alternative.
Example ¶
This example demonstrates how to check if a given route is registered in the tree.
f, _ := New() f.MustHandle(http.MethodGet, "/hello/{name}", emptyHandler) exist := f.Has(http.MethodGet, "/hello/{name}") fmt.Println(exist) // true
Output:
func (*Router) Iter ¶ added in v0.16.0
Iter returns a collection of range iterators for traversing registered methods and routes. It creates a point-in-time snapshot of the routing tree. Therefore, all iterators returned by Iter will not observe subsequent write on the router. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing.
func (*Router) Lookup ¶
func (fox *Router) Lookup(w ResponseWriter, r *http.Request) (route *Route, cc ContextCloser, tsr bool)
Lookup performs a manual route lookup for a given http.Request, returning the matched Route along with a ContextCloser, and a boolean indicating if the route was matched by adding or removing a trailing slash (trailing slash action recommended). If there is a direct match or a tsr is possible, Lookup always return a Route and a ContextCloser. The ContextCloser should always be closed if non-nil. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing. See also Router.Reverse as an alternative.
Example ¶
This example demonstrates how to create a custom middleware that cleans the request path and performs a manual lookup on the tree. If the cleaned path matches a registered route, the client is redirected to the valid path.
redirectFixedPath := MiddlewareFunc(func(next HandlerFunc) HandlerFunc { return func(c Context) { req := c.Request() target := req.URL.Path cleanedPath := CleanPath(target) // Nothing to clean, call next handler. if cleanedPath == target { next(c) return } req.URL.Path = cleanedPath route, cc, tsr := c.Fox().Lookup(c.Writer(), req) if route != nil { defer cc.Close() code := http.StatusMovedPermanently if req.Method != http.MethodGet { code = http.StatusPermanentRedirect } // Redirect the client if direct match or indirect match. if !tsr || route.IgnoreTrailingSlashEnabled() { if err := c.Redirect(code, cleanedPath); err != nil { // Only if not in the range 300..308, so not possible here! panic(err) } return } // Add or remove an extra trailing slash and redirect the client. if route.RedirectTrailingSlashEnabled() { if err := c.Redirect(code, FixTrailingSlash(cleanedPath)); err != nil { // Only if not in the range 300..308, so not possible here panic(err) } return } } // rollback to the original path before calling the // next handler or middleware. req.URL.Path = target next(c) } }) f, _ := New( // Register the middleware for the NoRouteHandler scope. WithMiddlewareFor(NoRouteHandler|NoMethodHandler, redirectFixedPath), ) f.MustHandle(http.MethodGet, "/hello/{name}", func(c Context) { _ = c.String(200, "Hello %s\n", c.Param("name")) })
Output:
func (*Router) MustHandle ¶ added in v0.7.0
func (fox *Router) MustHandle(method, pattern string, handler HandlerFunc, opts ...RouteOption) *Route
MustHandle registers a new route for the given method and pattern. On success, it returns the newly registered Route. This function is a convenience wrapper for the Router.Handle function and panics on error.
func (*Router) NewRoute ¶ added in v0.21.0
func (fox *Router) NewRoute(pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
NewRoute create a new Route, configured with the provided options. If an error occurs, it returns one of the following:
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrInvalidConfig: If the provided route options are invalid.
func (*Router) Reverse ¶ added in v0.18.0
Reverse perform a reverse lookup for the given method, host and path and return the matching registered Route (if any) along with a boolean indicating if the route was matched by adding or removing a trailing slash (trailing slash action recommended). If the path is empty, a default slash is automatically added. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing. See also Router.Lookup as an alternative.
Example ¶
This example demonstrates how to do a reverse lookup on the tree.
f, _ := New() f.MustHandle(http.MethodGet, "exemple.com/hello/{name}", emptyHandler) route, _ := f.Reverse(http.MethodGet, "exemple.com", "/hello/fox") fmt.Println(route.Pattern()) // /hello/{name}
Output:
func (*Router) Route ¶ added in v0.18.0
Route performs a lookup for a registered route matching the given method and route pattern. It returns the Route if a match is found or nil otherwise. This function is safe for concurrent use by multiple goroutine and while mutation on route are ongoing. See also Router.Has as an alternative.
func (*Router) ServeHTTP ¶
func (fox *Router) ServeHTTP(w http.ResponseWriter, r *http.Request)
ServeHTTP is the main entry point to serve a request. It handles all incoming HTTP requests and dispatches them to the appropriate handler function based on the request's method and path.
func (*Router) Stats ¶ added in v0.19.0
func (fox *Router) Stats() RouterInfo
Stats returns information on the configured global option.
func (*Router) Txn ¶ added in v0.18.0
Txn create a new read-write or read-only transaction. Each Txn must be finalized with Txn.Commit or Txn.Abort. It's safe to create transaction from multiple goroutine and while the router is serving request. However, the returned Txn itself is NOT tread-safe. See also Router.Updates and Router.View for managed read-write and read-only transaction.
Example ¶
This example demonstrate how to create an unmanaged read-write transaction.
f, _ := New() // Txn create an unmanaged read-write or read-only transaction. txn := f.Txn(true) defer txn.Abort() if _, err := txn.Handle(http.MethodGet, "exemple.com/hello/{name}", func(c Context) { _ = c.String(http.StatusOK, "hello %s", c.Param("name")) }); err != nil { log.Printf("error inserting route: %s", err) return } // Iter returns a collection of range iterators for traversing registered routes. it := txn.Iter() // When Iter() is called on a write transaction, it creates a point-in-time snapshot of the transaction state. // It means that writing on the current transaction while iterating is allowed, but the mutation will not be // observed in the result returned by Prefix (or any other iterator). for method, route := range it.Prefix(it.Methods(), "tmp.exemple.com/") { if _, err := f.Delete(method, route.Pattern()); err != nil { log.Printf("error deleting route: %s", err) return } } // Finalize the transaction txn.Commit()
Output:
func (*Router) Update ¶
func (fox *Router) Update(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
Update override an existing route for the given method and pattern. On success, it returns the newly registered Route. If an error occurs, it returns one of the following:
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrInvalidConfig: If the provided route options are invalid.
Route-specific option and middleware must be reapplied when updating a route. if not, any middleware and option will be removed, and the route will fall back to using global configuration (if any). It's safe to update a handler while the router is serving requests. This function is safe for concurrent use by multiple goroutine. To add new handler, use Router.Handle method.
func (*Router) UpdateRoute ¶ added in v0.21.0
UpdateRoute override an existing Route for the given method and new Route. If an error occurs, it returns one of the following:
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method is invalid or the route is missing.
- ErrInvalidConfig: If the provided route options are invalid.
It's safe to update a handler while the router is serving requests. This function is safe for concurrent use by multiple goroutine. To add new route, use Router.HandleRoute method.
func (*Router) Updates ¶ added in v0.18.0
Updates executes a function within the context of a read-write managed transaction. If no error is returned from the function then the transaction is committed. If an error is returned then the entire transaction is aborted. Updates returns any error returned by fn. This function is safe for concurrent use by multiple goroutine and while the router is serving request. However Txn itself is NOT tread-safe. See also Router.Txn for unmanaged transaction and Router.View for managed read-only transaction.
Example ¶
This example demonstrate how to create a managed read-write transaction.
f, _ := New() // Updates executes a function within the context of a read-write managed transaction. If no error is returned // from the function then the transaction is committed. If an error is returned then the entire transaction is // aborted. if err := f.Updates(func(txn *Txn) error { if _, err := txn.Handle(http.MethodGet, "exemple.com/hello/{name}", func(c Context) { _ = c.String(http.StatusOK, "hello %s", c.Param("name")) }); err != nil { return err } // Iter returns a collection of range iterators for traversing registered routes. it := txn.Iter() // When Iter() is called on a write transaction, it creates a point-in-time snapshot of the transaction state. // It means that writing on the current transaction while iterating is allowed, but the mutation will not be // observed in the result returned by Prefix (or any other iterator). for method, route := range it.Prefix(it.Methods(), "tmp.exemple.com/") { if _, err := f.Delete(method, route.Pattern()); err != nil { return err } } return nil }); err != nil { log.Printf("transaction aborted: %s", err) }
Output:
func (*Router) View ¶ added in v0.18.0
View executes a function within the context of a read-only managed transaction. View returns any error returned by fn. This function is safe for concurrent use by multiple goroutine and while mutation on routes are ongoing. However Txn itself is NOT tread-safe. See also Router.Txn for unmanaged transaction and Router.Updates for managed read-write transaction.
Example ¶
f, _ := New() // View executes a function within the context of a read-only managed transaction. _ = f.View(func(txn *Txn) error { if txn.Has(http.MethodGet, "/foo") && txn.Has(http.MethodGet, "/bar") { // Do something } return nil })
Output:
type RouterInfo ¶ added in v0.19.0
type RouterInfo struct { MaxRouteParams uint16 MaxRouteParamKeyBytes uint16 MethodNotAllowed bool AutoOptions bool RedirectTrailingSlash bool IgnoreTrailingSlash bool ClientIP bool }
RouterInfo hold information on the configured global options.
type TestContext ¶ added in v0.21.0
type TestContext struct {
// contains filtered or unexported fields
}
func NewTestContextOnly ¶ added in v0.7.0
func NewTestContextOnly(w http.ResponseWriter, r *http.Request, opts ...GlobalOption) *TestContext
NewTestContextOnly returns a new Context designed only for testing purpose.
func (TestContext) AddHeader ¶ added in v0.21.0
func (c TestContext) AddHeader(key, value string)
AddHeader add the response header for the given key to the specified value.
func (TestContext) Blob ¶ added in v0.21.0
Blob sends a byte slice with the specified status code and content type.
func (TestContext) ClientIP ¶ added in v0.21.0
ClientIP returns the "real" client IP address based on the configured ClientIPResolver. The resolver is set using the WithClientIPResolver option. If no resolver is configured, the method returns error ErrNoClientIPResolver.
The resolver used must be chosen and tuned for your network configuration. This should result in a resolver never returning an error -- i.e., never failing to find a candidate for the "real" IP. Consequently, getting an error result should be treated as an application error, perhaps even worthy of panicking.
func (TestContext) Clone ¶ added in v0.21.0
func (c TestContext) Clone() Context
Clone returns a deep copy of the Context that is safe to use after the HandlerFunc returns. Any attempt to write on the ResponseWriter will panic with the error ErrDiscardedResponseWriter.
func (TestContext) CloneWith ¶ added in v0.21.0
func (c TestContext) CloneWith(w ResponseWriter, r *http.Request) ContextCloser
CloneWith returns a shallow copy of the current Context, substituting its ResponseWriter and http.Request with the provided ones. The method is designed for zero allocation during the copy process. The returned ContextCloser must be closed once no longer needed. This functionality is particularly beneficial for middlewares that need to wrap their custom ResponseWriter while preserving the state of the original Context.
func (TestContext) Close ¶ added in v0.21.0
func (c TestContext) Close()
Close releases the context to be reused later.
func (TestContext) Fox ¶ added in v0.21.0
func (c TestContext) Fox() *Router
Fox returns the Router instance.
func (TestContext) Header ¶ added in v0.21.0
Header retrieves the value of the request header for the given key.
func (TestContext) Host ¶ added in v0.21.0
func (c TestContext) Host() string
Host returns the request host.
func (TestContext) Method ¶ added in v0.22.0
func (c TestContext) Method() string
Method returns the request method.
func (TestContext) Params ¶ added in v0.21.0
Params returns an iterator over the matched wildcard parameters for the current route.
func (TestContext) Path ¶ added in v0.21.0
func (c TestContext) Path() string
Path returns the request URL path.
func (TestContext) Pattern ¶ added in v0.21.0
func (c TestContext) Pattern() string
Pattern returns the registered route pattern or an empty string if the handler is called in a scope other than RouteHandler.
func (TestContext) QueryParam ¶ added in v0.21.0
QueryParam returns the first value associated with the given key.
func (TestContext) QueryParams ¶ added in v0.21.0
QueryParams parses the http.Request raw query and returns the corresponding values.
func (TestContext) Redirect ¶ added in v0.21.0
Redirect sends an HTTP redirect response with the given status code and URL.
func (TestContext) RemoteIP ¶ added in v0.21.0
RemoteIP parses the IP from http.Request.RemoteAddr, normalizes it, and returns a net.IPAddr. It never returns nil, even if parsing the IP fails.
func (TestContext) Request ¶ added in v0.21.0
Request returns the http.Request.
func (TestContext) Route ¶ added in v0.21.0
func (c TestContext) Route() *Route
Route returns the registered Route or nil if the handler is called in a scope other than RouteHandler.
func (TestContext) Scope ¶ added in v0.21.0
func (c TestContext) Scope() HandlerScope
Scope returns the HandlerScope associated with the current Context. This indicates the scope in which the handler is being executed, such as RouteHandler, NoRouteHandler, etc.
func (TestContext) SetHeader ¶ added in v0.21.0
func (c TestContext) SetHeader(key, value string)
SetHeader sets the response header for the given key to the specified value.
func (*TestContext) SetParams ¶ added in v0.21.0
func (c *TestContext) SetParams(params Params)
SetParams affect the provided params to this context.
func (TestContext) SetRequest ¶ added in v0.21.0
SetRequest sets the http.Request.
func (*TestContext) SetRoute ¶ added in v0.21.0
func (c *TestContext) SetRoute(route *Route)
SetRoute affect the provided route to this context. It also set the RouteHandler scope.
func (*TestContext) SetScope ¶ added in v0.21.0
func (c *TestContext) SetScope(scope HandlerScope)
SetScope affect the provided scope to this context.
func (TestContext) SetWriter ¶ added in v0.21.0
func (c TestContext) SetWriter(w ResponseWriter)
SetWriter sets the ResponseWriter.
func (TestContext) Stream ¶ added in v0.21.0
Stream sends data from an io.Reader with the specified status code and content type.
func (TestContext) String ¶ added in v0.21.0
String sends a formatted string with the specified status code.
func (TestContext) Writer ¶ added in v0.21.0
func (c TestContext) Writer() ResponseWriter
Writer returns the ResponseWriter.
type Txn ¶ added in v0.18.0
type Txn struct {
// contains filtered or unexported fields
}
Txn is a read or write transaction on the routing tree.
func (*Txn) Abort ¶ added in v0.18.0
func (txn *Txn) Abort()
Abort cancel the transaction. This is a noop for read transactions, already aborted or committed transactions. This function is NOT thread-safe and should be run serially, along with all other Txn APIs.
func (*Txn) Commit ¶ added in v0.18.0
func (txn *Txn) Commit()
Commit finalize the transaction. This is a noop for read transactions, already aborted or committed transactions. This function is NOT thread-safe and should be run serially, along with all other Txn APIs.
func (*Txn) Delete ¶ added in v0.18.0
Delete deletes an existing route for the given method and pattern. On success, it returns the deleted Route. If an error occurs, it returns one of the following:
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrReadOnlyTxn: On write in a read-only transaction.
This function is NOT thread-safe and should be run serially, along with all other Txn APIs.
func (*Txn) Handle ¶ added in v0.18.0
func (txn *Txn) Handle(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
Handle registers a new route for the given method and pattern. On success, it returns the newly registered Route. If an error occurs, it returns one of the following:
- ErrRouteExist: If the route is already registered.
- ErrRouteConflict: If the route conflicts with another.
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrInvalidConfig: If the provided route options are invalid.
- ErrReadOnlyTxn: On write in a read-only transaction.
This function is NOT thread-safe and should be run serially, along with all other Txn APIs. To override an existing handler, use Txn.Update.
func (*Txn) HandleRoute ¶ added in v0.21.0
HandleRoute registers a new Route for the given method. If an error occurs, it returns one of the following:
- ErrRouteExist: If the route is already registered.
- ErrRouteConflict: If the route conflicts with another.
- ErrInvalidRoute: If the provided method is invalid or the route is missing.
- ErrInvalidConfig: If the provided route options are invalid.
- ErrReadOnlyTxn: On write in a read-only transaction.
This function is NOT thread-safe and should be run serially, along with all other Txn APIs. To override an existing route, use Txn.UpdateRoute.
func (*Txn) Has ¶ added in v0.18.0
Has allows to check if the given method and route pattern exactly match a registered route. This function is NOT thread-safe and should be run serially, along with all other Txn APIs. See also Txn.Route as an alternative.
func (*Txn) Iter ¶ added in v0.18.0
Iter returns a collection of range iterators for traversing registered routes. When called on a write transaction, Iter creates a point-in-time snapshot of the transaction state. Therefore, writing on the current transaction while iterating is allowed, but the mutation will not be observed in the result returned by iterators collection. This function is NOT thread-safe and should be run serially, along with all other Txn APIs.
func (*Txn) Lookup ¶ added in v0.18.0
func (txn *Txn) Lookup(w ResponseWriter, r *http.Request) (route *Route, cc ContextCloser, tsr bool)
Lookup performs a manual route lookup for a given http.Request, returning the matched Route along with a ContextCloser, and a boolean indicating if the route was matched by adding or removing a trailing slash (trailing slash action recommended). If there is a direct match or a tsr is possible, Lookup always return a Route and a ContextCloser. The ContextCloser should always be closed if non-nil. This function is NOT thread-safe and should be run serially, along with all other Txn APIs. See also Txn.Reverse as an alternative.
func (*Txn) Reverse ¶ added in v0.18.0
Reverse perform a reverse lookup for the given method, host and path and return the matching registered Route (if any) along with a boolean indicating if the route was matched by adding or removing a trailing slash (trailing slash action recommended). This function is NOT thread-safe and should be run serially, along with all other Txn APIs. See also Txn.Lookup as an alternative.
func (*Txn) Route ¶ added in v0.18.0
Route performs a lookup for a registered route matching the given method and route pattern. It returns the Route if a match is found or nil otherwise. This function is NOT thread-safe and should be run serially, along with all other Txn APIs. See also Txn.Has as an alternative.
func (*Txn) Snapshot ¶ added in v0.18.0
Snapshot returns a point in time snapshot of the current state of the transaction. Returns a new read-only transaction or nil if the transaction is already aborted or commited.
func (*Txn) Truncate ¶ added in v0.18.0
Truncate remove all routes for the provided methods. If no methods are provided, all routes are truncated. Truncating on a read-only transaction returns ErrReadOnlyTxn.
func (*Txn) Update ¶ added in v0.18.0
func (txn *Txn) Update(method, pattern string, handler HandlerFunc, opts ...RouteOption) (*Route, error)
Update override an existing route for the given method and pattern. On success, it returns the newly registered Route. If an error occurs, it returns one of the following:
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method or pattern is invalid.
- ErrInvalidConfig: If the provided route options are invalid.
- ErrReadOnlyTxn: On write in a read-only transaction.
Route-specific option and middleware must be reapplied when updating a route. if not, any middleware and option will be removed, and the route will fall back to using global configuration (if any). This function is NOT thread-safe and should be run serially, along with all other Txn APIs. To add a new handler, use Txn.Handle.
func (*Txn) UpdateRoute ¶ added in v0.21.0
UpdateRoute override an existing Route for the given method and new Route. If an error occurs, it returns one of the following:
- ErrRouteNotFound: If the route does not exist.
- ErrInvalidRoute: If the provided method is invalid or the route is missing.
- ErrInvalidConfig: If the provided route options are invalid.
- ErrReadOnlyTxn: On write in a read-only transaction.
This function is NOT thread-safe and should be run serially, along with all other Txn APIs. To add a new route, use Txn.HandleRoute.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
internal
|
|
constraints
Package constraints defines a set of useful constraints to be used with type parameters.
|
Package constraints defines a set of useful constraints to be used with type parameters. |