Files
Nicholas Wiersma d932d50232 chore: lint code with golangci-lint (#1828)
* feat: add golangci-lint linting

* chore: fix linter issues

* feat: add linting into the workflow

* docs: update lint docs

* fix: cr suggestions

* fix: remove old formatting and vetting scripts

* fix: add docker make target

* fix: action go caching

* fix: depreciated actions checkout version

* fix: cr suggestion

* fix: cr suggestions

---------

Co-authored-by: Manu Gupta <manugupt1@gmail.com>
2023-02-24 20:39:17 -08:00

80 lines
1.9 KiB
Go

package paths
import (
"net/http"
"path"
"strings"
"github.com/gomods/athens/pkg/errors"
"github.com/gorilla/mux"
)
// GetModule gets the module from the path of a ?go-get=1 request.
func GetModule(r *http.Request) (string, error) {
const op errors.Op = "paths.GetModule"
module := mux.Vars(r)["module"]
if module == "" {
return "", errors.E(op, "missing module parameter")
}
return DecodePath(module)
}
// GetVersion gets the version from the path of a ?go-get=1 request.
func GetVersion(r *http.Request) (string, error) {
const op errors.Op = "paths.GetVersion"
version := mux.Vars(r)["version"]
if version == "" {
return "", errors.E(op, "missing version parameter")
}
return DecodePath(version)
}
// AllPathParams holds the module and version in the path of a ?go-get=1
// request.
type AllPathParams struct {
Module string `json:"module"`
Version string `json:"version"`
}
// GetAllParams fetches the path params from r and returns them.
func GetAllParams(r *http.Request) (*AllPathParams, error) {
const op errors.Op = "paths.GetAllParams"
mod, err := GetModule(r)
if err != nil {
return nil, errors.E(op, err)
}
version, err := GetVersion(r)
if err != nil {
return nil, errors.E(op, err)
}
return &AllPathParams{Module: mod, Version: version}, nil
}
// MatchesPattern reports whether the path prefix of target matches
// pattern (as defined by path.Match).
//
// This tries to keep the same behavior as GOPRIVATE/GONOPROXY/GONOSUMDB,
// and is adopted from:
// https://github.com/golang/go/blob/a11644a26557ea436d456f005f39f4e01902bafe/src/cmd/go/internal/str/path.go#L58
func MatchesPattern(pattern, target string) bool {
n := strings.Count(pattern, "/")
prefix := target
for i := 0; i < len(target); i++ {
if target[i] == '/' {
if n == 0 {
prefix = target[:i]
break
}
n--
}
}
if n > 0 {
return false
}
matched, _ := path.Match(pattern, prefix)
return matched
}