Bumps the go-modules-updates group with 11 updates in the /backend directory: | Package | From | To | | --- | --- | --- | | [github.com/PuerkitoBio/goquery](https://github.com/PuerkitoBio/goquery) | `1.10.2` | `1.11.0` | | [github.com/alecthomas/chroma/v2](https://github.com/alecthomas/chroma) | `2.15.0` | `2.20.0` | | [github.com/go-chi/chi/v5](https://github.com/go-chi/chi) | `5.2.1` | `5.2.3` | | [github.com/go-chi/cors](https://github.com/go-chi/cors) | `1.2.1` | `1.2.2` | | [github.com/go-pkgz/jrpc](https://github.com/go-pkgz/jrpc) | `0.3.1` | `0.4.0` | | [github.com/go-pkgz/lgr](https://github.com/go-pkgz/lgr) | `0.12.0` | `0.12.1` | | [github.com/go-pkgz/rest](https://github.com/go-pkgz/rest) | `1.20.3` | `1.20.4` | | [github.com/golang-jwt/jwt/v5](https://github.com/golang-jwt/jwt) | `5.2.2` | `5.3.0` | | [github.com/stretchr/testify](https://github.com/stretchr/testify) | `1.10.0` | `1.11.1` | | [go.etcd.io/bbolt](https://github.com/etcd-io/bbolt) | `1.4.0` | `1.4.3` | | [golang.org/x/image](https://github.com/golang/image) | `0.26.0` | `0.33.0` | Updates `github.com/PuerkitoBio/goquery` from 1.10.2 to 1.11.0 - [Release notes](https://github.com/PuerkitoBio/goquery/releases) - [Commits](https://github.com/PuerkitoBio/goquery/compare/v1.10.2...v1.11.0) Updates `github.com/alecthomas/chroma/v2` from 2.15.0 to 2.20.0 - [Release notes](https://github.com/alecthomas/chroma/releases) - [Commits](https://github.com/alecthomas/chroma/compare/v2.15.0...v2.20.0) Updates `github.com/go-chi/chi/v5` from 5.2.1 to 5.2.3 - [Release notes](https://github.com/go-chi/chi/releases) - [Changelog](https://github.com/go-chi/chi/blob/master/CHANGELOG.md) - [Commits](https://github.com/go-chi/chi/compare/v5.2.1...v5.2.3) Updates `github.com/go-chi/cors` from 1.2.1 to 1.2.2 - [Release notes](https://github.com/go-chi/cors/releases) - [Commits](https://github.com/go-chi/cors/compare/v1.2.1...v1.2.2) Updates `github.com/go-pkgz/jrpc` from 0.3.1 to 0.4.0 - [Release notes](https://github.com/go-pkgz/jrpc/releases) - [Commits](https://github.com/go-pkgz/jrpc/compare/v0.3.1...v0.4.0) Updates `github.com/go-pkgz/lgr` from 0.12.0 to 0.12.1 - [Release notes](https://github.com/go-pkgz/lgr/releases) - [Commits](https://github.com/go-pkgz/lgr/compare/v0.12.0...v0.12.1) Updates `github.com/go-pkgz/rest` from 1.20.3 to 1.20.4 - [Release notes](https://github.com/go-pkgz/rest/releases) - [Commits](https://github.com/go-pkgz/rest/compare/v1.20.3...v1.20.4) Updates `github.com/golang-jwt/jwt/v5` from 5.2.2 to 5.3.0 - [Release notes](https://github.com/golang-jwt/jwt/releases) - [Commits](https://github.com/golang-jwt/jwt/compare/v5.2.2...v5.3.0) Updates `github.com/stretchr/testify` from 1.10.0 to 1.11.1 - [Release notes](https://github.com/stretchr/testify/releases) - [Commits](https://github.com/stretchr/testify/compare/v1.10.0...v1.11.1) Updates `go.etcd.io/bbolt` from 1.4.0 to 1.4.3 - [Release notes](https://github.com/etcd-io/bbolt/releases) - [Commits](https://github.com/etcd-io/bbolt/compare/v1.4.0...v1.4.3) Updates `golang.org/x/image` from 0.26.0 to 0.33.0 - [Commits](https://github.com/golang/image/compare/v0.26.0...v0.33.0) --- updated-dependencies: - dependency-name: github.com/PuerkitoBio/goquery dependency-version: 1.11.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: github.com/alecthomas/chroma/v2 dependency-version: 2.20.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: github.com/go-chi/chi/v5 dependency-version: 5.2.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/go-chi/cors dependency-version: 1.2.2 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/go-pkgz/jrpc dependency-version: 0.4.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: github.com/go-pkgz/lgr dependency-version: 0.12.1 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/go-pkgz/rest dependency-version: 1.20.4 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: github.com/golang-jwt/jwt/v5 dependency-version: 5.3.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: github.com/stretchr/testify dependency-version: 1.11.1 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates - dependency-name: go.etcd.io/bbolt dependency-version: 1.4.3 dependency-type: direct:production update-type: version-update:semver-patch dependency-group: go-modules-updates - dependency-name: golang.org/x/image dependency-version: 0.33.0 dependency-type: direct:production update-type: version-update:semver-minor dependency-group: go-modules-updates ... Signed-off-by: dependabot[bot] <support@github.com>
167 lines
4.8 KiB
Go
167 lines
4.8 KiB
Go
package chi
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strings"
|
|
)
|
|
|
|
// URLParam returns the url parameter from a http.Request object.
|
|
func URLParam(r *http.Request, key string) string {
|
|
if rctx := RouteContext(r.Context()); rctx != nil {
|
|
return rctx.URLParam(key)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// URLParamFromCtx returns the url parameter from a http.Request Context.
|
|
func URLParamFromCtx(ctx context.Context, key string) string {
|
|
if rctx := RouteContext(ctx); rctx != nil {
|
|
return rctx.URLParam(key)
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// RouteContext returns chi's routing Context object from a
|
|
// http.Request Context.
|
|
func RouteContext(ctx context.Context) *Context {
|
|
val, _ := ctx.Value(RouteCtxKey).(*Context)
|
|
return val
|
|
}
|
|
|
|
// NewRouteContext returns a new routing Context object.
|
|
func NewRouteContext() *Context {
|
|
return &Context{}
|
|
}
|
|
|
|
var (
|
|
// RouteCtxKey is the context.Context key to store the request context.
|
|
RouteCtxKey = &contextKey{"RouteContext"}
|
|
)
|
|
|
|
// Context is the default routing context set on the root node of a
|
|
// request context to track route patterns, URL parameters and
|
|
// an optional routing path.
|
|
type Context struct {
|
|
Routes Routes
|
|
|
|
// parentCtx is the parent of this one, for using Context as a
|
|
// context.Context directly. This is an optimization that saves
|
|
// 1 allocation.
|
|
parentCtx context.Context
|
|
|
|
// Routing path/method override used during the route search.
|
|
// See Mux#routeHTTP method.
|
|
RoutePath string
|
|
RouteMethod string
|
|
|
|
// URLParams are the stack of routeParams captured during the
|
|
// routing lifecycle across a stack of sub-routers.
|
|
URLParams RouteParams
|
|
|
|
// Route parameters matched for the current sub-router. It is
|
|
// intentionally unexported so it can't be tampered.
|
|
routeParams RouteParams
|
|
|
|
// The endpoint routing pattern that matched the request URI path
|
|
// or `RoutePath` of the current sub-router. This value will update
|
|
// during the lifecycle of a request passing through a stack of
|
|
// sub-routers.
|
|
routePattern string
|
|
|
|
// Routing pattern stack throughout the lifecycle of the request,
|
|
// across all connected routers. It is a record of all matching
|
|
// patterns across a stack of sub-routers.
|
|
RoutePatterns []string
|
|
|
|
methodsAllowed []methodTyp // allowed methods in case of a 405
|
|
methodNotAllowed bool
|
|
}
|
|
|
|
// Reset a routing context to its initial state.
|
|
func (x *Context) Reset() {
|
|
x.Routes = nil
|
|
x.RoutePath = ""
|
|
x.RouteMethod = ""
|
|
x.RoutePatterns = x.RoutePatterns[:0]
|
|
x.URLParams.Keys = x.URLParams.Keys[:0]
|
|
x.URLParams.Values = x.URLParams.Values[:0]
|
|
|
|
x.routePattern = ""
|
|
x.routeParams.Keys = x.routeParams.Keys[:0]
|
|
x.routeParams.Values = x.routeParams.Values[:0]
|
|
x.methodNotAllowed = false
|
|
x.methodsAllowed = x.methodsAllowed[:0]
|
|
x.parentCtx = nil
|
|
}
|
|
|
|
// URLParam returns the corresponding URL parameter value from the request
|
|
// routing context.
|
|
func (x *Context) URLParam(key string) string {
|
|
for k := len(x.URLParams.Keys) - 1; k >= 0; k-- {
|
|
if x.URLParams.Keys[k] == key {
|
|
return x.URLParams.Values[k]
|
|
}
|
|
}
|
|
return ""
|
|
}
|
|
|
|
// RoutePattern builds the routing pattern string for the particular
|
|
// request, at the particular point during routing. This means, the value
|
|
// will change throughout the execution of a request in a router. That is
|
|
// why it's advised to only use this value after calling the next handler.
|
|
//
|
|
// For example,
|
|
//
|
|
// func Instrument(next http.Handler) http.Handler {
|
|
// return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
// next.ServeHTTP(w, r)
|
|
// routePattern := chi.RouteContext(r.Context()).RoutePattern()
|
|
// measure(w, r, routePattern)
|
|
// })
|
|
// }
|
|
func (x *Context) RoutePattern() string {
|
|
if x == nil {
|
|
return ""
|
|
}
|
|
routePattern := strings.Join(x.RoutePatterns, "")
|
|
routePattern = replaceWildcards(routePattern)
|
|
if routePattern != "/" {
|
|
routePattern = strings.TrimSuffix(routePattern, "//")
|
|
routePattern = strings.TrimSuffix(routePattern, "/")
|
|
}
|
|
return routePattern
|
|
}
|
|
|
|
// replaceWildcards takes a route pattern and replaces all occurrences of
|
|
// "/*/" with "/". It iteratively runs until no wildcards remain to
|
|
// correctly handle consecutive wildcards.
|
|
func replaceWildcards(p string) string {
|
|
for strings.Contains(p, "/*/") {
|
|
p = strings.ReplaceAll(p, "/*/", "/")
|
|
}
|
|
return p
|
|
}
|
|
|
|
// RouteParams is a structure to track URL routing parameters efficiently.
|
|
type RouteParams struct {
|
|
Keys, Values []string
|
|
}
|
|
|
|
// Add will append a URL parameter to the end of the route param
|
|
func (s *RouteParams) Add(key, value string) {
|
|
s.Keys = append(s.Keys, key)
|
|
s.Values = append(s.Values, value)
|
|
}
|
|
|
|
// contextKey is a value for use with context.WithValue. It's used as
|
|
// a pointer so it fits in an interface{} without allocation. This technique
|
|
// for defining context keys was copied from Go 1.7's new use of context in net/http.
|
|
type contextKey struct {
|
|
name string
|
|
}
|
|
|
|
func (k *contextKey) String() string {
|
|
return "chi context value " + k.name
|
|
}
|