From 5dbc90d63ab77c510b18dc47c942a0c605d6cadb Mon Sep 17 00:00:00 2001 From: Tommaso Visconti Date: Sun, 4 Feb 2024 15:25:16 +0100 Subject: [PATCH] Smugmug API Mock --- CONTRIBUTING.md | 6 + api.go | 6 +- cmd/api_mock/albumimages_1.json | 29 + cmd/api_mock/authuser.json | 7 + cmd/api_mock/main.go | 90 ++ cmd/api_mock/photo.jpg | Bin 0 -> 289397 bytes cmd/api_mock/user.json | 15 + cmd/api_mock/useralbums_1.json | 18 + cmd/smugmug-backup/main.go | 5 + go.mod | 1 + go.sum | 2 + http.go | 26 +- json_structs.go | 1 + smugmug.go | 8 +- vendor/github.com/go-chi/chi/v5/.gitignore | 3 + vendor/github.com/go-chi/chi/v5/CHANGELOG.md | 336 +++++++ .../github.com/go-chi/chi/v5/CONTRIBUTING.md | 31 + vendor/github.com/go-chi/chi/v5/LICENSE | 20 + vendor/github.com/go-chi/chi/v5/Makefile | 22 + vendor/github.com/go-chi/chi/v5/README.md | 500 ++++++++++ vendor/github.com/go-chi/chi/v5/SECURITY.md | 5 + vendor/github.com/go-chi/chi/v5/chain.go | 49 + vendor/github.com/go-chi/chi/v5/chi.go | 134 +++ vendor/github.com/go-chi/chi/v5/context.go | 163 ++++ .../go-chi/chi/v5/middleware/basic_auth.go | 33 + .../go-chi/chi/v5/middleware/clean_path.go | 28 + .../go-chi/chi/v5/middleware/compress.go | 398 ++++++++ .../chi/v5/middleware/content_charset.go | 51 + .../chi/v5/middleware/content_encoding.go | 34 + .../go-chi/chi/v5/middleware/content_type.go | 49 + .../go-chi/chi/v5/middleware/get_head.go | 39 + .../go-chi/chi/v5/middleware/heartbeat.go | 26 + .../go-chi/chi/v5/middleware/logger.go | 172 ++++ .../go-chi/chi/v5/middleware/maybe.go | 18 + .../go-chi/chi/v5/middleware/middleware.go | 23 + .../go-chi/chi/v5/middleware/nocache.go | 59 ++ .../go-chi/chi/v5/middleware/page_route.go | 20 + .../go-chi/chi/v5/middleware/path_rewrite.go | 16 + .../go-chi/chi/v5/middleware/profiler.go | 46 + .../go-chi/chi/v5/middleware/realip.go | 60 ++ .../go-chi/chi/v5/middleware/recoverer.go | 203 ++++ .../go-chi/chi/v5/middleware/request_id.go | 96 ++ .../go-chi/chi/v5/middleware/request_size.go | 18 + .../go-chi/chi/v5/middleware/route_headers.go | 151 +++ .../go-chi/chi/v5/middleware/strip.go | 62 ++ .../go-chi/chi/v5/middleware/sunset.go | 25 + .../chi/v5/middleware/supress_notfound.go | 27 + .../go-chi/chi/v5/middleware/terminal.go | 63 ++ .../go-chi/chi/v5/middleware/throttle.go | 132 +++ .../go-chi/chi/v5/middleware/timeout.go | 48 + .../go-chi/chi/v5/middleware/url_format.go | 75 ++ .../go-chi/chi/v5/middleware/value.go | 17 + .../go-chi/chi/v5/middleware/wrap_writer.go | 219 +++++ vendor/github.com/go-chi/chi/v5/mux.go | 492 ++++++++++ vendor/github.com/go-chi/chi/v5/tree.go | 892 ++++++++++++++++++ vendor/modules.txt | 4 + 56 files changed, 5058 insertions(+), 15 deletions(-) create mode 100644 cmd/api_mock/albumimages_1.json create mode 100644 cmd/api_mock/authuser.json create mode 100644 cmd/api_mock/main.go create mode 100644 cmd/api_mock/photo.jpg create mode 100644 cmd/api_mock/user.json create mode 100644 cmd/api_mock/useralbums_1.json create mode 100644 vendor/github.com/go-chi/chi/v5/.gitignore create mode 100644 vendor/github.com/go-chi/chi/v5/CHANGELOG.md create mode 100644 vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md create mode 100644 vendor/github.com/go-chi/chi/v5/LICENSE create mode 100644 vendor/github.com/go-chi/chi/v5/Makefile create mode 100644 vendor/github.com/go-chi/chi/v5/README.md create mode 100644 vendor/github.com/go-chi/chi/v5/SECURITY.md create mode 100644 vendor/github.com/go-chi/chi/v5/chain.go create mode 100644 vendor/github.com/go-chi/chi/v5/chi.go create mode 100644 vendor/github.com/go-chi/chi/v5/context.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/clean_path.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/compress.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_charset.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/content_type.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/get_head.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/logger.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/maybe.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/middleware.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/nocache.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/page_route.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/path_rewrite.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/profiler.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/realip.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/recoverer.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/request_id.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/request_size.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/route_headers.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/strip.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/sunset.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/supress_notfound.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/terminal.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/throttle.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/timeout.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/url_format.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/value.go create mode 100644 vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go create mode 100644 vendor/github.com/go-chi/chi/v5/mux.go create mode 100644 vendor/github.com/go-chi/chi/v5/tree.go diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 32dab69..a99d451 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -26,3 +26,9 @@ Contributing is more than welcome :smile: I'm dropping here the link to [package documentation](https://pkg.go.dev/github.com/tommyblue/smugmug-backup?tab=doc), in case you need that. + +### Mocking the API server + +This package contains a mock server that can be executed with `go run ./cmd/api_mock` so that you +don't need to have a real SmugMug account. The server will listen on http://127.0.0.1:3000 +To use it run the smugmug-backup binary with the `-mock` flag. diff --git a/api.go b/api.go index 3ae949d..13fd883 100644 --- a/api.go +++ b/api.go @@ -160,7 +160,11 @@ func (w *Worker) saveVideo(image albumImage, folder string) error { func (w *Worker) setChTime(image albumImage, dest string) error { // Try first with the date in the image, to avoid making an additional call - created, err := time.Parse(time.RFC3339, image.DateTimeOriginal) + dt := image.DateTimeOriginal + if dt == "" { + dt = image.DateTimeUploaded + } + created, err := time.Parse(time.RFC3339, dt) if err != nil || created.IsZero() { created = w.imageTimestamp(image) } diff --git a/cmd/api_mock/albumimages_1.json b/cmd/api_mock/albumimages_1.json new file mode 100644 index 0000000..c2c088b --- /dev/null +++ b/cmd/api_mock/albumimages_1.json @@ -0,0 +1,29 @@ +{ + "Response": { + "Uri": "/api/v2/album/aX3TYu!images", + "AlbumImage": [ + { + + "ArchivedMD5": "258597waaf35aed642z08c351426b5e4", + "ArchivedSize": 476277, + "ArchivedUri": "http://localhost:3000/photos/photo.jpg", + "Caption": "", + "DateTimeUploaded": "2024-01-05T20:04:39+00:00", + "FileName": "somePhoto.jpg", + "ImageKey": "iTsf4K3", + "IsVideo": false, + "Keywords": "", + "Processing": false, + "UploadKey": "11112222333", + "Uris": { + "ImageMetadata": { + "Uri": "/api/v2/image/iTsf4K3-0!metadata" + } + } + } + ], + "Pages": { + "NextPage": "" + } + } +} diff --git a/cmd/api_mock/authuser.json b/cmd/api_mock/authuser.json new file mode 100644 index 0000000..fef50dd --- /dev/null +++ b/cmd/api_mock/authuser.json @@ -0,0 +1,7 @@ +{ + "Response": { + "User": { + "NickName": "myUser" + } + } +} diff --git a/cmd/api_mock/main.go b/cmd/api_mock/main.go new file mode 100644 index 0000000..98d340f --- /dev/null +++ b/cmd/api_mock/main.go @@ -0,0 +1,90 @@ +package main + +import ( + _ "embed" + "encoding/json" + "net/http" + + chi "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" + log "github.com/sirupsen/logrus" +) + +//go:embed authuser.json +var authuser []byte + +//go:embed user.json +var user []byte + +//go:embed useralbums_1.json +var useralbums_1 []byte + +//go:embed albumimages_1.json +var albumimages_1 []byte + +//go:embed photo.jpg +var photo []byte + +func parseJson(content []byte) any { + var dest interface{} + if err := json.Unmarshal(content, &dest); err != nil { + log.Fatal(err) + } + + return dest +} + +func main() { + r := chi.NewRouter() + r.Use(middleware.Logger) + + api := chi.NewRouter() + + api.Route("/v2", func(r chi.Router) { + // User details. Get the first page of the user albums + r.Get("/user/{username}", func(w http.ResponseWriter, r *http.Request) { + //username := chi.URLParam(r, "username") + //resp.Response.User.Uris.UserAlbums.URI = fmt.Sprintf("/api/v2/user/%s!albums", username) + responseOk(w, parseJson(user)) + }) + + r.Get("/album/{albumId}!images", func(w http.ResponseWriter, r *http.Request) { + //albumId := chi.URLParam(r, "albumId") + responseOk(w, parseJson(albumimages_1)) + }) + + r.Get("/user/{username}!albums", func(w http.ResponseWriter, r *http.Request) { + responseOk(w, parseJson(useralbums_1)) + }) + }) + + api.Get("/v2!authuser", func(w http.ResponseWriter, r *http.Request) { + responseOk(w, parseJson(authuser)) + }) + + r.Mount("/api", api) + + r.Get("/photos/{fname}.jpg", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Content-Type", "image/jpg") + w.Write(photo) + }) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + log.Infof("404 URI => %s", r.RequestURI) + w.WriteHeader(http.StatusNotFound) + }) + + addr := "127.0.0.1:3000" + log.Infof("Starting server on %s", addr) + http.ListenAndServe(addr, r) +} + +func responseOk(w http.ResponseWriter, resp any) { + w.Header().Set("Content-Type", "application/json") + h := http.StatusOK + if err := json.NewEncoder(w).Encode(resp); err != nil { + log.Warnf("Error: %v", err) + h = http.StatusInternalServerError + } + w.WriteHeader(h) +} diff --git a/cmd/api_mock/photo.jpg b/cmd/api_mock/photo.jpg new file mode 100644 index 0000000000000000000000000000000000000000..33793baf0bb08011b2503b59ed8f283ebcc60983 GIT binary patch literal 289397 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 IM6N<$f`3@>LI3~& literal 0 HcmV?d00001 diff --git a/cmd/api_mock/user.json b/cmd/api_mock/user.json new file mode 100644 index 0000000..21e86b4 --- /dev/null +++ b/cmd/api_mock/user.json @@ -0,0 +1,15 @@ +{ + "Response": { + "User": { + "Uris": { + "UserAlbums": { + "Uri": "/api/v2/user/myUser!albums", + "Locator": "Album", + "LocatorType": "Objects", + "UriDescription": "All of user's albums", + "EndpointType": "UserAlbums" + } + } + } + } +} diff --git a/cmd/api_mock/useralbums_1.json b/cmd/api_mock/useralbums_1.json new file mode 100644 index 0000000..4f5f13b --- /dev/null +++ b/cmd/api_mock/useralbums_1.json @@ -0,0 +1,18 @@ +{ + "Response": { + "Uri": "/api/v2/user/myUser!albums", + "Album": [ + { + "UrlPath": "/MyAlbum/2024/01", + "Uris": { + "AlbumImages": { + "Uri": "/api/v2/album/aX3TYu!images" + } + } + } + ], + "Pages": { + "NextPage": "" + } + } +} diff --git a/cmd/smugmug-backup/main.go b/cmd/smugmug-backup/main.go index eea6031..e7539e2 100644 --- a/cmd/smugmug-backup/main.go +++ b/cmd/smugmug-backup/main.go @@ -21,6 +21,7 @@ var version = "-- unknown --" var flagVersion = flag.Bool("version", false, "print version number") var flagStats = flag.Bool("stats", false, fmt.Sprintf("show stats at %s", statsAddr)) var cfgPath = flag.String("cfg", "", "folder containing configuration file") +var mockServer = flag.Bool("mock", false, "use the included mock server (must be running on localhost:3000)") func init() { log.SetFormatter(&log.TextFormatter{}) @@ -56,6 +57,10 @@ func main() { log.WithError(err).Fatal("Configuration error") } + if *mockServer { + cfg.HTTPBaseUrl = "http://localhost:3000" + } + wrk, err := smugmug.New(cfg) if err != nil { log.WithError(err).Fatal("Can't initialize the package") diff --git a/go.mod b/go.mod index 5d3eb74..bfee0e3 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.20 require ( github.com/arl/statsviz v0.6.0 + github.com/go-chi/chi/v5 v5.0.11 github.com/sirupsen/logrus v1.9.3 github.com/spf13/viper v1.18.2 ) diff --git a/go.sum b/go.sum index 90c162e..79f234d 100644 --- a/go.sum +++ b/go.sum @@ -6,6 +6,8 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-chi/chi/v5 v5.0.11 h1:BnpYbFZ3T3S1WMpD79r7R5ThWX40TaFB7L31Y8xqSwA= +github.com/go-chi/chi/v5 v5.0.11/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= diff --git a/http.go b/http.go index ce21efe..ab941e8 100644 --- a/http.go +++ b/http.go @@ -12,22 +12,22 @@ import ( log "github.com/sirupsen/logrus" ) -// maxRetries defines the number of http calls retries (in case of errors) before giving up -const maxRetries = 3 -const baseAPIURL = "https://api.smugmug.com" - type header struct { name string value string } type handler struct { - oauth *oauthConf + baseUrl string + maxRetries int + oauth *oauthConf } -func newHTTPHandler(apiKey, apiSecret, userToken, userSecret string) *handler { +func newHTTPHandler(baseUrl string, maxRetries int, apiKey, apiSecret, userToken, userSecret string) *handler { return &handler{ - oauth: newOauthConf(apiKey, apiSecret, userToken, userSecret), + baseUrl: baseUrl, + maxRetries: maxRetries, + oauth: newOauthConf(apiKey, apiSecret, userToken, userSecret), } } @@ -36,7 +36,7 @@ func (s *handler) get(url string, obj interface{}) error { if url == "" { return errors.New("can't get empty url") } - return s.getJSON(fmt.Sprintf("%s%s", baseAPIURL, url), obj) + return s.getJSON(fmt.Sprintf("%s%s", s.baseUrl, url), obj) } // download the resource (image or video) from the given url to the given destination, checking @@ -76,7 +76,7 @@ func (s *handler) download(dest, downloadURL string, fileSize int64) (bool, erro // getJSON makes a http calls to the given url, trying to decode the JSON response on the given obj func (s *handler) getJSON(url string, obj interface{}) error { var result interface{} - for i := 1; i <= maxRetries; i++ { + for i := 1; i <= s.maxRetries; i++ { log.Debug("Calling ", url) resp, err := s.makeAPICall(url) if err != nil { @@ -86,7 +86,7 @@ func (s *handler) getJSON(url string, obj interface{}) error { defer resp.Body.Close() if err != nil { log.Errorf("%s: reading response. %s", url, err) - if i >= maxRetries { + if i >= s.maxRetries { return err } } else { @@ -103,7 +103,7 @@ func (s *handler) makeAPICall(url string) (*http.Response, error) { var resp *http.Response var errorsList []error - for i := 1; i <= maxRetries; i++ { + for i := 1; i <= s.maxRetries; i++ { req, _ := http.NewRequest("GET", url, nil) // Auth header must be generate every time (nonce must change) @@ -122,7 +122,7 @@ func (s *handler) makeAPICall(url string) (*http.Response, error) { if err != nil { log.Debugf("#%d %s: %s\n", i, url, err) errorsList = append(errorsList, err) - if i >= maxRetries { + if i >= s.maxRetries { for _, e := range errorsList { log.Error(e) } @@ -135,7 +135,7 @@ func (s *handler) makeAPICall(url string) (*http.Response, error) { if r.StatusCode >= 400 { errorsList = append(errorsList, errors.New(r.Status)) - if i >= maxRetries { + if i >= s.maxRetries { for _, e := range errorsList { log.Error(e) } diff --git a/json_structs.go b/json_structs.go index 0dd5f63..23b9148 100644 --- a/json_structs.go +++ b/json_structs.go @@ -75,6 +75,7 @@ type albumImage struct { UploadKey string `json:"UploadKey"` DateTimeOriginal string `json:"DateTimeOriginal"` Caption string `json:"Caption"` + DateTimeUploaded string `json:"DateTimeUploaded"` Keywords string `json:"Keywords"` Latitude string `json:"Latitude"` Longitude string `json:"Longitude"` diff --git a/smugmug.go b/smugmug.go index 5800c5c..75dee54 100644 --- a/smugmug.go +++ b/smugmug.go @@ -26,6 +26,8 @@ type Conf struct { ForceVideoDownload bool // When true, download videos also if marked as under processing ConcurrentDownloads int // number of concurrent downloads of images and videos, default is 1 ConcurrentAlbums int // number of concurrent albums analyzed via API calls + HTTPBaseUrl string // Smugmug API URL, defaults to https://api.smugmug.com + HTTPMaxRetries int // Max number of retries for HTTP calls, defaults to 3 username string metadataFile string @@ -101,6 +103,8 @@ func ReadConf(cfgPath string) (*Conf, error) { viper.AddConfigPath(".") // defaults + viper.SetDefault("http.base_url", "https://api.smugmug.com") + viper.SetDefault("http.max_retries", 3) viper.SetDefault("store.file_names", "{{.FileName}}") viper.SetDefault("store.concurrent_downloads", 1) viper.SetDefault("store.concurrent_albums", 1) @@ -130,6 +134,8 @@ func ReadConf(cfgPath string) (*Conf, error) { ForceVideoDownload: viper.GetBool("store.force_video_download"), ConcurrentDownloads: viper.GetInt("store.concurrent_downloads"), ConcurrentAlbums: viper.GetInt("store.concurrent_albums"), + HTTPBaseUrl: viper.GetString("http.base_url"), + HTTPMaxRetries: viper.GetInt("http.max_retries"), } cfg.overrideEnvConf() @@ -178,7 +184,7 @@ func New(cfg *Conf) (*Worker, error) { return nil, err } - handler := newHTTPHandler(cfg.ApiKey, cfg.ApiSecret, cfg.UserToken, cfg.UserSecret) + handler := newHTTPHandler(cfg.HTTPBaseUrl, cfg.HTTPMaxRetries, cfg.ApiKey, cfg.ApiSecret, cfg.UserToken, cfg.UserSecret) tmpl, err := buildFilenameTemplate(cfg.Filenames) if err != nil { diff --git a/vendor/github.com/go-chi/chi/v5/.gitignore b/vendor/github.com/go-chi/chi/v5/.gitignore new file mode 100644 index 0000000..ba22c99 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/.gitignore @@ -0,0 +1,3 @@ +.idea +*.sw? +.vscode diff --git a/vendor/github.com/go-chi/chi/v5/CHANGELOG.md b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md new file mode 100644 index 0000000..83d5aa2 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/CHANGELOG.md @@ -0,0 +1,336 @@ +# Changelog + +## v5.0.11 (2023-12-19) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.10...v5.0.11 + + +## v5.0.10 (2023-07-13) + +- Fixed small edge case in tests of v5.0.9 for older Go versions +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.9...v5.0.10 + + +## v5.0.9 (2023-07-13) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.8...v5.0.9 + + +## v5.0.8 (2022-12-07) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.7...v5.0.8 + + +## v5.0.7 (2021-11-18) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.6...v5.0.7 + + +## v5.0.6 (2021-11-15) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.5...v5.0.6 + + +## v5.0.5 (2021-10-27) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.4...v5.0.5 + + +## v5.0.4 (2021-08-29) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.3...v5.0.4 + + +## v5.0.3 (2021-04-29) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.2...v5.0.3 + + +## v5.0.2 (2021-03-25) + +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.1...v5.0.2 + + +## v5.0.1 (2021-03-10) + +- Small improvements +- History of changes: see https://github.com/go-chi/chi/compare/v5.0.0...v5.0.1 + + +## v5.0.0 (2021-02-27) + +- chi v5, `github.com/go-chi/chi/v5` introduces the adoption of Go's SIV to adhere to the current state-of-the-tools in Go. +- chi v1.5.x did not work out as planned, as the Go tooling is too powerful and chi's adoption is too wide. + The most responsible thing to do for everyone's benefit is to just release v5 with SIV, so I present to you all, + chi v5 at `github.com/go-chi/chi/v5`. I hope someday the developer experience and ergonomics I've been seeking + will still come to fruition in some form, see https://github.com/golang/go/issues/44550 +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.4...v5.0.0 + + +## v1.5.4 (2021-02-27) + +- Undo prior retraction in v1.5.3 as we prepare for v5.0.0 release +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.3...v1.5.4 + + +## v1.5.3 (2021-02-21) + +- Update go.mod to go 1.16 with new retract directive marking all versions without prior go.mod support +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.2...v1.5.3 + + +## v1.5.2 (2021-02-10) + +- Reverting allocation optimization as a precaution as go test -race fails. +- Minor improvements, see history below +- History of changes: see https://github.com/go-chi/chi/compare/v1.5.1...v1.5.2 + + +## v1.5.1 (2020-12-06) + +- Performance improvement: removing 1 allocation by foregoing context.WithValue, thank you @bouk for + your contribution (https://github.com/go-chi/chi/pull/555). Note: new benchmarks posted in README. +- `middleware.CleanPath`: new middleware that clean's request path of double slashes +- deprecate & remove `chi.ServerBaseContext` in favour of stdlib `http.Server#BaseContext` +- plus other tiny improvements, see full commit history below +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.2...v1.5.1 + + +## v1.5.0 (2020-11-12) - now with go.mod support + +`chi` dates back to 2016 with it's original implementation as one of the first routers to adopt the newly introduced +context.Context api to the stdlib -- set out to design a router that is faster, more modular and simpler than anything +else out there -- while not introducing any custom handler types or dependencies. Today, `chi` still has zero dependencies, +and in many ways is future proofed from changes, given it's minimal nature. Between versions, chi's iterations have been very +incremental, with the architecture and api being the same today as it was originally designed in 2016. For this reason it +makes chi a pretty easy project to maintain, as well thanks to the many amazing community contributions over the years +to who all help make chi better (total of 86 contributors to date -- thanks all!). + +Chi has been a labour of love, art and engineering, with the goals to offer beautiful ergonomics, flexibility, performance +and simplicity when building HTTP services with Go. I've strived to keep the router very minimal in surface area / code size, +and always improving the code wherever possible -- and as of today the `chi` package is just 1082 lines of code (not counting +middlewares, which are all optional). As well, I don't have the exact metrics, but from my analysis and email exchanges from +companies and developers, chi is used by thousands of projects around the world -- thank you all as there is no better form of +joy for me than to have art I had started be helpful and enjoyed by others. And of course I use chi in all of my own projects too :) + +For me, the aesthetics of chi's code and usage are very important. With the introduction of Go's module support +(which I'm a big fan of), chi's past versioning scheme choice to v2, v3 and v4 would mean I'd require the import path +of "github.com/go-chi/chi/v4", leading to the lengthy discussion at https://github.com/go-chi/chi/issues/462. +Haha, to some, you may be scratching your head why I've spent > 1 year stalling to adopt "/vXX" convention in the import +path -- which isn't horrible in general -- but for chi, I'm unable to accept it as I strive for perfection in it's API design, +aesthetics and simplicity. It just doesn't feel good to me given chi's simple nature -- I do not foresee a "v5" or "v6", +and upgrading between versions in the future will also be just incremental. + +I do understand versioning is a part of the API design as well, which is why the solution for a while has been to "do nothing", +as Go supports both old and new import paths with/out go.mod. However, now that Go module support has had time to iron out kinks and +is adopted everywhere, it's time for chi to get with the times. Luckily, I've discovered a path forward that will make me happy, +while also not breaking anyone's app who adopted a prior versioning from tags in v2/v3/v4. I've made an experimental release of +v1.5.0 with go.mod silently, and tested it with new and old projects, to ensure the developer experience is preserved, and it's +largely unnoticed. Fortunately, Go's toolchain will check the tags of a repo and consider the "latest" tag the one with go.mod. +However, you can still request a specific older tag such as v4.1.2, and everything will "just work". But new users can just +`go get github.com/go-chi/chi` or `go get github.com/go-chi/chi@latest` and they will get the latest version which contains +go.mod support, which is v1.5.0+. `chi` will not change very much over the years, just like it hasn't changed much from 4 years ago. +Therefore, we will stay on v1.x from here on, starting from v1.5.0. Any breaking changes will bump a "minor" release and +backwards-compatible improvements/fixes will bump a "tiny" release. + +For existing projects who want to upgrade to the latest go.mod version, run: `go get -u github.com/go-chi/chi@v1.5.0`, +which will get you on the go.mod version line (as Go's mod cache may still remember v4.x). Brand new systems can run +`go get -u github.com/go-chi/chi` or `go get -u github.com/go-chi/chi@latest` to install chi, which will install v1.5.0+ +built with go.mod support. + +My apologies to the developers who will disagree with the decisions above, but, hope you'll try it and see it's a very +minor request which is backwards compatible and won't break your existing installations. + +Cheers all, happy coding! + + +--- + + +## v4.1.2 (2020-06-02) + +- fix that handles MethodNotAllowed with path variables, thank you @caseyhadden for your contribution +- fix to replace nested wildcards correctly in RoutePattern, thank you @@unmultimedio for your contribution +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.1...v4.1.2 + + +## v4.1.1 (2020-04-16) + +- fix for issue https://github.com/go-chi/chi/issues/411 which allows for overlapping regexp + route to the correct handler through a recursive tree search, thanks to @Jahaja for the PR/fix! +- new middleware.RouteHeaders as a simple router for request headers with wildcard support +- History of changes: see https://github.com/go-chi/chi/compare/v4.1.0...v4.1.1 + + +## v4.1.0 (2020-04-1) + +- middleware.LogEntry: Write method on interface now passes the response header + and an extra interface type useful for custom logger implementations. +- middleware.WrapResponseWriter: minor fix +- middleware.Recoverer: a bit prettier +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.4...v4.1.0 + +## v4.0.4 (2020-03-24) + +- middleware.Recoverer: new pretty stack trace printing (https://github.com/go-chi/chi/pull/496) +- a few minor improvements and fixes +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.3...v4.0.4 + + +## v4.0.3 (2020-01-09) + +- core: fix regexp routing to include default value when param is not matched +- middleware: rewrite of middleware.Compress +- middleware: suppress http.ErrAbortHandler in middleware.Recoverer +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.2...v4.0.3 + + +## v4.0.2 (2019-02-26) + +- Minor fixes +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.1...v4.0.2 + + +## v4.0.1 (2019-01-21) + +- Fixes issue with compress middleware: #382 #385 +- History of changes: see https://github.com/go-chi/chi/compare/v4.0.0...v4.0.1 + + +## v4.0.0 (2019-01-10) + +- chi v4 requires Go 1.10.3+ (or Go 1.9.7+) - we have deprecated support for Go 1.7 and 1.8 +- router: respond with 404 on router with no routes (#362) +- router: additional check to ensure wildcard is at the end of a url pattern (#333) +- middleware: deprecate use of http.CloseNotifier (#347) +- middleware: fix RedirectSlashes to include query params on redirect (#334) +- History of changes: see https://github.com/go-chi/chi/compare/v3.3.4...v4.0.0 + + +## v3.3.4 (2019-01-07) + +- Minor middleware improvements. No changes to core library/router. Moving v3 into its +- own branch as a version of chi for Go 1.7, 1.8, 1.9, 1.10, 1.11 +- History of changes: see https://github.com/go-chi/chi/compare/v3.3.3...v3.3.4 + + +## v3.3.3 (2018-08-27) + +- Minor release +- See https://github.com/go-chi/chi/compare/v3.3.2...v3.3.3 + + +## v3.3.2 (2017-12-22) + +- Support to route trailing slashes on mounted sub-routers (#281) +- middleware: new `ContentCharset` to check matching charsets. Thank you + @csucu for your community contribution! + + +## v3.3.1 (2017-11-20) + +- middleware: new `AllowContentType` handler for explicit whitelist of accepted request Content-Types +- middleware: new `SetHeader` handler for short-hand middleware to set a response header key/value +- Minor bug fixes + + +## v3.3.0 (2017-10-10) + +- New chi.RegisterMethod(method) to add support for custom HTTP methods, see _examples/custom-method for usage +- Deprecated LINK and UNLINK methods from the default list, please use `chi.RegisterMethod("LINK")` and `chi.RegisterMethod("UNLINK")` in an `init()` function + + +## v3.2.1 (2017-08-31) + +- Add new `Match(rctx *Context, method, path string) bool` method to `Routes` interface + and `Mux`. Match searches the mux's routing tree for a handler that matches the method/path +- Add new `RouteMethod` to `*Context` +- Add new `Routes` pointer to `*Context` +- Add new `middleware.GetHead` to route missing HEAD requests to GET handler +- Updated benchmarks (see README) + + +## v3.1.5 (2017-08-02) + +- Setup golint and go vet for the project +- As per golint, we've redefined `func ServerBaseContext(h http.Handler, baseCtx context.Context) http.Handler` + to `func ServerBaseContext(baseCtx context.Context, h http.Handler) http.Handler` + + +## v3.1.0 (2017-07-10) + +- Fix a few minor issues after v3 release +- Move `docgen` sub-pkg to https://github.com/go-chi/docgen +- Move `render` sub-pkg to https://github.com/go-chi/render +- Add new `URLFormat` handler to chi/middleware sub-pkg to make working with url mime + suffixes easier, ie. parsing `/articles/1.json` and `/articles/1.xml`. See comments in + https://github.com/go-chi/chi/blob/master/middleware/url_format.go for example usage. + + +## v3.0.0 (2017-06-21) + +- Major update to chi library with many exciting updates, but also some *breaking changes* +- URL parameter syntax changed from `/:id` to `/{id}` for even more flexible routing, such as + `/articles/{month}-{day}-{year}-{slug}`, `/articles/{id}`, and `/articles/{id}.{ext}` on the + same router +- Support for regexp for routing patterns, in the form of `/{paramKey:regExp}` for example: + `r.Get("/articles/{name:[a-z]+}", h)` and `chi.URLParam(r, "name")` +- Add `Method` and `MethodFunc` to `chi.Router` to allow routing definitions such as + `r.Method("GET", "/", h)` which provides a cleaner interface for custom handlers like + in `_examples/custom-handler` +- Deprecating `mux#FileServer` helper function. Instead, we encourage users to create their + own using file handler with the stdlib, see `_examples/fileserver` for an example +- Add support for LINK/UNLINK http methods via `r.Method()` and `r.MethodFunc()` +- Moved the chi project to its own organization, to allow chi-related community packages to + be easily discovered and supported, at: https://github.com/go-chi +- *NOTE:* please update your import paths to `"github.com/go-chi/chi"` +- *NOTE:* chi v2 is still available at https://github.com/go-chi/chi/tree/v2 + + +## v2.1.0 (2017-03-30) + +- Minor improvements and update to the chi core library +- Introduced a brand new `chi/render` sub-package to complete the story of building + APIs to offer a pattern for managing well-defined request / response payloads. Please + check out the updated `_examples/rest` example for how it works. +- Added `MethodNotAllowed(h http.HandlerFunc)` to chi.Router interface + + +## v2.0.0 (2017-01-06) + +- After many months of v2 being in an RC state with many companies and users running it in + production, the inclusion of some improvements to the middlewares, we are very pleased to + announce v2.0.0 of chi. + + +## v2.0.0-rc1 (2016-07-26) + +- Huge update! chi v2 is a large refactor targeting Go 1.7+. As of Go 1.7, the popular + community `"net/context"` package has been included in the standard library as `"context"` and + utilized by `"net/http"` and `http.Request` to managing deadlines, cancelation signals and other + request-scoped values. We're very excited about the new context addition and are proud to + introduce chi v2, a minimal and powerful routing package for building large HTTP services, + with zero external dependencies. Chi focuses on idiomatic design and encourages the use of + stdlib HTTP handlers and middlewares. +- chi v2 deprecates its `chi.Handler` interface and requires `http.Handler` or `http.HandlerFunc` +- chi v2 stores URL routing parameters and patterns in the standard request context: `r.Context()` +- chi v2 lower-level routing context is accessible by `chi.RouteContext(r.Context()) *chi.Context`, + which provides direct access to URL routing parameters, the routing path and the matching + routing patterns. +- Users upgrading from chi v1 to v2, need to: + 1. Update the old chi.Handler signature, `func(ctx context.Context, w http.ResponseWriter, r *http.Request)` to + the standard http.Handler: `func(w http.ResponseWriter, r *http.Request)` + 2. Use `chi.URLParam(r *http.Request, paramKey string) string` + or `URLParamFromCtx(ctx context.Context, paramKey string) string` to access a url parameter value + + +## v1.0.0 (2016-07-01) + +- Released chi v1 stable https://github.com/go-chi/chi/tree/v1.0.0 for Go 1.6 and older. + + +## v0.9.0 (2016-03-31) + +- Reuse context objects via sync.Pool for zero-allocation routing [#33](https://github.com/go-chi/chi/pull/33) +- BREAKING NOTE: due to subtle API changes, previously `chi.URLParams(ctx)["id"]` used to access url parameters + has changed to: `chi.URLParam(ctx, "id")` diff --git a/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md new file mode 100644 index 0000000..c0ac2df --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/CONTRIBUTING.md @@ -0,0 +1,31 @@ +# Contributing + +## Prerequisites + +1. [Install Go][go-install]. +2. Download the sources and switch the working directory: + + ```bash + go get -u -d github.com/go-chi/chi + cd $GOPATH/src/github.com/go-chi/chi + ``` + +## Submitting a Pull Request + +A typical workflow is: + +1. [Fork the repository.][fork] [This tip maybe also helpful.][go-fork-tip] +2. [Create a topic branch.][branch] +3. Add tests for your change. +4. Run `go test`. If your tests pass, return to the step 3. +5. Implement the change and ensure the steps from the previous step pass. +6. Run `goimports -w .`, to ensure the new code conforms to Go formatting guideline. +7. [Add, commit and push your changes.][git-help] +8. [Submit a pull request.][pull-req] + +[go-install]: https://golang.org/doc/install +[go-fork-tip]: http://blog.campoy.cat/2014/03/github-and-go-forking-pull-requests-and.html +[fork]: https://help.github.com/articles/fork-a-repo +[branch]: http://learn.github.com/p/branching.html +[git-help]: https://guides.github.com +[pull-req]: https://help.github.com/articles/using-pull-requests diff --git a/vendor/github.com/go-chi/chi/v5/LICENSE b/vendor/github.com/go-chi/chi/v5/LICENSE new file mode 100644 index 0000000..d99f02f --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/LICENSE @@ -0,0 +1,20 @@ +Copyright (c) 2015-present Peter Kieltyka (https://github.com/pkieltyka), Google Inc. + +MIT License + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/go-chi/chi/v5/Makefile b/vendor/github.com/go-chi/chi/v5/Makefile new file mode 100644 index 0000000..e0f18c7 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/Makefile @@ -0,0 +1,22 @@ +.PHONY: all +all: + @echo "**********************************************************" + @echo "** chi build tool **" + @echo "**********************************************************" + + +.PHONY: test +test: + go clean -testcache && $(MAKE) test-router && $(MAKE) test-middleware + +.PHONY: test-router +test-router: + go test -race -v . + +.PHONY: test-middleware +test-middleware: + go test -race -v ./middleware + +.PHONY: docs +docs: + npx docsify-cli serve ./docs diff --git a/vendor/github.com/go-chi/chi/v5/README.md b/vendor/github.com/go-chi/chi/v5/README.md new file mode 100644 index 0000000..4b1c99d --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/README.md @@ -0,0 +1,500 @@ +# chi + + +[![GoDoc Widget]][GoDoc] + +`chi` is a lightweight, idiomatic and composable router for building Go HTTP services. It's +especially good at helping you write large REST API services that are kept maintainable as your +project grows and changes. `chi` is built on the new `context` package introduced in Go 1.7 to +handle signaling, cancelation and request-scoped values across a handler chain. + +The focus of the project has been to seek out an elegant and comfortable design for writing +REST API servers, written during the development of the Pressly API service that powers our +public API service, which in turn powers all of our client-side applications. + +The key considerations of chi's design are: project structure, maintainability, standard http +handlers (stdlib-only), developer productivity, and deconstructing a large system into many small +parts. The core router `github.com/go-chi/chi` is quite small (less than 1000 LOC), but we've also +included some useful/optional subpackages: [middleware](/middleware), [render](https://github.com/go-chi/render) +and [docgen](https://github.com/go-chi/docgen). We hope you enjoy it too! + +## Install + +`go get -u github.com/go-chi/chi/v5` + + +## Features + +* **Lightweight** - cloc'd in ~1000 LOC for the chi router +* **Fast** - yes, see [benchmarks](#benchmarks) +* **100% compatible with net/http** - use any http or middleware pkg in the ecosystem that is also compatible with `net/http` +* **Designed for modular/composable APIs** - middlewares, inline middlewares, route groups and sub-router mounting +* **Context control** - built on new `context` package, providing value chaining, cancellations and timeouts +* **Robust** - in production at Pressly, Cloudflare, Heroku, 99Designs, and many others (see [discussion](https://github.com/go-chi/chi/issues/91)) +* **Doc generation** - `docgen` auto-generates routing documentation from your source to JSON or Markdown +* **Go.mod support** - as of v5, go.mod support (see [CHANGELOG](https://github.com/go-chi/chi/blob/master/CHANGELOG.md)) +* **No external dependencies** - plain ol' Go stdlib + net/http + + +## Examples + +See [_examples/](https://github.com/go-chi/chi/blob/master/_examples/) for a variety of examples. + + +**As easy as:** + +```go +package main + +import ( + "net/http" + + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + r := chi.NewRouter() + r.Use(middleware.Logger) + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("welcome")) + }) + http.ListenAndServe(":3000", r) +} +``` + +**REST Preview:** + +Here is a little preview of how routing looks like with chi. Also take a look at the generated routing docs +in JSON ([routes.json](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.json)) and in +Markdown ([routes.md](https://github.com/go-chi/chi/blob/master/_examples/rest/routes.md)). + +I highly recommend reading the source of the [examples](https://github.com/go-chi/chi/blob/master/_examples/) listed +above, they will show you all the features of chi and serve as a good form of documentation. + +```go +import ( + //... + "context" + "github.com/go-chi/chi/v5" + "github.com/go-chi/chi/v5/middleware" +) + +func main() { + r := chi.NewRouter() + + // A good base middleware stack + r.Use(middleware.RequestID) + r.Use(middleware.RealIP) + r.Use(middleware.Logger) + r.Use(middleware.Recoverer) + + // Set a timeout value on the request context (ctx), that will signal + // through ctx.Done() that the request has timed out and further + // processing should be stopped. + r.Use(middleware.Timeout(60 * time.Second)) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + w.Write([]byte("hi")) + }) + + // RESTy routes for "articles" resource + r.Route("/articles", func(r chi.Router) { + r.With(paginate).Get("/", listArticles) // GET /articles + r.With(paginate).Get("/{month}-{day}-{year}", listArticlesByDate) // GET /articles/01-16-2017 + + r.Post("/", createArticle) // POST /articles + r.Get("/search", searchArticles) // GET /articles/search + + // Regexp url parameters: + r.Get("/{articleSlug:[a-z-]+}", getArticleBySlug) // GET /articles/home-is-toronto + + // Subrouters: + r.Route("/{articleID}", func(r chi.Router) { + r.Use(ArticleCtx) + r.Get("/", getArticle) // GET /articles/123 + r.Put("/", updateArticle) // PUT /articles/123 + r.Delete("/", deleteArticle) // DELETE /articles/123 + }) + }) + + // Mount the admin sub-router + r.Mount("/admin", adminRouter()) + + http.ListenAndServe(":3333", r) +} + +func ArticleCtx(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + articleID := chi.URLParam(r, "articleID") + article, err := dbGetArticle(articleID) + if err != nil { + http.Error(w, http.StatusText(404), 404) + return + } + ctx := context.WithValue(r.Context(), "article", article) + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} + +func getArticle(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + article, ok := ctx.Value("article").(*Article) + if !ok { + http.Error(w, http.StatusText(422), 422) + return + } + w.Write([]byte(fmt.Sprintf("title:%s", article.Title))) +} + +// A completely separate router for administrator routes +func adminRouter() http.Handler { + r := chi.NewRouter() + r.Use(AdminOnly) + r.Get("/", adminIndex) + r.Get("/accounts", adminListAccounts) + return r +} + +func AdminOnly(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + perm, ok := ctx.Value("acl.permission").(YourPermissionType) + if !ok || !perm.IsAdmin() { + http.Error(w, http.StatusText(403), 403) + return + } + next.ServeHTTP(w, r) + }) +} +``` + + +## Router interface + +chi's router is based on a kind of [Patricia Radix trie](https://en.wikipedia.org/wiki/Radix_tree). +The router is fully compatible with `net/http`. + +Built on top of the tree is the `Router` interface: + +```go +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one or more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the github.com/go-chi/docgen package to generate documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} +``` + +Each routing method accepts a URL `pattern` and chain of `handlers`. The URL pattern +supports named params (ie. `/users/{userID}`) and wildcards (ie. `/admin/*`). URL parameters +can be fetched at runtime by calling `chi.URLParam(r, "userID")` for named parameters +and `chi.URLParam(r, "*")` for a wildcard parameter. + + +### Middleware handlers + +chi's middlewares are just stdlib net/http middleware handlers. There is nothing special +about them, which means the router and all the tooling is designed to be compatible and +friendly with any middleware in the community. This offers much better extensibility and reuse +of packages and is at the heart of chi's purpose. + +Here is an example of a standard net/http middleware where we assign a context key `"user"` +the value of `"123"`. This middleware sets a hypothetical user identifier on the request +context and calls the next handler in the chain. + +```go +// HTTP middleware setting a value on the request context +func MyMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // create new context from `r` request context, and assign key `"user"` + // to value of `"123"` + ctx := context.WithValue(r.Context(), "user", "123") + + // call the next handler in the chain, passing the response writer and + // the updated request object with the new context value. + // + // note: context.Context values are nested, so any previously set + // values will be accessible as well, and the new `"user"` key + // will be accessible from this point forward. + next.ServeHTTP(w, r.WithContext(ctx)) + }) +} +``` + + +### Request handlers + +chi uses standard net/http request handlers. This little snippet is an example of a http.Handler +func that reads a user identifier from the request context - hypothetically, identifying +the user sending an authenticated request, validated+set by a previous middleware handler. + +```go +// HTTP handler accessing data from the request context. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + // here we read from the request context and fetch out `"user"` key set in + // the MyMiddleware example above. + user := r.Context().Value("user").(string) + + // respond to the client + w.Write([]byte(fmt.Sprintf("hi %s", user))) +} +``` + + +### URL parameters + +chi's router parses and stores URL parameters right onto the request context. Here is +an example of how to access URL params in your net/http handlers. And of course, middlewares +are able to access the same information. + +```go +// HTTP handler accessing the url routing parameters. +func MyRequestHandler(w http.ResponseWriter, r *http.Request) { + // fetch the url parameter `"userID"` from the request of a matching + // routing pattern. An example routing pattern could be: /users/{userID} + userID := chi.URLParam(r, "userID") + + // fetch `"key"` from the request context + ctx := r.Context() + key := ctx.Value("key").(string) + + // respond to the client + w.Write([]byte(fmt.Sprintf("hi %v, %v", userID, key))) +} +``` + + +## Middlewares + +chi comes equipped with an optional `middleware` package, providing a suite of standard +`net/http` middlewares. Please note, any middleware in the ecosystem that is also compatible +with `net/http` can be used with chi's mux. + +### Core middlewares + +---------------------------------------------------------------------------------------------------- +| chi/middleware Handler | description | +| :--------------------- | :---------------------------------------------------------------------- | +| [AllowContentEncoding] | Enforces a whitelist of request Content-Encoding headers | +| [AllowContentType] | Explicit whitelist of accepted request Content-Types | +| [BasicAuth] | Basic HTTP authentication | +| [Compress] | Gzip compression for clients that accept compressed responses | +| [ContentCharset] | Ensure charset for Content-Type request headers | +| [CleanPath] | Clean double slashes from request path | +| [GetHead] | Automatically route undefined HEAD requests to GET handlers | +| [Heartbeat] | Monitoring endpoint to check the servers pulse | +| [Logger] | Logs the start and end of each request with the elapsed processing time | +| [NoCache] | Sets response headers to prevent clients from caching | +| [Profiler] | Easily attach net/http/pprof to your routers | +| [RealIP] | Sets a http.Request's RemoteAddr to either X-Real-IP or X-Forwarded-For | +| [Recoverer] | Gracefully absorb panics and prints the stack trace | +| [RequestID] | Injects a request ID into the context of each request | +| [RedirectSlashes] | Redirect slashes on routing paths | +| [RouteHeaders] | Route handling for request headers | +| [SetHeader] | Short-hand middleware to set a response header key/value | +| [StripSlashes] | Strip slashes on routing paths | +| [Throttle] | Puts a ceiling on the number of concurrent requests | +| [Timeout] | Signals to the request context when the timeout deadline is reached | +| [URLFormat] | Parse extension from url and put it on request context | +| [WithValue] | Short-hand middleware to set a key/value on the request context | +---------------------------------------------------------------------------------------------------- + +[AllowContentEncoding]: https://pkg.go.dev/github.com/go-chi/chi/middleware#AllowContentEncoding +[AllowContentType]: https://pkg.go.dev/github.com/go-chi/chi/middleware#AllowContentType +[BasicAuth]: https://pkg.go.dev/github.com/go-chi/chi/middleware#BasicAuth +[Compress]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Compress +[ContentCharset]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ContentCharset +[CleanPath]: https://pkg.go.dev/github.com/go-chi/chi/middleware#CleanPath +[GetHead]: https://pkg.go.dev/github.com/go-chi/chi/middleware#GetHead +[GetReqID]: https://pkg.go.dev/github.com/go-chi/chi/middleware#GetReqID +[Heartbeat]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Heartbeat +[Logger]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Logger +[NoCache]: https://pkg.go.dev/github.com/go-chi/chi/middleware#NoCache +[Profiler]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Profiler +[RealIP]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RealIP +[Recoverer]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Recoverer +[RedirectSlashes]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RedirectSlashes +[RequestLogger]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RequestLogger +[RequestID]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RequestID +[RouteHeaders]: https://pkg.go.dev/github.com/go-chi/chi/middleware#RouteHeaders +[SetHeader]: https://pkg.go.dev/github.com/go-chi/chi/middleware#SetHeader +[StripSlashes]: https://pkg.go.dev/github.com/go-chi/chi/middleware#StripSlashes +[Throttle]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Throttle +[ThrottleBacklog]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleBacklog +[ThrottleWithOpts]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleWithOpts +[Timeout]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Timeout +[URLFormat]: https://pkg.go.dev/github.com/go-chi/chi/middleware#URLFormat +[WithLogEntry]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WithLogEntry +[WithValue]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WithValue +[Compressor]: https://pkg.go.dev/github.com/go-chi/chi/middleware#Compressor +[DefaultLogFormatter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#DefaultLogFormatter +[EncoderFunc]: https://pkg.go.dev/github.com/go-chi/chi/middleware#EncoderFunc +[HeaderRoute]: https://pkg.go.dev/github.com/go-chi/chi/middleware#HeaderRoute +[HeaderRouter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#HeaderRouter +[LogEntry]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LogEntry +[LogFormatter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LogFormatter +[LoggerInterface]: https://pkg.go.dev/github.com/go-chi/chi/middleware#LoggerInterface +[ThrottleOpts]: https://pkg.go.dev/github.com/go-chi/chi/middleware#ThrottleOpts +[WrapResponseWriter]: https://pkg.go.dev/github.com/go-chi/chi/middleware#WrapResponseWriter + +### Extra middlewares & packages + +Please see https://github.com/go-chi for additional packages. + +-------------------------------------------------------------------------------------------------------------------- +| package | description | +|:---------------------------------------------------|:------------------------------------------------------------- +| [cors](https://github.com/go-chi/cors) | Cross-origin resource sharing (CORS) | +| [docgen](https://github.com/go-chi/docgen) | Print chi.Router routes at runtime | +| [jwtauth](https://github.com/go-chi/jwtauth) | JWT authentication | +| [hostrouter](https://github.com/go-chi/hostrouter) | Domain/host based request routing | +| [httplog](https://github.com/go-chi/httplog) | Small but powerful structured HTTP request logging | +| [httprate](https://github.com/go-chi/httprate) | HTTP request rate limiter | +| [httptracer](https://github.com/go-chi/httptracer) | HTTP request performance tracing library | +| [httpvcr](https://github.com/go-chi/httpvcr) | Write deterministic tests for external sources | +| [stampede](https://github.com/go-chi/stampede) | HTTP request coalescer | +-------------------------------------------------------------------------------------------------------------------- + + +## context? + +`context` is a tiny pkg that provides simple interface to signal context across call stacks +and goroutines. It was originally written by [Sameer Ajmani](https://github.com/Sajmani) +and is available in stdlib since go1.7. + +Learn more at https://blog.golang.org/context + +and.. +* Docs: https://golang.org/pkg/context +* Source: https://github.com/golang/go/tree/master/src/context + + +## Benchmarks + +The benchmark suite: https://github.com/pkieltyka/go-http-routing-benchmark + +Results as of Nov 29, 2020 with Go 1.15.5 on Linux AMD 3950x + +```shell +BenchmarkChi_Param 3075895 384 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Param5 2116603 566 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Param20 964117 1227 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParamWrite 2863413 420 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubStatic 3045488 395 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubParam 2204115 540 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GithubAll 10000 113811 ns/op 81203 B/op 406 allocs/op +BenchmarkChi_GPlusStatic 3337485 359 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlusParam 2825853 423 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlus2Params 2471697 483 ns/op 400 B/op 2 allocs/op +BenchmarkChi_GPlusAll 194220 5950 ns/op 5200 B/op 26 allocs/op +BenchmarkChi_ParseStatic 3365324 356 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParseParam 2976614 404 ns/op 400 B/op 2 allocs/op +BenchmarkChi_Parse2Params 2638084 439 ns/op 400 B/op 2 allocs/op +BenchmarkChi_ParseAll 109567 11295 ns/op 10400 B/op 52 allocs/op +BenchmarkChi_StaticAll 16846 71308 ns/op 62802 B/op 314 allocs/op +``` + +Comparison with other routers: https://gist.github.com/pkieltyka/123032f12052520aaccab752bd3e78cc + +NOTE: the allocs in the benchmark above are from the calls to http.Request's +`WithContext(context.Context)` method that clones the http.Request, sets the `Context()` +on the duplicated (alloc'd) request and returns it the new request object. This is just +how setting context on a request in Go works. + + +## Credits + +* Carl Jackson for https://github.com/zenazn/goji + * Parts of chi's thinking comes from goji, and chi's middleware package + sources from goji. +* Armon Dadgar for https://github.com/armon/go-radix +* Contributions: [@VojtechVitek](https://github.com/VojtechVitek) + +We'll be more than happy to see [your contributions](./CONTRIBUTING.md)! + + +## Beyond REST + +chi is just a http router that lets you decompose request handling into many smaller layers. +Many companies use chi to write REST services for their public APIs. But, REST is just a convention +for managing state via HTTP, and there's a lot of other pieces required to write a complete client-server +system or network of microservices. + +Looking beyond REST, I also recommend some newer works in the field: +* [webrpc](https://github.com/webrpc/webrpc) - Web-focused RPC client+server framework with code-gen +* [gRPC](https://github.com/grpc/grpc-go) - Google's RPC framework via protobufs +* [graphql](https://github.com/99designs/gqlgen) - Declarative query language +* [NATS](https://nats.io) - lightweight pub-sub + + +## License + +Copyright (c) 2015-present [Peter Kieltyka](https://github.com/pkieltyka) + +Licensed under [MIT License](./LICENSE) + +[GoDoc]: https://pkg.go.dev/github.com/go-chi/chi/v5 +[GoDoc Widget]: https://godoc.org/github.com/go-chi/chi?status.svg +[Travis]: https://travis-ci.org/go-chi/chi +[Travis Widget]: https://travis-ci.org/go-chi/chi.svg?branch=master diff --git a/vendor/github.com/go-chi/chi/v5/SECURITY.md b/vendor/github.com/go-chi/chi/v5/SECURITY.md new file mode 100644 index 0000000..7e937f8 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/SECURITY.md @@ -0,0 +1,5 @@ +# Reporting Security Issues + +We appreciate your efforts to responsibly disclose your findings, and will make every effort to acknowledge your contributions. + +To report a security issue, please use the GitHub Security Advisory ["Report a Vulnerability"](https://github.com/go-chi/chi/security/advisories/new) tab. diff --git a/vendor/github.com/go-chi/chi/v5/chain.go b/vendor/github.com/go-chi/chi/v5/chain.go new file mode 100644 index 0000000..a227841 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/chain.go @@ -0,0 +1,49 @@ +package chi + +import "net/http" + +// Chain returns a Middlewares type from a slice of middleware handlers. +func Chain(middlewares ...func(http.Handler) http.Handler) Middlewares { + return Middlewares(middlewares) +} + +// Handler builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) Handler(h http.Handler) http.Handler { + return &ChainHandler{h, chain(mws, h), mws} +} + +// HandlerFunc builds and returns a http.Handler from the chain of middlewares, +// with `h http.Handler` as the final handler. +func (mws Middlewares) HandlerFunc(h http.HandlerFunc) http.Handler { + return &ChainHandler{h, chain(mws, h), mws} +} + +// ChainHandler is a http.Handler with support for handler composition and +// execution. +type ChainHandler struct { + Endpoint http.Handler + chain http.Handler + Middlewares Middlewares +} + +func (c *ChainHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + c.chain.ServeHTTP(w, r) +} + +// chain builds a http.Handler composed of an inline middleware stack and endpoint +// handler in the order they are passed. +func chain(middlewares []func(http.Handler) http.Handler, endpoint http.Handler) http.Handler { + // Return ahead of time if there aren't any middlewares for the chain + if len(middlewares) == 0 { + return endpoint + } + + // Wrap the end handler with the middleware chain + h := middlewares[len(middlewares)-1](endpoint) + for i := len(middlewares) - 2; i >= 0; i-- { + h = middlewares[i](h) + } + + return h +} diff --git a/vendor/github.com/go-chi/chi/v5/chi.go b/vendor/github.com/go-chi/chi/v5/chi.go new file mode 100644 index 0000000..a1691bb --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/chi.go @@ -0,0 +1,134 @@ +// Package chi is a small, idiomatic and composable router for building HTTP services. +// +// chi requires Go 1.14 or newer. +// +// Example: +// +// package main +// +// import ( +// "net/http" +// +// "github.com/go-chi/chi/v5" +// "github.com/go-chi/chi/v5/middleware" +// ) +// +// func main() { +// r := chi.NewRouter() +// r.Use(middleware.Logger) +// r.Use(middleware.Recoverer) +// +// r.Get("/", func(w http.ResponseWriter, r *http.Request) { +// w.Write([]byte("root.")) +// }) +// +// http.ListenAndServe(":3333", r) +// } +// +// See github.com/go-chi/chi/_examples/ for more in-depth examples. +// +// URL patterns allow for easy matching of path components in HTTP +// requests. The matching components can then be accessed using +// chi.URLParam(). All patterns must begin with a slash. +// +// A simple named placeholder {name} matches any sequence of characters +// up to the next / or the end of the URL. Trailing slashes on paths must +// be handled explicitly. +// +// A placeholder with a name followed by a colon allows a regular +// expression match, for example {number:\\d+}. The regular expression +// syntax is Go's normal regexp RE2 syntax, except that regular expressions +// including { or } are not supported, and / will never be +// matched. An anonymous regexp pattern is allowed, using an empty string +// before the colon in the placeholder, such as {:\\d+} +// +// The special placeholder of asterisk matches the rest of the requested +// URL. Any trailing characters in the pattern are ignored. This is the only +// placeholder which will match / characters. +// +// Examples: +// +// "/user/{name}" matches "/user/jsmith" but not "/user/jsmith/info" or "/user/jsmith/" +// "/user/{name}/info" matches "/user/jsmith/info" +// "/page/*" matches "/page/intro/latest" +// "/page/{other}/index" also matches "/page/intro/latest" +// "/date/{yyyy:\\d\\d\\d\\d}/{mm:\\d\\d}/{dd:\\d\\d}" matches "/date/2017/04/01" +package chi + +import "net/http" + +// NewRouter returns a new Mux object that implements the Router interface. +func NewRouter() *Mux { + return NewMux() +} + +// Router consisting of the core routing methods used by chi's Mux, +// using only the standard net/http. +type Router interface { + http.Handler + Routes + + // Use appends one or more middlewares onto the Router stack. + Use(middlewares ...func(http.Handler) http.Handler) + + // With adds inline middlewares for an endpoint handler. + With(middlewares ...func(http.Handler) http.Handler) Router + + // Group adds a new inline-Router along the current routing + // path, with a fresh middleware stack for the inline-Router. + Group(fn func(r Router)) Router + + // Route mounts a sub-Router along a `pattern`` string. + Route(pattern string, fn func(r Router)) Router + + // Mount attaches another http.Handler along ./pattern/* + Mount(pattern string, h http.Handler) + + // Handle and HandleFunc adds routes for `pattern` that matches + // all HTTP methods. + Handle(pattern string, h http.Handler) + HandleFunc(pattern string, h http.HandlerFunc) + + // Method and MethodFunc adds routes for `pattern` that matches + // the `method` HTTP method. + Method(method, pattern string, h http.Handler) + MethodFunc(method, pattern string, h http.HandlerFunc) + + // HTTP-method routing along `pattern` + Connect(pattern string, h http.HandlerFunc) + Delete(pattern string, h http.HandlerFunc) + Get(pattern string, h http.HandlerFunc) + Head(pattern string, h http.HandlerFunc) + Options(pattern string, h http.HandlerFunc) + Patch(pattern string, h http.HandlerFunc) + Post(pattern string, h http.HandlerFunc) + Put(pattern string, h http.HandlerFunc) + Trace(pattern string, h http.HandlerFunc) + + // NotFound defines a handler to respond whenever a route could + // not be found. + NotFound(h http.HandlerFunc) + + // MethodNotAllowed defines a handler to respond whenever a method is + // not allowed. + MethodNotAllowed(h http.HandlerFunc) +} + +// Routes interface adds two methods for router traversal, which is also +// used by the `docgen` subpackage to generation documentation for Routers. +type Routes interface { + // Routes returns the routing tree in an easily traversable structure. + Routes() []Route + + // Middlewares returns the list of middlewares in use by the router. + Middlewares() Middlewares + + // Match searches the routing tree for a handler that matches + // the method/path - similar to routing a http request, but without + // executing the handler thereafter. + Match(rctx *Context, method, path string) bool +} + +// Middlewares type is a slice of standard middleware handlers with methods +// to compose middleware chains and http.Handler's. +type Middlewares []func(http.Handler) http.Handler diff --git a/vendor/github.com/go-chi/chi/v5/context.go b/vendor/github.com/go-chi/chi/v5/context.go new file mode 100644 index 0000000..82e5f28 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/context.go @@ -0,0 +1,163 @@ +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 + + // methodNotAllowed hint + methodNotAllowed bool + methodsAllowed []methodTyp // allowed methods in case of a 405 +} + +// 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 its 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 { + 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 recursively replaces all +// occurrences of "/*/" to "/". +func replaceWildcards(p string) string { + if strings.Contains(p, "/*/") { + return replaceWildcards(strings.Replace(p, "/*/", "/", -1)) + } + 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 +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go b/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go new file mode 100644 index 0000000..a546c9e --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/basic_auth.go @@ -0,0 +1,33 @@ +package middleware + +import ( + "crypto/subtle" + "fmt" + "net/http" +) + +// BasicAuth implements a simple middleware handler for adding basic http auth to a route. +func BasicAuth(realm string, creds map[string]string) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + user, pass, ok := r.BasicAuth() + if !ok { + basicAuthFailed(w, realm) + return + } + + credPass, credUserOk := creds[user] + if !credUserOk || subtle.ConstantTimeCompare([]byte(pass), []byte(credPass)) != 1 { + basicAuthFailed(w, realm) + return + } + + next.ServeHTTP(w, r) + }) + } +} + +func basicAuthFailed(w http.ResponseWriter, realm string) { + w.Header().Add("WWW-Authenticate", fmt.Sprintf(`Basic realm="%s"`, realm)) + w.WriteHeader(http.StatusUnauthorized) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go b/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go new file mode 100644 index 0000000..adeba42 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/clean_path.go @@ -0,0 +1,28 @@ +package middleware + +import ( + "net/http" + "path" + + "github.com/go-chi/chi/v5" +) + +// CleanPath middleware will clean out double slash mistakes from a user's request path. +// For example, if a user requests /users//1 or //users////1 will both be treated as: /users/1 +func CleanPath(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := chi.RouteContext(r.Context()) + + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + rctx.RoutePath = path.Clean(routePath) + } + + next.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/compress.go b/vendor/github.com/go-chi/chi/v5/middleware/compress.go new file mode 100644 index 0000000..28240c4 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/compress.go @@ -0,0 +1,398 @@ +package middleware + +import ( + "bufio" + "compress/flate" + "compress/gzip" + "errors" + "fmt" + "io" + "io/ioutil" + "net" + "net/http" + "strings" + "sync" +) + +var defaultCompressibleContentTypes = []string{ + "text/html", + "text/css", + "text/plain", + "text/javascript", + "application/javascript", + "application/x-javascript", + "application/json", + "application/atom+xml", + "application/rss+xml", + "image/svg+xml", +} + +// Compress is a middleware that compresses response +// body of a given content types to a data format based +// on Accept-Encoding request header. It uses a given +// compression level. +// +// NOTE: make sure to set the Content-Type header on your response +// otherwise this middleware will not compress the response body. For ex, in +// your handler you should set w.Header().Set("Content-Type", http.DetectContentType(yourBody)) +// or set it manually. +// +// Passing a compression level of 5 is sensible value +func Compress(level int, types ...string) func(next http.Handler) http.Handler { + compressor := NewCompressor(level, types...) + return compressor.Handler +} + +// Compressor represents a set of encoding configurations. +type Compressor struct { + // The mapping of encoder names to encoder functions. + encoders map[string]EncoderFunc + // The mapping of pooled encoders to pools. + pooledEncoders map[string]*sync.Pool + // The set of content types allowed to be compressed. + allowedTypes map[string]struct{} + allowedWildcards map[string]struct{} + // The list of encoders in order of decreasing precedence. + encodingPrecedence []string + level int // The compression level. +} + +// NewCompressor creates a new Compressor that will handle encoding responses. +// +// The level should be one of the ones defined in the flate package. +// The types are the content types that are allowed to be compressed. +func NewCompressor(level int, types ...string) *Compressor { + // If types are provided, set those as the allowed types. If none are + // provided, use the default list. + allowedTypes := make(map[string]struct{}) + allowedWildcards := make(map[string]struct{}) + if len(types) > 0 { + for _, t := range types { + if strings.Contains(strings.TrimSuffix(t, "/*"), "*") { + panic(fmt.Sprintf("middleware/compress: Unsupported content-type wildcard pattern '%s'. Only '/*' supported", t)) + } + if strings.HasSuffix(t, "/*") { + allowedWildcards[strings.TrimSuffix(t, "/*")] = struct{}{} + } else { + allowedTypes[t] = struct{}{} + } + } + } else { + for _, t := range defaultCompressibleContentTypes { + allowedTypes[t] = struct{}{} + } + } + + c := &Compressor{ + level: level, + encoders: make(map[string]EncoderFunc), + pooledEncoders: make(map[string]*sync.Pool), + allowedTypes: allowedTypes, + allowedWildcards: allowedWildcards, + } + + // Set the default encoders. The precedence order uses the reverse + // ordering that the encoders were added. This means adding new encoders + // will move them to the front of the order. + // + // TODO: + // lzma: Opera. + // sdch: Chrome, Android. Gzip output + dictionary header. + // br: Brotli, see https://github.com/go-chi/chi/pull/326 + + // HTTP 1.1 "deflate" (RFC 2616) stands for DEFLATE data (RFC 1951) + // wrapped with zlib (RFC 1950). The zlib wrapper uses Adler-32 + // checksum compared to CRC-32 used in "gzip" and thus is faster. + // + // But.. some old browsers (MSIE, Safari 5.1) incorrectly expect + // raw DEFLATE data only, without the mentioned zlib wrapper. + // Because of this major confusion, most modern browsers try it + // both ways, first looking for zlib headers. + // Quote by Mark Adler: http://stackoverflow.com/a/9186091/385548 + // + // The list of browsers having problems is quite big, see: + // http://zoompf.com/blog/2012/02/lose-the-wait-http-compression + // https://web.archive.org/web/20120321182910/http://www.vervestudios.co/projects/compression-tests/results + // + // That's why we prefer gzip over deflate. It's just more reliable + // and not significantly slower than deflate. + c.SetEncoder("deflate", encoderDeflate) + + // TODO: Exception for old MSIE browsers that can't handle non-HTML? + // https://zoompf.com/blog/2012/02/lose-the-wait-http-compression + c.SetEncoder("gzip", encoderGzip) + + // NOTE: Not implemented, intentionally: + // case "compress": // LZW. Deprecated. + // case "bzip2": // Too slow on-the-fly. + // case "zopfli": // Too slow on-the-fly. + // case "xz": // Too slow on-the-fly. + return c +} + +// SetEncoder can be used to set the implementation of a compression algorithm. +// +// The encoding should be a standardised identifier. See: +// https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding +// +// For example, add the Brotli algorithm: +// +// import brotli_enc "gopkg.in/kothar/brotli-go.v0/enc" +// +// compressor := middleware.NewCompressor(5, "text/html") +// compressor.SetEncoder("br", func(w io.Writer, level int) io.Writer { +// params := brotli_enc.NewBrotliParams() +// params.SetQuality(level) +// return brotli_enc.NewBrotliWriter(params, w) +// }) +func (c *Compressor) SetEncoder(encoding string, fn EncoderFunc) { + encoding = strings.ToLower(encoding) + if encoding == "" { + panic("the encoding can not be empty") + } + if fn == nil { + panic("attempted to set a nil encoder function") + } + + // If we are adding a new encoder that is already registered, we have to + // clear that one out first. + delete(c.pooledEncoders, encoding) + delete(c.encoders, encoding) + + // If the encoder supports Resetting (IoReseterWriter), then it can be pooled. + encoder := fn(ioutil.Discard, c.level) + if encoder != nil { + if _, ok := encoder.(ioResetterWriter); ok { + pool := &sync.Pool{ + New: func() interface{} { + return fn(ioutil.Discard, c.level) + }, + } + c.pooledEncoders[encoding] = pool + } + } + // If the encoder is not in the pooledEncoders, add it to the normal encoders. + if _, ok := c.pooledEncoders[encoding]; !ok { + c.encoders[encoding] = fn + } + + for i, v := range c.encodingPrecedence { + if v == encoding { + c.encodingPrecedence = append(c.encodingPrecedence[:i], c.encodingPrecedence[i+1:]...) + } + } + + c.encodingPrecedence = append([]string{encoding}, c.encodingPrecedence...) +} + +// Handler returns a new middleware that will compress the response based on the +// current Compressor. +func (c *Compressor) Handler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + encoder, encoding, cleanup := c.selectEncoder(r.Header, w) + + cw := &compressResponseWriter{ + ResponseWriter: w, + w: w, + contentTypes: c.allowedTypes, + contentWildcards: c.allowedWildcards, + encoding: encoding, + compressible: false, // determined in post-handler + } + if encoder != nil { + cw.w = encoder + } + // Re-add the encoder to the pool if applicable. + defer cleanup() + defer cw.Close() + + next.ServeHTTP(cw, r) + }) +} + +// selectEncoder returns the encoder, the name of the encoder, and a closer function. +func (c *Compressor) selectEncoder(h http.Header, w io.Writer) (io.Writer, string, func()) { + header := h.Get("Accept-Encoding") + + // Parse the names of all accepted algorithms from the header. + accepted := strings.Split(strings.ToLower(header), ",") + + // Find supported encoder by accepted list by precedence + for _, name := range c.encodingPrecedence { + if matchAcceptEncoding(accepted, name) { + if pool, ok := c.pooledEncoders[name]; ok { + encoder := pool.Get().(ioResetterWriter) + cleanup := func() { + pool.Put(encoder) + } + encoder.Reset(w) + return encoder, name, cleanup + + } + if fn, ok := c.encoders[name]; ok { + return fn(w, c.level), name, func() {} + } + } + + } + + // No encoder found to match the accepted encoding + return nil, "", func() {} +} + +func matchAcceptEncoding(accepted []string, encoding string) bool { + for _, v := range accepted { + if strings.Contains(v, encoding) { + return true + } + } + return false +} + +// An EncoderFunc is a function that wraps the provided io.Writer with a +// streaming compression algorithm and returns it. +// +// In case of failure, the function should return nil. +type EncoderFunc func(w io.Writer, level int) io.Writer + +// Interface for types that allow resetting io.Writers. +type ioResetterWriter interface { + io.Writer + Reset(w io.Writer) +} + +type compressResponseWriter struct { + http.ResponseWriter + + // The streaming encoder writer to be used if there is one. Otherwise, + // this is just the normal writer. + w io.Writer + contentTypes map[string]struct{} + contentWildcards map[string]struct{} + encoding string + wroteHeader bool + compressible bool +} + +func (cw *compressResponseWriter) isCompressible() bool { + // Parse the first part of the Content-Type response header. + contentType := cw.Header().Get("Content-Type") + if idx := strings.Index(contentType, ";"); idx >= 0 { + contentType = contentType[0:idx] + } + + // Is the content type compressible? + if _, ok := cw.contentTypes[contentType]; ok { + return true + } + if idx := strings.Index(contentType, "/"); idx > 0 { + contentType = contentType[0:idx] + _, ok := cw.contentWildcards[contentType] + return ok + } + return false +} + +func (cw *compressResponseWriter) WriteHeader(code int) { + if cw.wroteHeader { + cw.ResponseWriter.WriteHeader(code) // Allow multiple calls to propagate. + return + } + cw.wroteHeader = true + defer cw.ResponseWriter.WriteHeader(code) + + // Already compressed data? + if cw.Header().Get("Content-Encoding") != "" { + return + } + + if !cw.isCompressible() { + cw.compressible = false + return + } + + if cw.encoding != "" { + cw.compressible = true + cw.Header().Set("Content-Encoding", cw.encoding) + cw.Header().Add("Vary", "Accept-Encoding") + + // The content-length after compression is unknown + cw.Header().Del("Content-Length") + } +} + +func (cw *compressResponseWriter) Write(p []byte) (int, error) { + if !cw.wroteHeader { + cw.WriteHeader(http.StatusOK) + } + + return cw.writer().Write(p) +} + +func (cw *compressResponseWriter) writer() io.Writer { + if cw.compressible { + return cw.w + } + return cw.ResponseWriter +} + +type compressFlusher interface { + Flush() error +} + +func (cw *compressResponseWriter) Flush() { + if f, ok := cw.writer().(http.Flusher); ok { + f.Flush() + } + // If the underlying writer has a compression flush signature, + // call this Flush() method instead + if f, ok := cw.writer().(compressFlusher); ok { + f.Flush() + + // Also flush the underlying response writer + if f, ok := cw.ResponseWriter.(http.Flusher); ok { + f.Flush() + } + } +} + +func (cw *compressResponseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + if hj, ok := cw.writer().(http.Hijacker); ok { + return hj.Hijack() + } + return nil, nil, errors.New("chi/middleware: http.Hijacker is unavailable on the writer") +} + +func (cw *compressResponseWriter) Push(target string, opts *http.PushOptions) error { + if ps, ok := cw.writer().(http.Pusher); ok { + return ps.Push(target, opts) + } + return errors.New("chi/middleware: http.Pusher is unavailable on the writer") +} + +func (cw *compressResponseWriter) Close() error { + if c, ok := cw.writer().(io.WriteCloser); ok { + return c.Close() + } + return errors.New("chi/middleware: io.WriteCloser is unavailable on the writer") +} + +func (cw *compressResponseWriter) Unwrap() http.ResponseWriter { + return cw.ResponseWriter +} + +func encoderGzip(w io.Writer, level int) io.Writer { + gw, err := gzip.NewWriterLevel(w, level) + if err != nil { + return nil + } + return gw +} + +func encoderDeflate(w io.Writer, level int) io.Writer { + dw, err := flate.NewWriter(w, level) + if err != nil { + return nil + } + return dw +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go b/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go new file mode 100644 index 0000000..07b5ce6 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_charset.go @@ -0,0 +1,51 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// ContentCharset generates a handler that writes a 415 Unsupported Media Type response if none of the charsets match. +// An empty charset will allow requests with no Content-Type header or no specified charset. +func ContentCharset(charsets ...string) func(next http.Handler) http.Handler { + for i, c := range charsets { + charsets[i] = strings.ToLower(c) + } + + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !contentEncoding(r.Header.Get("Content-Type"), charsets...) { + w.WriteHeader(http.StatusUnsupportedMediaType) + return + } + + next.ServeHTTP(w, r) + }) + } +} + +// Check the content encoding against a list of acceptable values. +func contentEncoding(ce string, charsets ...string) bool { + _, ce = split(strings.ToLower(ce), ";") + _, ce = split(ce, "charset=") + ce, _ = split(ce, ";") + for _, c := range charsets { + if ce == c { + return true + } + } + + return false +} + +// Split a string in two parts, cleaning any whitespace. +func split(str, sep string) (string, string) { + var a, b string + var parts = strings.SplitN(str, sep, 2) + a = strings.TrimSpace(parts[0]) + if len(parts) == 2 { + b = strings.TrimSpace(parts[1]) + } + + return a, b +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go b/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go new file mode 100644 index 0000000..e0b9ccc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_encoding.go @@ -0,0 +1,34 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// AllowContentEncoding enforces a whitelist of request Content-Encoding otherwise responds +// with a 415 Unsupported Media Type status. +func AllowContentEncoding(contentEncoding ...string) func(next http.Handler) http.Handler { + allowedEncodings := make(map[string]struct{}, len(contentEncoding)) + for _, encoding := range contentEncoding { + allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))] = struct{}{} + } + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + requestEncodings := r.Header["Content-Encoding"] + // skip check for empty content body or no Content-Encoding + if r.ContentLength == 0 { + next.ServeHTTP(w, r) + return + } + // All encodings in the request must be allowed + for _, encoding := range requestEncodings { + if _, ok := allowedEncodings[strings.TrimSpace(strings.ToLower(encoding))]; !ok { + w.WriteHeader(http.StatusUnsupportedMediaType) + return + } + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/content_type.go b/vendor/github.com/go-chi/chi/v5/middleware/content_type.go new file mode 100644 index 0000000..023978f --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/content_type.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// SetHeader is a convenience handler to set a response header key/value +func SetHeader(key, value string) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + w.Header().Set(key, value) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} + +// AllowContentType enforces a whitelist of request Content-Types otherwise responds +// with a 415 Unsupported Media Type status. +func AllowContentType(contentTypes ...string) func(next http.Handler) http.Handler { + allowedContentTypes := make(map[string]struct{}, len(contentTypes)) + for _, ctype := range contentTypes { + allowedContentTypes[strings.TrimSpace(strings.ToLower(ctype))] = struct{}{} + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if r.ContentLength == 0 { + // skip check for empty content body + next.ServeHTTP(w, r) + return + } + + s := strings.ToLower(strings.TrimSpace(r.Header.Get("Content-Type"))) + if i := strings.Index(s, ";"); i > -1 { + s = s[0:i] + } + + if _, ok := allowedContentTypes[s]; ok { + next.ServeHTTP(w, r) + return + } + + w.WriteHeader(http.StatusUnsupportedMediaType) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/get_head.go b/vendor/github.com/go-chi/chi/v5/middleware/get_head.go new file mode 100644 index 0000000..d4606d8 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/get_head.go @@ -0,0 +1,39 @@ +package middleware + +import ( + "net/http" + + "github.com/go-chi/chi/v5" +) + +// GetHead automatically route undefined HEAD requests to GET handlers. +func GetHead(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "HEAD" { + rctx := chi.RouteContext(r.Context()) + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + } + + // Temporary routing context to look-ahead before routing the request + tctx := chi.NewRouteContext() + + // Attempt to find a HEAD handler for the routing path, if not found, traverse + // the router as through its a GET route, but proceed with the request + // with the HEAD method. + if !rctx.Routes.Match(tctx, "HEAD", routePath) { + rctx.RouteMethod = "GET" + rctx.RoutePath = routePath + next.ServeHTTP(w, r) + return + } + } + + next.ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go b/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go new file mode 100644 index 0000000..f36e8cc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/heartbeat.go @@ -0,0 +1,26 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// Heartbeat endpoint middleware useful to setting up a path like +// `/ping` that load balancers or uptime testing external services +// can make a request before hitting any routes. It's also convenient +// to place this above ACL middlewares as well. +func Heartbeat(endpoint string) func(http.Handler) http.Handler { + f := func(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if (r.Method == "GET" || r.Method == "HEAD") && strings.EqualFold(r.URL.Path, endpoint) { + w.Header().Set("Content-Type", "text/plain") + w.WriteHeader(http.StatusOK) + w.Write([]byte(".")) + return + } + h.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } + return f +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/logger.go b/vendor/github.com/go-chi/chi/v5/middleware/logger.go new file mode 100644 index 0000000..cff9bd2 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/logger.go @@ -0,0 +1,172 @@ +package middleware + +import ( + "bytes" + "context" + "log" + "net/http" + "os" + "runtime" + "time" +) + +var ( + // LogEntryCtxKey is the context.Context key to store the request log entry. + LogEntryCtxKey = &contextKey{"LogEntry"} + + // DefaultLogger is called by the Logger middleware handler to log each request. + // Its made a package-level variable so that it can be reconfigured for custom + // logging configurations. + DefaultLogger func(next http.Handler) http.Handler +) + +// Logger is a middleware that logs the start and end of each request, along +// with some useful data about what was requested, what the response status was, +// and how long it took to return. When standard output is a TTY, Logger will +// print in color, otherwise it will print in black and white. Logger prints a +// request ID if one is provided. +// +// Alternatively, look at https://github.com/goware/httplog for a more in-depth +// http logger with structured logging support. +// +// IMPORTANT NOTE: Logger should go before any other middleware that may change +// the response, such as middleware.Recoverer. Example: +// +// r := chi.NewRouter() +// r.Use(middleware.Logger) // <--<< Logger should come before Recoverer +// r.Use(middleware.Recoverer) +// r.Get("/", handler) +func Logger(next http.Handler) http.Handler { + return DefaultLogger(next) +} + +// RequestLogger returns a logger handler using a custom LogFormatter. +func RequestLogger(f LogFormatter) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + entry := f.NewLogEntry(r) + ww := NewWrapResponseWriter(w, r.ProtoMajor) + + t1 := time.Now() + defer func() { + entry.Write(ww.Status(), ww.BytesWritten(), ww.Header(), time.Since(t1), nil) + }() + + next.ServeHTTP(ww, WithLogEntry(r, entry)) + } + return http.HandlerFunc(fn) + } +} + +// LogFormatter initiates the beginning of a new LogEntry per request. +// See DefaultLogFormatter for an example implementation. +type LogFormatter interface { + NewLogEntry(r *http.Request) LogEntry +} + +// LogEntry records the final log when a request completes. +// See defaultLogEntry for an example implementation. +type LogEntry interface { + Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) + Panic(v interface{}, stack []byte) +} + +// GetLogEntry returns the in-context LogEntry for a request. +func GetLogEntry(r *http.Request) LogEntry { + entry, _ := r.Context().Value(LogEntryCtxKey).(LogEntry) + return entry +} + +// WithLogEntry sets the in-context LogEntry for a request. +func WithLogEntry(r *http.Request, entry LogEntry) *http.Request { + r = r.WithContext(context.WithValue(r.Context(), LogEntryCtxKey, entry)) + return r +} + +// LoggerInterface accepts printing to stdlib logger or compatible logger. +type LoggerInterface interface { + Print(v ...interface{}) +} + +// DefaultLogFormatter is a simple logger that implements a LogFormatter. +type DefaultLogFormatter struct { + Logger LoggerInterface + NoColor bool +} + +// NewLogEntry creates a new LogEntry for the request. +func (l *DefaultLogFormatter) NewLogEntry(r *http.Request) LogEntry { + useColor := !l.NoColor + entry := &defaultLogEntry{ + DefaultLogFormatter: l, + request: r, + buf: &bytes.Buffer{}, + useColor: useColor, + } + + reqID := GetReqID(r.Context()) + if reqID != "" { + cW(entry.buf, useColor, nYellow, "[%s] ", reqID) + } + cW(entry.buf, useColor, nCyan, "\"") + cW(entry.buf, useColor, bMagenta, "%s ", r.Method) + + scheme := "http" + if r.TLS != nil { + scheme = "https" + } + cW(entry.buf, useColor, nCyan, "%s://%s%s %s\" ", scheme, r.Host, r.RequestURI, r.Proto) + + entry.buf.WriteString("from ") + entry.buf.WriteString(r.RemoteAddr) + entry.buf.WriteString(" - ") + + return entry +} + +type defaultLogEntry struct { + *DefaultLogFormatter + request *http.Request + buf *bytes.Buffer + useColor bool +} + +func (l *defaultLogEntry) Write(status, bytes int, header http.Header, elapsed time.Duration, extra interface{}) { + switch { + case status < 200: + cW(l.buf, l.useColor, bBlue, "%03d", status) + case status < 300: + cW(l.buf, l.useColor, bGreen, "%03d", status) + case status < 400: + cW(l.buf, l.useColor, bCyan, "%03d", status) + case status < 500: + cW(l.buf, l.useColor, bYellow, "%03d", status) + default: + cW(l.buf, l.useColor, bRed, "%03d", status) + } + + cW(l.buf, l.useColor, bBlue, " %dB", bytes) + + l.buf.WriteString(" in ") + if elapsed < 500*time.Millisecond { + cW(l.buf, l.useColor, nGreen, "%s", elapsed) + } else if elapsed < 5*time.Second { + cW(l.buf, l.useColor, nYellow, "%s", elapsed) + } else { + cW(l.buf, l.useColor, nRed, "%s", elapsed) + } + + l.Logger.Print(l.buf.String()) +} + +func (l *defaultLogEntry) Panic(v interface{}, stack []byte) { + PrintPrettyStack(v) +} + +func init() { + color := true + if runtime.GOOS == "windows" { + color = false + } + DefaultLogger = RequestLogger(&DefaultLogFormatter{Logger: log.New(os.Stdout, "", log.LstdFlags), NoColor: !color}) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/maybe.go b/vendor/github.com/go-chi/chi/v5/middleware/maybe.go new file mode 100644 index 0000000..d8ca63b --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/maybe.go @@ -0,0 +1,18 @@ +package middleware + +import "net/http" + +// Maybe middleware will allow you to change the flow of the middleware stack execution depending on return +// value of maybeFn(request). This is useful for example if you'd like to skip a middleware handler if +// a request does not satisfied the maybeFn logic. +func Maybe(mw func(http.Handler) http.Handler, maybeFn func(r *http.Request) bool) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if maybeFn(r) { + mw(next).ServeHTTP(w, r) + } else { + next.ServeHTTP(w, r) + } + }) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/middleware.go b/vendor/github.com/go-chi/chi/v5/middleware/middleware.go new file mode 100644 index 0000000..cc371e0 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/middleware.go @@ -0,0 +1,23 @@ +package middleware + +import "net/http" + +// New will create a new middleware handler from a http.Handler. +func New(h http.Handler) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + h.ServeHTTP(w, r) + }) + } +} + +// 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/middleware context value " + k.name +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/nocache.go b/vendor/github.com/go-chi/chi/v5/middleware/nocache.go new file mode 100644 index 0000000..9308d40 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/nocache.go @@ -0,0 +1,59 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net/http" + "time" +) + +// Unix epoch time +var epoch = time.Unix(0, 0).UTC().Format(http.TimeFormat) + +// Taken from https://github.com/mytrile/nocache +var noCacheHeaders = map[string]string{ + "Expires": epoch, + "Cache-Control": "no-cache, no-store, no-transform, must-revalidate, private, max-age=0", + "Pragma": "no-cache", + "X-Accel-Expires": "0", +} + +var etagHeaders = []string{ + "ETag", + "If-Modified-Since", + "If-Match", + "If-None-Match", + "If-Range", + "If-Unmodified-Since", +} + +// NoCache is a simple piece of middleware that sets a number of HTTP headers to prevent +// a router (or subrouter) from being cached by an upstream proxy and/or client. +// +// As per http://wiki.nginx.org/HttpProxyModule - NoCache sets: +// +// Expires: Thu, 01 Jan 1970 00:00:00 UTC +// Cache-Control: no-cache, private, max-age=0 +// X-Accel-Expires: 0 +// Pragma: no-cache (for HTTP/1.0 proxies/clients) +func NoCache(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + + // Delete any ETag headers that may have been set + for _, v := range etagHeaders { + if r.Header.Get(v) != "" { + r.Header.Del(v) + } + } + + // Set our NoCache headers + for k, v := range noCacheHeaders { + w.Header().Set(k, v) + } + + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/page_route.go b/vendor/github.com/go-chi/chi/v5/middleware/page_route.go new file mode 100644 index 0000000..32871b7 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/page_route.go @@ -0,0 +1,20 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// PageRoute is a simple middleware which allows you to route a static GET request +// at the middleware stack level. +func PageRoute(path string, handler http.Handler) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method == "GET" && strings.EqualFold(r.URL.Path, path) { + handler.ServeHTTP(w, r) + return + } + next.ServeHTTP(w, r) + }) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/path_rewrite.go b/vendor/github.com/go-chi/chi/v5/middleware/path_rewrite.go new file mode 100644 index 0000000..99af62c --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/path_rewrite.go @@ -0,0 +1,16 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// PathRewrite is a simple middleware which allows you to rewrite the request URL path. +func PathRewrite(old, new string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + r.URL.Path = strings.Replace(r.URL.Path, old, new, 1) + next.ServeHTTP(w, r) + }) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/profiler.go b/vendor/github.com/go-chi/chi/v5/middleware/profiler.go new file mode 100644 index 0000000..ebd81ee --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/profiler.go @@ -0,0 +1,46 @@ +package middleware + +import ( + "expvar" + "net/http" + "net/http/pprof" + + "github.com/go-chi/chi/v5" +) + +// Profiler is a convenient subrouter used for mounting net/http/pprof. ie. +// +// func MyService() http.Handler { +// r := chi.NewRouter() +// // ..middlewares +// r.Mount("/debug", middleware.Profiler()) +// // ..routes +// return r +// } +func Profiler() http.Handler { + r := chi.NewRouter() + r.Use(NoCache) + + r.Get("/", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/pprof/", http.StatusMovedPermanently) + }) + r.HandleFunc("/pprof", func(w http.ResponseWriter, r *http.Request) { + http.Redirect(w, r, r.RequestURI+"/", http.StatusMovedPermanently) + }) + + r.HandleFunc("/pprof/*", pprof.Index) + r.HandleFunc("/pprof/cmdline", pprof.Cmdline) + r.HandleFunc("/pprof/profile", pprof.Profile) + r.HandleFunc("/pprof/symbol", pprof.Symbol) + r.HandleFunc("/pprof/trace", pprof.Trace) + r.Handle("/vars", expvar.Handler()) + + r.Handle("/pprof/goroutine", pprof.Handler("goroutine")) + r.Handle("/pprof/threadcreate", pprof.Handler("threadcreate")) + r.Handle("/pprof/mutex", pprof.Handler("mutex")) + r.Handle("/pprof/heap", pprof.Handler("heap")) + r.Handle("/pprof/block", pprof.Handler("block")) + r.Handle("/pprof/allocs", pprof.Handler("allocs")) + + return r +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/realip.go b/vendor/github.com/go-chi/chi/v5/middleware/realip.go new file mode 100644 index 0000000..2c6b3b3 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/realip.go @@ -0,0 +1,60 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "net" + "net/http" + "strings" +) + +var trueClientIP = http.CanonicalHeaderKey("True-Client-IP") +var xForwardedFor = http.CanonicalHeaderKey("X-Forwarded-For") +var xRealIP = http.CanonicalHeaderKey("X-Real-IP") + +// RealIP is a middleware that sets a http.Request's RemoteAddr to the results +// of parsing either the True-Client-IP, X-Real-IP or the X-Forwarded-For headers +// (in that order). +// +// This middleware should be inserted fairly early in the middleware stack to +// ensure that subsequent layers (e.g., request loggers) which examine the +// RemoteAddr will see the intended value. +// +// You should only use this middleware if you can trust the headers passed to +// you (in particular, the two headers this middleware uses), for example +// because you have placed a reverse proxy like HAProxy or nginx in front of +// chi. If your reverse proxies are configured to pass along arbitrary header +// values from the client, or if you use this middleware without a reverse +// proxy, malicious clients will be able to make you very sad (or, depending on +// how you're using RemoteAddr, vulnerable to an attack of some sort). +func RealIP(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + if rip := realIP(r); rip != "" { + r.RemoteAddr = rip + } + h.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +func realIP(r *http.Request) string { + var ip string + + if tcip := r.Header.Get(trueClientIP); tcip != "" { + ip = tcip + } else if xrip := r.Header.Get(xRealIP); xrip != "" { + ip = xrip + } else if xff := r.Header.Get(xForwardedFor); xff != "" { + i := strings.Index(xff, ",") + if i == -1 { + i = len(xff) + } + ip = xff[:i] + } + if ip == "" || net.ParseIP(ip) == nil { + return "" + } + return ip +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go b/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go new file mode 100644 index 0000000..81342df --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/recoverer.go @@ -0,0 +1,203 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "bytes" + "errors" + "fmt" + "io" + "net/http" + "os" + "runtime/debug" + "strings" +) + +// Recoverer is a middleware that recovers from panics, logs the panic (and a +// backtrace), and returns a HTTP 500 (Internal Server Error) status if +// possible. Recoverer prints a request ID if one is provided. +// +// Alternatively, look at https://github.com/go-chi/httplog middleware pkgs. +func Recoverer(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + defer func() { + if rvr := recover(); rvr != nil { + if rvr == http.ErrAbortHandler { + // we don't recover http.ErrAbortHandler so the response + // to the client is aborted, this should not be logged + panic(rvr) + } + + logEntry := GetLogEntry(r) + if logEntry != nil { + logEntry.Panic(rvr, debug.Stack()) + } else { + PrintPrettyStack(rvr) + } + + if r.Header.Get("Connection") != "Upgrade" { + w.WriteHeader(http.StatusInternalServerError) + } + } + }() + + next.ServeHTTP(w, r) + } + + return http.HandlerFunc(fn) +} + +// for ability to test the PrintPrettyStack function +var recovererErrorWriter io.Writer = os.Stderr + +func PrintPrettyStack(rvr interface{}) { + debugStack := debug.Stack() + s := prettyStack{} + out, err := s.parse(debugStack, rvr) + if err == nil { + recovererErrorWriter.Write(out) + } else { + // print stdlib output as a fallback + os.Stderr.Write(debugStack) + } +} + +type prettyStack struct { +} + +func (s prettyStack) parse(debugStack []byte, rvr interface{}) ([]byte, error) { + var err error + useColor := true + buf := &bytes.Buffer{} + + cW(buf, false, bRed, "\n") + cW(buf, useColor, bCyan, " panic: ") + cW(buf, useColor, bBlue, "%v", rvr) + cW(buf, false, bWhite, "\n \n") + + // process debug stack info + stack := strings.Split(string(debugStack), "\n") + lines := []string{} + + // locate panic line, as we may have nested panics + for i := len(stack) - 1; i > 0; i-- { + lines = append(lines, stack[i]) + if strings.HasPrefix(stack[i], "panic(") { + lines = lines[0 : len(lines)-2] // remove boilerplate + break + } + } + + // reverse + for i := len(lines)/2 - 1; i >= 0; i-- { + opp := len(lines) - 1 - i + lines[i], lines[opp] = lines[opp], lines[i] + } + + // decorate + for i, line := range lines { + lines[i], err = s.decorateLine(line, useColor, i) + if err != nil { + return nil, err + } + } + + for _, l := range lines { + fmt.Fprintf(buf, "%s", l) + } + return buf.Bytes(), nil +} + +func (s prettyStack) decorateLine(line string, useColor bool, num int) (string, error) { + line = strings.TrimSpace(line) + if strings.HasPrefix(line, "\t") || strings.Contains(line, ".go:") { + return s.decorateSourceLine(line, useColor, num) + } + if strings.HasSuffix(line, ")") { + return s.decorateFuncCallLine(line, useColor, num) + } + if strings.HasPrefix(line, "\t") { + return strings.Replace(line, "\t", " ", 1), nil + } + return fmt.Sprintf(" %s\n", line), nil +} + +func (s prettyStack) decorateFuncCallLine(line string, useColor bool, num int) (string, error) { + idx := strings.LastIndex(line, "(") + if idx < 0 { + return "", errors.New("not a func call line") + } + + buf := &bytes.Buffer{} + pkg := line[0:idx] + // addr := line[idx:] + method := "" + + if idx := strings.LastIndex(pkg, string(os.PathSeparator)); idx < 0 { + if idx := strings.Index(pkg, "."); idx > 0 { + method = pkg[idx:] + pkg = pkg[0:idx] + } + } else { + method = pkg[idx+1:] + pkg = pkg[0 : idx+1] + if idx := strings.Index(method, "."); idx > 0 { + pkg += method[0:idx] + method = method[idx:] + } + } + pkgColor := nYellow + methodColor := bGreen + + if num == 0 { + cW(buf, useColor, bRed, " -> ") + pkgColor = bMagenta + methodColor = bRed + } else { + cW(buf, useColor, bWhite, " ") + } + cW(buf, useColor, pkgColor, "%s", pkg) + cW(buf, useColor, methodColor, "%s\n", method) + // cW(buf, useColor, nBlack, "%s", addr) + return buf.String(), nil +} + +func (s prettyStack) decorateSourceLine(line string, useColor bool, num int) (string, error) { + idx := strings.LastIndex(line, ".go:") + if idx < 0 { + return "", errors.New("not a source line") + } + + buf := &bytes.Buffer{} + path := line[0 : idx+3] + lineno := line[idx+3:] + + idx = strings.LastIndex(path, string(os.PathSeparator)) + dir := path[0 : idx+1] + file := path[idx+1:] + + idx = strings.Index(lineno, " ") + if idx > 0 { + lineno = lineno[0:idx] + } + fileColor := bCyan + lineColor := bGreen + + if num == 1 { + cW(buf, useColor, bRed, " -> ") + fileColor = bRed + lineColor = bMagenta + } else { + cW(buf, false, bWhite, " ") + } + cW(buf, useColor, bWhite, "%s", dir) + cW(buf, useColor, fileColor, "%s", file) + cW(buf, useColor, lineColor, "%s", lineno) + if num == 1 { + cW(buf, false, bWhite, "\n") + } + cW(buf, false, bWhite, "\n") + + return buf.String(), nil +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/request_id.go b/vendor/github.com/go-chi/chi/v5/middleware/request_id.go new file mode 100644 index 0000000..4903ecc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/request_id.go @@ -0,0 +1,96 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "context" + "crypto/rand" + "encoding/base64" + "fmt" + "net/http" + "os" + "strings" + "sync/atomic" +) + +// Key to use when setting the request ID. +type ctxKeyRequestID int + +// RequestIDKey is the key that holds the unique request ID in a request context. +const RequestIDKey ctxKeyRequestID = 0 + +// RequestIDHeader is the name of the HTTP Header which contains the request id. +// Exported so that it can be changed by developers +var RequestIDHeader = "X-Request-Id" + +var prefix string +var reqid uint64 + +// A quick note on the statistics here: we're trying to calculate the chance that +// two randomly generated base62 prefixes will collide. We use the formula from +// http://en.wikipedia.org/wiki/Birthday_problem +// +// P[m, n] \approx 1 - e^{-m^2/2n} +// +// We ballpark an upper bound for $m$ by imagining (for whatever reason) a server +// that restarts every second over 10 years, for $m = 86400 * 365 * 10 = 315360000$ +// +// For a $k$ character base-62 identifier, we have $n(k) = 62^k$ +// +// Plugging this in, we find $P[m, n(10)] \approx 5.75%$, which is good enough for +// our purposes, and is surely more than anyone would ever need in practice -- a +// process that is rebooted a handful of times a day for a hundred years has less +// than a millionth of a percent chance of generating two colliding IDs. + +func init() { + hostname, err := os.Hostname() + if hostname == "" || err != nil { + hostname = "localhost" + } + var buf [12]byte + var b64 string + for len(b64) < 10 { + rand.Read(buf[:]) + b64 = base64.StdEncoding.EncodeToString(buf[:]) + b64 = strings.NewReplacer("+", "", "/", "").Replace(b64) + } + + prefix = fmt.Sprintf("%s/%s", hostname, b64[0:10]) +} + +// RequestID is a middleware that injects a request ID into the context of each +// request. A request ID is a string of the form "host.example.com/random-0001", +// where "random" is a base62 random string that uniquely identifies this go +// process, and where the last number is an atomically incremented request +// counter. +func RequestID(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + requestID := r.Header.Get(RequestIDHeader) + if requestID == "" { + myid := atomic.AddUint64(&reqid, 1) + requestID = fmt.Sprintf("%s-%06d", prefix, myid) + } + ctx = context.WithValue(ctx, RequestIDKey, requestID) + next.ServeHTTP(w, r.WithContext(ctx)) + } + return http.HandlerFunc(fn) +} + +// GetReqID returns a request ID from the given context if one is present. +// Returns the empty string if a request ID cannot be found. +func GetReqID(ctx context.Context) string { + if ctx == nil { + return "" + } + if reqID, ok := ctx.Value(RequestIDKey).(string); ok { + return reqID + } + return "" +} + +// NextRequestID generates the next request ID in the sequence. +func NextRequestID() uint64 { + return atomic.AddUint64(&reqid, 1) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/request_size.go b/vendor/github.com/go-chi/chi/v5/middleware/request_size.go new file mode 100644 index 0000000..678248c --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/request_size.go @@ -0,0 +1,18 @@ +package middleware + +import ( + "net/http" +) + +// RequestSize is a middleware that will limit request sizes to a specified +// number of bytes. It uses MaxBytesReader to do so. +func RequestSize(bytes int64) func(http.Handler) http.Handler { + f := func(h http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r.Body = http.MaxBytesReader(w, r.Body, bytes) + h.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } + return f +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go b/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go new file mode 100644 index 0000000..997bed5 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/route_headers.go @@ -0,0 +1,151 @@ +package middleware + +import ( + "net/http" + "strings" +) + +// RouteHeaders is a neat little header-based router that allows you to direct +// the flow of a request through a middleware stack based on a request header. +// +// For example, lets say you'd like to setup multiple routers depending on the +// request Host header, you could then do something as so: +// +// r := chi.NewRouter() +// rSubdomain := chi.NewRouter() +// r.Use(middleware.RouteHeaders(). +// Route("Host", "example.com", middleware.New(r)). +// Route("Host", "*.example.com", middleware.New(rSubdomain)). +// Handler) +// r.Get("/", h) +// rSubdomain.Get("/", h2) +// +// Another example, imagine you want to setup multiple CORS handlers, where for +// your origin servers you allow authorized requests, but for third-party public +// requests, authorization is disabled. +// +// r := chi.NewRouter() +// r.Use(middleware.RouteHeaders(). +// Route("Origin", "https://app.skyweaver.net", cors.Handler(cors.Options{ +// AllowedOrigins: []string{"https://api.skyweaver.net"}, +// AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, +// AllowedHeaders: []string{"Accept", "Authorization", "Content-Type"}, +// AllowCredentials: true, // <----------<<< allow credentials +// })). +// Route("Origin", "*", cors.Handler(cors.Options{ +// AllowedOrigins: []string{"*"}, +// AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, +// AllowedHeaders: []string{"Accept", "Content-Type"}, +// AllowCredentials: false, // <----------<<< do not allow credentials +// })). +// Handler) +func RouteHeaders() HeaderRouter { + return HeaderRouter{} +} + +type HeaderRouter map[string][]HeaderRoute + +func (hr HeaderRouter) Route(header, match string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { + header = strings.ToLower(header) + k := hr[header] + if k == nil { + hr[header] = []HeaderRoute{} + } + hr[header] = append(hr[header], HeaderRoute{MatchOne: NewPattern(match), Middleware: middlewareHandler}) + return hr +} + +func (hr HeaderRouter) RouteAny(header string, match []string, middlewareHandler func(next http.Handler) http.Handler) HeaderRouter { + header = strings.ToLower(header) + k := hr[header] + if k == nil { + hr[header] = []HeaderRoute{} + } + patterns := []Pattern{} + for _, m := range match { + patterns = append(patterns, NewPattern(m)) + } + hr[header] = append(hr[header], HeaderRoute{MatchAny: patterns, Middleware: middlewareHandler}) + return hr +} + +func (hr HeaderRouter) RouteDefault(handler func(next http.Handler) http.Handler) HeaderRouter { + hr["*"] = []HeaderRoute{{Middleware: handler}} + return hr +} + +func (hr HeaderRouter) Handler(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if len(hr) == 0 { + // skip if no routes set + next.ServeHTTP(w, r) + } + + // find first matching header route, and continue + for header, matchers := range hr { + headerValue := r.Header.Get(header) + if headerValue == "" { + continue + } + headerValue = strings.ToLower(headerValue) + for _, matcher := range matchers { + if matcher.IsMatch(headerValue) { + matcher.Middleware(next).ServeHTTP(w, r) + return + } + } + } + + // if no match, check for "*" default route + matcher, ok := hr["*"] + if !ok || matcher[0].Middleware == nil { + next.ServeHTTP(w, r) + return + } + matcher[0].Middleware(next).ServeHTTP(w, r) + }) +} + +type HeaderRoute struct { + Middleware func(next http.Handler) http.Handler + MatchOne Pattern + MatchAny []Pattern +} + +func (r HeaderRoute) IsMatch(value string) bool { + if len(r.MatchAny) > 0 { + for _, m := range r.MatchAny { + if m.Match(value) { + return true + } + } + } else if r.MatchOne.Match(value) { + return true + } + return false +} + +type Pattern struct { + prefix string + suffix string + wildcard bool +} + +func NewPattern(value string) Pattern { + p := Pattern{} + if i := strings.IndexByte(value, '*'); i >= 0 { + p.wildcard = true + p.prefix = value[0:i] + p.suffix = value[i+1:] + } else { + p.prefix = value + } + return p +} + +func (p Pattern) Match(v string) bool { + if !p.wildcard { + return p.prefix == v + } + return len(v) >= len(p.prefix+p.suffix) && strings.HasPrefix(v, p.prefix) && strings.HasSuffix(v, p.suffix) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/strip.go b/vendor/github.com/go-chi/chi/v5/middleware/strip.go new file mode 100644 index 0000000..ce8ebfc --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/strip.go @@ -0,0 +1,62 @@ +package middleware + +import ( + "fmt" + "net/http" + + "github.com/go-chi/chi/v5" +) + +// StripSlashes is a middleware that will match request paths with a trailing +// slash, strip it from the path and continue routing through the mux, if a route +// matches, then it will serve the handler. +func StripSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx != nil && rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + newPath := path[:len(path)-1] + if rctx == nil { + r.URL.Path = newPath + } else { + rctx.RoutePath = newPath + } + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} + +// RedirectSlashes is a middleware that will match request paths with a trailing +// slash and redirect to the same path, less the trailing slash. +// +// NOTE: RedirectSlashes middleware is *incompatible* with http.FileServer, +// see https://github.com/go-chi/chi/issues/343 +func RedirectSlashes(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + var path string + rctx := chi.RouteContext(r.Context()) + if rctx != nil && rctx.RoutePath != "" { + path = rctx.RoutePath + } else { + path = r.URL.Path + } + if len(path) > 1 && path[len(path)-1] == '/' { + if r.URL.RawQuery != "" { + path = fmt.Sprintf("%s?%s", path[:len(path)-1], r.URL.RawQuery) + } else { + path = path[:len(path)-1] + } + redirectURL := fmt.Sprintf("//%s%s", r.Host, path) + http.Redirect(w, r, redirectURL, 301) + return + } + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/sunset.go b/vendor/github.com/go-chi/chi/v5/middleware/sunset.go new file mode 100644 index 0000000..18815d5 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/sunset.go @@ -0,0 +1,25 @@ +package middleware + +import ( + "net/http" + "time" +) + +// Sunset set Deprecation/Sunset header to response +// This can be used to enable Sunset in a route or a route group +// For more: https://www.rfc-editor.org/rfc/rfc8594.html +func Sunset(sunsetAt time.Time, links ...string) func(http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if !sunsetAt.IsZero() { + w.Header().Set("Sunset", sunsetAt.Format(http.TimeFormat)) + w.Header().Set("Deprecation", sunsetAt.Format(http.TimeFormat)) + + for _, link := range links { + w.Header().Add("Link", link) + } + } + next.ServeHTTP(w, r) + }) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/supress_notfound.go b/vendor/github.com/go-chi/chi/v5/middleware/supress_notfound.go new file mode 100644 index 0000000..83a8a87 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/supress_notfound.go @@ -0,0 +1,27 @@ +package middleware + +import ( + "net/http" + + "github.com/go-chi/chi/v5" +) + +// SupressNotFound will quickly respond with a 404 if the route is not found +// and will not continue to the next middleware handler. +// +// This is handy to put at the top of your middleware stack to avoid unnecessary +// processing of requests that are not going to match any routes anyway. For +// example its super annoying to see a bunch of 404's in your logs from bots. +func SupressNotFound(router *chi.Mux) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := chi.RouteContext(r.Context()) + match := rctx.Routes.Match(rctx, r.Method, r.URL.Path) + if !match { + router.NotFoundHandler().ServeHTTP(w, r) + return + } + next.ServeHTTP(w, r) + }) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/terminal.go b/vendor/github.com/go-chi/chi/v5/middleware/terminal.go new file mode 100644 index 0000000..5ead7b9 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/terminal.go @@ -0,0 +1,63 @@ +package middleware + +// Ported from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "fmt" + "io" + "os" +) + +var ( + // Normal colors + nBlack = []byte{'\033', '[', '3', '0', 'm'} + nRed = []byte{'\033', '[', '3', '1', 'm'} + nGreen = []byte{'\033', '[', '3', '2', 'm'} + nYellow = []byte{'\033', '[', '3', '3', 'm'} + nBlue = []byte{'\033', '[', '3', '4', 'm'} + nMagenta = []byte{'\033', '[', '3', '5', 'm'} + nCyan = []byte{'\033', '[', '3', '6', 'm'} + nWhite = []byte{'\033', '[', '3', '7', 'm'} + // Bright colors + bBlack = []byte{'\033', '[', '3', '0', ';', '1', 'm'} + bRed = []byte{'\033', '[', '3', '1', ';', '1', 'm'} + bGreen = []byte{'\033', '[', '3', '2', ';', '1', 'm'} + bYellow = []byte{'\033', '[', '3', '3', ';', '1', 'm'} + bBlue = []byte{'\033', '[', '3', '4', ';', '1', 'm'} + bMagenta = []byte{'\033', '[', '3', '5', ';', '1', 'm'} + bCyan = []byte{'\033', '[', '3', '6', ';', '1', 'm'} + bWhite = []byte{'\033', '[', '3', '7', ';', '1', 'm'} + + reset = []byte{'\033', '[', '0', 'm'} +) + +var IsTTY bool + +func init() { + // This is sort of cheating: if stdout is a character device, we assume + // that means it's a TTY. Unfortunately, there are many non-TTY + // character devices, but fortunately stdout is rarely set to any of + // them. + // + // We could solve this properly by pulling in a dependency on + // code.google.com/p/go.crypto/ssh/terminal, for instance, but as a + // heuristic for whether to print in color or in black-and-white, I'd + // really rather not. + fi, err := os.Stdout.Stat() + if err == nil { + m := os.ModeDevice | os.ModeCharDevice + IsTTY = fi.Mode()&m == m + } +} + +// colorWrite +func cW(w io.Writer, useColor bool, color []byte, s string, args ...interface{}) { + if IsTTY && useColor { + w.Write(color) + } + fmt.Fprintf(w, s, args...) + if IsTTY && useColor { + w.Write(reset) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/throttle.go b/vendor/github.com/go-chi/chi/v5/middleware/throttle.go new file mode 100644 index 0000000..bdf4f9f --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/throttle.go @@ -0,0 +1,132 @@ +package middleware + +import ( + "net/http" + "strconv" + "time" +) + +const ( + errCapacityExceeded = "Server capacity exceeded." + errTimedOut = "Timed out while waiting for a pending request to complete." + errContextCanceled = "Context was canceled." +) + +var ( + defaultBacklogTimeout = time.Second * 60 +) + +// ThrottleOpts represents a set of throttling options. +type ThrottleOpts struct { + RetryAfterFn func(ctxDone bool) time.Duration + Limit int + BacklogLimit int + BacklogTimeout time.Duration +} + +// Throttle is a middleware that limits number of currently processed requests +// at a time across all users. Note: Throttle is not a rate-limiter per user, +// instead it just puts a ceiling on the number of currently in-flight requests +// being processed from the point from where the Throttle middleware is mounted. +func Throttle(limit int) func(http.Handler) http.Handler { + return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogTimeout: defaultBacklogTimeout}) +} + +// ThrottleBacklog is a middleware that limits number of currently processed +// requests at a time and provides a backlog for holding a finite number of +// pending requests. +func ThrottleBacklog(limit, backlogLimit int, backlogTimeout time.Duration) func(http.Handler) http.Handler { + return ThrottleWithOpts(ThrottleOpts{Limit: limit, BacklogLimit: backlogLimit, BacklogTimeout: backlogTimeout}) +} + +// ThrottleWithOpts is a middleware that limits number of currently processed requests using passed ThrottleOpts. +func ThrottleWithOpts(opts ThrottleOpts) func(http.Handler) http.Handler { + if opts.Limit < 1 { + panic("chi/middleware: Throttle expects limit > 0") + } + + if opts.BacklogLimit < 0 { + panic("chi/middleware: Throttle expects backlogLimit to be positive") + } + + t := throttler{ + tokens: make(chan token, opts.Limit), + backlogTokens: make(chan token, opts.Limit+opts.BacklogLimit), + backlogTimeout: opts.BacklogTimeout, + retryAfterFn: opts.RetryAfterFn, + } + + // Filling tokens. + for i := 0; i < opts.Limit+opts.BacklogLimit; i++ { + if i < opts.Limit { + t.tokens <- token{} + } + t.backlogTokens <- token{} + } + + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + select { + + case <-ctx.Done(): + t.setRetryAfterHeaderIfNeeded(w, true) + http.Error(w, errContextCanceled, http.StatusTooManyRequests) + return + + case btok := <-t.backlogTokens: + timer := time.NewTimer(t.backlogTimeout) + + defer func() { + t.backlogTokens <- btok + }() + + select { + case <-timer.C: + t.setRetryAfterHeaderIfNeeded(w, false) + http.Error(w, errTimedOut, http.StatusTooManyRequests) + return + case <-ctx.Done(): + timer.Stop() + t.setRetryAfterHeaderIfNeeded(w, true) + http.Error(w, errContextCanceled, http.StatusTooManyRequests) + return + case tok := <-t.tokens: + defer func() { + timer.Stop() + t.tokens <- tok + }() + next.ServeHTTP(w, r) + } + return + + default: + t.setRetryAfterHeaderIfNeeded(w, false) + http.Error(w, errCapacityExceeded, http.StatusTooManyRequests) + return + } + } + + return http.HandlerFunc(fn) + } +} + +// token represents a request that is being processed. +type token struct{} + +// throttler limits number of currently processed requests at a time. +type throttler struct { + tokens chan token + backlogTokens chan token + retryAfterFn func(ctxDone bool) time.Duration + backlogTimeout time.Duration +} + +// setRetryAfterHeaderIfNeeded sets Retry-After HTTP header if corresponding retryAfterFn option of throttler is initialized. +func (t throttler) setRetryAfterHeaderIfNeeded(w http.ResponseWriter, ctxDone bool) { + if t.retryAfterFn == nil { + return + } + w.Header().Set("Retry-After", strconv.Itoa(int(t.retryAfterFn(ctxDone).Seconds()))) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/timeout.go b/vendor/github.com/go-chi/chi/v5/middleware/timeout.go new file mode 100644 index 0000000..add596d --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/timeout.go @@ -0,0 +1,48 @@ +package middleware + +import ( + "context" + "net/http" + "time" +) + +// Timeout is a middleware that cancels ctx after a given timeout and return +// a 504 Gateway Timeout error to the client. +// +// It's required that you select the ctx.Done() channel to check for the signal +// if the context has reached its deadline and return, otherwise the timeout +// signal will be just ignored. +// +// ie. a route/handler may look like: +// +// r.Get("/long", func(w http.ResponseWriter, r *http.Request) { +// ctx := r.Context() +// processTime := time.Duration(rand.Intn(4)+1) * time.Second +// +// select { +// case <-ctx.Done(): +// return +// +// case <-time.After(processTime): +// // The above channel simulates some hard work. +// } +// +// w.Write([]byte("done")) +// }) +func Timeout(timeout time.Duration) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx, cancel := context.WithTimeout(r.Context(), timeout) + defer func() { + cancel() + if ctx.Err() == context.DeadlineExceeded { + w.WriteHeader(http.StatusGatewayTimeout) + } + }() + + r = r.WithContext(ctx) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/url_format.go b/vendor/github.com/go-chi/chi/v5/middleware/url_format.go new file mode 100644 index 0000000..d8a651e --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/url_format.go @@ -0,0 +1,75 @@ +package middleware + +import ( + "context" + "net/http" + "strings" + + "github.com/go-chi/chi/v5" +) + +var ( + // URLFormatCtxKey is the context.Context key to store the URL format data + // for a request. + URLFormatCtxKey = &contextKey{"URLFormat"} +) + +// URLFormat is a middleware that parses the url extension from a request path and stores it +// on the context as a string under the key `middleware.URLFormatCtxKey`. The middleware will +// trim the suffix from the routing path and continue routing. +// +// Routers should not include a url parameter for the suffix when using this middleware. +// +// Sample usage for url paths `/articles/1`, `/articles/1.json` and `/articles/1.xml`: +// +// func routes() http.Handler { +// r := chi.NewRouter() +// r.Use(middleware.URLFormat) +// +// r.Get("/articles/{id}", ListArticles) +// +// return r +// } +// +// func ListArticles(w http.ResponseWriter, r *http.Request) { +// urlFormat, _ := r.Context().Value(middleware.URLFormatCtxKey).(string) +// +// switch urlFormat { +// case "json": +// render.JSON(w, r, articles) +// case "xml:" +// render.XML(w, r, articles) +// default: +// render.JSON(w, r, articles) +// } +// } +func URLFormat(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + ctx := r.Context() + + var format string + path := r.URL.Path + + rctx := chi.RouteContext(r.Context()) + if rctx != nil && rctx.RoutePath != "" { + path = rctx.RoutePath + } + + if strings.Index(path, ".") > 0 { + base := strings.LastIndex(path, "/") + idx := strings.LastIndex(path[base:], ".") + + if idx > 0 { + idx += base + format = path[idx+1:] + + rctx.RoutePath = path[:idx] + } + } + + r = r.WithContext(context.WithValue(ctx, URLFormatCtxKey, format)) + + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/value.go b/vendor/github.com/go-chi/chi/v5/middleware/value.go new file mode 100644 index 0000000..a9dfd43 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/value.go @@ -0,0 +1,17 @@ +package middleware + +import ( + "context" + "net/http" +) + +// WithValue is a middleware that sets a given key/value in a context chain. +func WithValue(key, val interface{}) func(next http.Handler) http.Handler { + return func(next http.Handler) http.Handler { + fn := func(w http.ResponseWriter, r *http.Request) { + r = r.WithContext(context.WithValue(r.Context(), key, val)) + next.ServeHTTP(w, r) + } + return http.HandlerFunc(fn) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go b/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go new file mode 100644 index 0000000..cf5c44d --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/middleware/wrap_writer.go @@ -0,0 +1,219 @@ +package middleware + +// The original work was derived from Goji's middleware, source: +// https://github.com/zenazn/goji/tree/master/web/middleware + +import ( + "bufio" + "io" + "net" + "net/http" +) + +// NewWrapResponseWriter wraps an http.ResponseWriter, returning a proxy that allows you to +// hook into various parts of the response process. +func NewWrapResponseWriter(w http.ResponseWriter, protoMajor int) WrapResponseWriter { + _, fl := w.(http.Flusher) + + bw := basicWriter{ResponseWriter: w} + + if protoMajor == 2 { + _, ps := w.(http.Pusher) + if fl && ps { + return &http2FancyWriter{bw} + } + } else { + _, hj := w.(http.Hijacker) + _, rf := w.(io.ReaderFrom) + if fl && hj && rf { + return &httpFancyWriter{bw} + } + if fl && hj { + return &flushHijackWriter{bw} + } + if hj { + return &hijackWriter{bw} + } + } + + if fl { + return &flushWriter{bw} + } + + return &bw +} + +// WrapResponseWriter is a proxy around an http.ResponseWriter that allows you to hook +// into various parts of the response process. +type WrapResponseWriter interface { + http.ResponseWriter + // Status returns the HTTP status of the request, or 0 if one has not + // yet been sent. + Status() int + // BytesWritten returns the total number of bytes sent to the client. + BytesWritten() int + // Tee causes the response body to be written to the given io.Writer in + // addition to proxying the writes through. Only one io.Writer can be + // tee'd to at once: setting a second one will overwrite the first. + // Writes will be sent to the proxy before being written to this + // io.Writer. It is illegal for the tee'd writer to be modified + // concurrently with writes. + Tee(io.Writer) + // Unwrap returns the original proxied target. + Unwrap() http.ResponseWriter +} + +// basicWriter wraps a http.ResponseWriter that implements the minimal +// http.ResponseWriter interface. +type basicWriter struct { + http.ResponseWriter + wroteHeader bool + code int + bytes int + tee io.Writer +} + +func (b *basicWriter) WriteHeader(code int) { + if !b.wroteHeader { + b.code = code + b.wroteHeader = true + b.ResponseWriter.WriteHeader(code) + } +} + +func (b *basicWriter) Write(buf []byte) (int, error) { + b.maybeWriteHeader() + n, err := b.ResponseWriter.Write(buf) + if b.tee != nil { + _, err2 := b.tee.Write(buf[:n]) + // Prefer errors generated by the proxied writer. + if err == nil { + err = err2 + } + } + b.bytes += n + return n, err +} + +func (b *basicWriter) maybeWriteHeader() { + if !b.wroteHeader { + b.WriteHeader(http.StatusOK) + } +} + +func (b *basicWriter) Status() int { + return b.code +} + +func (b *basicWriter) BytesWritten() int { + return b.bytes +} + +func (b *basicWriter) Tee(w io.Writer) { + b.tee = w +} + +func (b *basicWriter) Unwrap() http.ResponseWriter { + return b.ResponseWriter +} + +// flushWriter ... +type flushWriter struct { + basicWriter +} + +func (f *flushWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +var _ http.Flusher = &flushWriter{} + +// hijackWriter ... +type hijackWriter struct { + basicWriter +} + +func (f *hijackWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj := f.basicWriter.ResponseWriter.(http.Hijacker) + return hj.Hijack() +} + +var _ http.Hijacker = &hijackWriter{} + +// flushHijackWriter ... +type flushHijackWriter struct { + basicWriter +} + +func (f *flushHijackWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +func (f *flushHijackWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj := f.basicWriter.ResponseWriter.(http.Hijacker) + return hj.Hijack() +} + +var _ http.Flusher = &flushHijackWriter{} +var _ http.Hijacker = &flushHijackWriter{} + +// httpFancyWriter is a HTTP writer that additionally satisfies +// http.Flusher, http.Hijacker, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type httpFancyWriter struct { + basicWriter +} + +func (f *httpFancyWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +func (f *httpFancyWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { + hj := f.basicWriter.ResponseWriter.(http.Hijacker) + return hj.Hijack() +} + +func (f *http2FancyWriter) Push(target string, opts *http.PushOptions) error { + return f.basicWriter.ResponseWriter.(http.Pusher).Push(target, opts) +} + +func (f *httpFancyWriter) ReadFrom(r io.Reader) (int64, error) { + if f.basicWriter.tee != nil { + n, err := io.Copy(&f.basicWriter, r) + f.basicWriter.bytes += int(n) + return n, err + } + rf := f.basicWriter.ResponseWriter.(io.ReaderFrom) + f.basicWriter.maybeWriteHeader() + n, err := rf.ReadFrom(r) + f.basicWriter.bytes += int(n) + return n, err +} + +var _ http.Flusher = &httpFancyWriter{} +var _ http.Hijacker = &httpFancyWriter{} +var _ http.Pusher = &http2FancyWriter{} +var _ io.ReaderFrom = &httpFancyWriter{} + +// http2FancyWriter is a HTTP2 writer that additionally satisfies +// http.Flusher, and io.ReaderFrom. It exists for the common case +// of wrapping the http.ResponseWriter that package http gives you, in order to +// make the proxied object support the full method set of the proxied object. +type http2FancyWriter struct { + basicWriter +} + +func (f *http2FancyWriter) Flush() { + f.wroteHeader = true + fl := f.basicWriter.ResponseWriter.(http.Flusher) + fl.Flush() +} + +var _ http.Flusher = &http2FancyWriter{} diff --git a/vendor/github.com/go-chi/chi/v5/mux.go b/vendor/github.com/go-chi/chi/v5/mux.go new file mode 100644 index 0000000..735ab23 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/mux.go @@ -0,0 +1,492 @@ +package chi + +import ( + "context" + "fmt" + "net/http" + "strings" + "sync" +) + +var _ Router = &Mux{} + +// Mux is a simple HTTP route multiplexer that parses a request path, +// records any URL params, and executes an end handler. It implements +// the http.Handler interface and is friendly with the standard library. +// +// Mux is designed to be fast, minimal and offer a powerful API for building +// modular and composable HTTP services with a large set of handlers. It's +// particularly useful for writing large REST API services that break a handler +// into many smaller parts composed of middlewares and end handlers. +type Mux struct { + // The computed mux handler made of the chained middleware stack and + // the tree router + handler http.Handler + + // The radix trie router + tree *node + + // Custom method not allowed handler + methodNotAllowedHandler http.HandlerFunc + + // A reference to the parent mux used by subrouters when mounting + // to a parent mux + parent *Mux + + // Routing context pool + pool *sync.Pool + + // Custom route not found handler + notFoundHandler http.HandlerFunc + + // The middleware stack + middlewares []func(http.Handler) http.Handler + + // Controls the behaviour of middleware chain generation when a mux + // is registered as an inline group inside another mux. + inline bool +} + +// NewMux returns a newly initialized Mux object that implements the Router +// interface. +func NewMux() *Mux { + mux := &Mux{tree: &node{}, pool: &sync.Pool{}} + mux.pool.New = func() interface{} { + return NewRouteContext() + } + return mux +} + +// ServeHTTP is the single method of the http.Handler interface that makes +// Mux interoperable with the standard library. It uses a sync.Pool to get and +// reuse routing contexts for each request. +func (mx *Mux) ServeHTTP(w http.ResponseWriter, r *http.Request) { + // Ensure the mux has some routes defined on the mux + if mx.handler == nil { + mx.NotFoundHandler().ServeHTTP(w, r) + return + } + + // Check if a routing context already exists from a parent router. + rctx, _ := r.Context().Value(RouteCtxKey).(*Context) + if rctx != nil { + mx.handler.ServeHTTP(w, r) + return + } + + // Fetch a RouteContext object from the sync pool, and call the computed + // mx.handler that is comprised of mx.middlewares + mx.routeHTTP. + // Once the request is finished, reset the routing context and put it back + // into the pool for reuse from another request. + rctx = mx.pool.Get().(*Context) + rctx.Reset() + rctx.Routes = mx + rctx.parentCtx = r.Context() + + // NOTE: r.WithContext() causes 2 allocations and context.WithValue() causes 1 allocation + r = r.WithContext(context.WithValue(r.Context(), RouteCtxKey, rctx)) + + // Serve the request and once its done, put the request context back in the sync pool + mx.handler.ServeHTTP(w, r) + mx.pool.Put(rctx) +} + +// Use appends a middleware handler to the Mux middleware stack. +// +// The middleware stack for any Mux will execute before searching for a matching +// route to a specific handler, which provides opportunity to respond early, +// change the course of the request execution, or set request-scoped values for +// the next http.Handler. +func (mx *Mux) Use(middlewares ...func(http.Handler) http.Handler) { + if mx.handler != nil { + panic("chi: all middlewares must be defined before routes on a mux") + } + mx.middlewares = append(mx.middlewares, middlewares...) +} + +// Handle adds the route `pattern` that matches any http method to +// execute the `handler` http.Handler. +func (mx *Mux) Handle(pattern string, handler http.Handler) { + mx.handle(mALL, pattern, handler) +} + +// HandleFunc adds the route `pattern` that matches any http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) HandleFunc(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mALL, pattern, handlerFn) +} + +// Method adds the route `pattern` that matches `method` http method to +// execute the `handler` http.Handler. +func (mx *Mux) Method(method, pattern string, handler http.Handler) { + m, ok := methodMap[strings.ToUpper(method)] + if !ok { + panic(fmt.Sprintf("chi: '%s' http method is not supported.", method)) + } + mx.handle(m, pattern, handler) +} + +// MethodFunc adds the route `pattern` that matches `method` http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) MethodFunc(method, pattern string, handlerFn http.HandlerFunc) { + mx.Method(method, pattern, handlerFn) +} + +// Connect adds the route `pattern` that matches a CONNECT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Connect(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mCONNECT, pattern, handlerFn) +} + +// Delete adds the route `pattern` that matches a DELETE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Delete(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mDELETE, pattern, handlerFn) +} + +// Get adds the route `pattern` that matches a GET http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Get(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mGET, pattern, handlerFn) +} + +// Head adds the route `pattern` that matches a HEAD http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Head(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mHEAD, pattern, handlerFn) +} + +// Options adds the route `pattern` that matches an OPTIONS http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Options(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mOPTIONS, pattern, handlerFn) +} + +// Patch adds the route `pattern` that matches a PATCH http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Patch(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPATCH, pattern, handlerFn) +} + +// Post adds the route `pattern` that matches a POST http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Post(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPOST, pattern, handlerFn) +} + +// Put adds the route `pattern` that matches a PUT http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Put(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mPUT, pattern, handlerFn) +} + +// Trace adds the route `pattern` that matches a TRACE http method to +// execute the `handlerFn` http.HandlerFunc. +func (mx *Mux) Trace(pattern string, handlerFn http.HandlerFunc) { + mx.handle(mTRACE, pattern, handlerFn) +} + +// NotFound sets a custom http.HandlerFunc for routing paths that could +// not be found. The default 404 handler is `http.NotFound`. +func (mx *Mux) NotFound(handlerFn http.HandlerFunc) { + // Build NotFound handler chain + m := mx + hFn := handlerFn + if mx.inline && mx.parent != nil { + m = mx.parent + hFn = Chain(mx.middlewares...).HandlerFunc(hFn).ServeHTTP + } + + // Update the notFoundHandler from this point forward + m.notFoundHandler = hFn + m.updateSubRoutes(func(subMux *Mux) { + if subMux.notFoundHandler == nil { + subMux.NotFound(hFn) + } + }) +} + +// MethodNotAllowed sets a custom http.HandlerFunc for routing paths where the +// method is unresolved. The default handler returns a 405 with an empty body. +func (mx *Mux) MethodNotAllowed(handlerFn http.HandlerFunc) { + // Build MethodNotAllowed handler chain + m := mx + hFn := handlerFn + if mx.inline && mx.parent != nil { + m = mx.parent + hFn = Chain(mx.middlewares...).HandlerFunc(hFn).ServeHTTP + } + + // Update the methodNotAllowedHandler from this point forward + m.methodNotAllowedHandler = hFn + m.updateSubRoutes(func(subMux *Mux) { + if subMux.methodNotAllowedHandler == nil { + subMux.MethodNotAllowed(hFn) + } + }) +} + +// With adds inline middlewares for an endpoint handler. +func (mx *Mux) With(middlewares ...func(http.Handler) http.Handler) Router { + // Similarly as in handle(), we must build the mux handler once additional + // middleware registration isn't allowed for this stack, like now. + if !mx.inline && mx.handler == nil { + mx.updateRouteHandler() + } + + // Copy middlewares from parent inline muxs + var mws Middlewares + if mx.inline { + mws = make(Middlewares, len(mx.middlewares)) + copy(mws, mx.middlewares) + } + mws = append(mws, middlewares...) + + im := &Mux{ + pool: mx.pool, inline: true, parent: mx, tree: mx.tree, middlewares: mws, + notFoundHandler: mx.notFoundHandler, methodNotAllowedHandler: mx.methodNotAllowedHandler, + } + + return im +} + +// Group creates a new inline-Mux with a copy of middleware stack. It's useful +// for a group of handlers along the same routing path that use an additional +// set of middlewares. See _examples/. +func (mx *Mux) Group(fn func(r Router)) Router { + im := mx.With() + if fn != nil { + fn(im) + } + return im +} + +// Route creates a new Mux and mounts it along the `pattern` as a subrouter. +// Effectively, this is a short-hand call to Mount. See _examples/. +func (mx *Mux) Route(pattern string, fn func(r Router)) Router { + if fn == nil { + panic(fmt.Sprintf("chi: attempting to Route() a nil subrouter on '%s'", pattern)) + } + subRouter := NewRouter() + fn(subRouter) + mx.Mount(pattern, subRouter) + return subRouter +} + +// Mount attaches another http.Handler or chi Router as a subrouter along a routing +// path. It's very useful to split up a large API as many independent routers and +// compose them as a single service using Mount. See _examples/. +// +// Note that Mount() simply sets a wildcard along the `pattern` that will continue +// routing at the `handler`, which in most cases is another chi.Router. As a result, +// if you define two Mount() routes on the exact same pattern the mount will panic. +func (mx *Mux) Mount(pattern string, handler http.Handler) { + if handler == nil { + panic(fmt.Sprintf("chi: attempting to Mount() a nil handler on '%s'", pattern)) + } + + // Provide runtime safety for ensuring a pattern isn't mounted on an existing + // routing pattern. + if mx.tree.findPattern(pattern+"*") || mx.tree.findPattern(pattern+"/*") { + panic(fmt.Sprintf("chi: attempting to Mount() a handler on an existing path, '%s'", pattern)) + } + + // Assign sub-Router's with the parent not found & method not allowed handler if not specified. + subr, ok := handler.(*Mux) + if ok && subr.notFoundHandler == nil && mx.notFoundHandler != nil { + subr.NotFound(mx.notFoundHandler) + } + if ok && subr.methodNotAllowedHandler == nil && mx.methodNotAllowedHandler != nil { + subr.MethodNotAllowed(mx.methodNotAllowedHandler) + } + + mountHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + rctx := RouteContext(r.Context()) + + // shift the url path past the previous subrouter + rctx.RoutePath = mx.nextRoutePath(rctx) + + // reset the wildcard URLParam which connects the subrouter + n := len(rctx.URLParams.Keys) - 1 + if n >= 0 && rctx.URLParams.Keys[n] == "*" && len(rctx.URLParams.Values) > n { + rctx.URLParams.Values[n] = "" + } + + handler.ServeHTTP(w, r) + }) + + if pattern == "" || pattern[len(pattern)-1] != '/' { + mx.handle(mALL|mSTUB, pattern, mountHandler) + mx.handle(mALL|mSTUB, pattern+"/", mountHandler) + pattern += "/" + } + + method := mALL + subroutes, _ := handler.(Routes) + if subroutes != nil { + method |= mSTUB + } + n := mx.handle(method, pattern+"*", mountHandler) + + if subroutes != nil { + n.subroutes = subroutes + } +} + +// Routes returns a slice of routing information from the tree, +// useful for traversing available routes of a router. +func (mx *Mux) Routes() []Route { + return mx.tree.routes() +} + +// Middlewares returns a slice of middleware handler functions. +func (mx *Mux) Middlewares() Middlewares { + return mx.middlewares +} + +// Match searches the routing tree for a handler that matches the method/path. +// It's similar to routing a http request, but without executing the handler +// thereafter. +// +// Note: the *Context state is updated during execution, so manage +// the state carefully or make a NewRouteContext(). +func (mx *Mux) Match(rctx *Context, method, path string) bool { + m, ok := methodMap[method] + if !ok { + return false + } + + node, _, h := mx.tree.FindRoute(rctx, m, path) + + if node != nil && node.subroutes != nil { + rctx.RoutePath = mx.nextRoutePath(rctx) + return node.subroutes.Match(rctx, method, rctx.RoutePath) + } + + return h != nil +} + +// NotFoundHandler returns the default Mux 404 responder whenever a route +// cannot be found. +func (mx *Mux) NotFoundHandler() http.HandlerFunc { + if mx.notFoundHandler != nil { + return mx.notFoundHandler + } + return http.NotFound +} + +// MethodNotAllowedHandler returns the default Mux 405 responder whenever +// a method cannot be resolved for a route. +func (mx *Mux) MethodNotAllowedHandler(methodsAllowed ...methodTyp) http.HandlerFunc { + if mx.methodNotAllowedHandler != nil { + return mx.methodNotAllowedHandler + } + return methodNotAllowedHandler(methodsAllowed...) +} + +// handle registers a http.Handler in the routing tree for a particular http method +// and routing pattern. +func (mx *Mux) handle(method methodTyp, pattern string, handler http.Handler) *node { + if len(pattern) == 0 || pattern[0] != '/' { + panic(fmt.Sprintf("chi: routing pattern must begin with '/' in '%s'", pattern)) + } + + // Build the computed routing handler for this routing pattern. + if !mx.inline && mx.handler == nil { + mx.updateRouteHandler() + } + + // Build endpoint handler with inline middlewares for the route + var h http.Handler + if mx.inline { + mx.handler = http.HandlerFunc(mx.routeHTTP) + h = Chain(mx.middlewares...).Handler(handler) + } else { + h = handler + } + + // Add the endpoint to the tree and return the node + return mx.tree.InsertRoute(method, pattern, h) +} + +// routeHTTP routes a http.Request through the Mux routing tree to serve +// the matching handler for a particular http method. +func (mx *Mux) routeHTTP(w http.ResponseWriter, r *http.Request) { + // Grab the route context object + rctx := r.Context().Value(RouteCtxKey).(*Context) + + // The request routing path + routePath := rctx.RoutePath + if routePath == "" { + if r.URL.RawPath != "" { + routePath = r.URL.RawPath + } else { + routePath = r.URL.Path + } + if routePath == "" { + routePath = "/" + } + } + + // Check if method is supported by chi + if rctx.RouteMethod == "" { + rctx.RouteMethod = r.Method + } + method, ok := methodMap[rctx.RouteMethod] + if !ok { + mx.MethodNotAllowedHandler().ServeHTTP(w, r) + return + } + + // Find the route + if _, _, h := mx.tree.FindRoute(rctx, method, routePath); h != nil { + h.ServeHTTP(w, r) + return + } + if rctx.methodNotAllowed { + mx.MethodNotAllowedHandler(rctx.methodsAllowed...).ServeHTTP(w, r) + } else { + mx.NotFoundHandler().ServeHTTP(w, r) + } +} + +func (mx *Mux) nextRoutePath(rctx *Context) string { + routePath := "/" + nx := len(rctx.routeParams.Keys) - 1 // index of last param in list + if nx >= 0 && rctx.routeParams.Keys[nx] == "*" && len(rctx.routeParams.Values) > nx { + routePath = "/" + rctx.routeParams.Values[nx] + } + return routePath +} + +// Recursively update data on child routers. +func (mx *Mux) updateSubRoutes(fn func(subMux *Mux)) { + for _, r := range mx.tree.routes() { + subMux, ok := r.SubRoutes.(*Mux) + if !ok { + continue + } + fn(subMux) + } +} + +// updateRouteHandler builds the single mux handler that is a chain of the middleware +// stack, as defined by calls to Use(), and the tree router (Mux) itself. After this +// point, no other middlewares can be registered on this Mux's stack. But you can still +// compose additional middlewares via Group()'s or using a chained middleware handler. +func (mx *Mux) updateRouteHandler() { + mx.handler = chain(mx.middlewares, http.HandlerFunc(mx.routeHTTP)) +} + +// methodNotAllowedHandler is a helper function to respond with a 405, +// method not allowed. It sets the Allow header with the list of allowed +// methods for the route. +func methodNotAllowedHandler(methodsAllowed ...methodTyp) func(w http.ResponseWriter, r *http.Request) { + return func(w http.ResponseWriter, r *http.Request) { + for _, m := range methodsAllowed { + w.Header().Add("Allow", reverseMethodMap[m]) + } + w.WriteHeader(405) + w.Write(nil) + } +} diff --git a/vendor/github.com/go-chi/chi/v5/tree.go b/vendor/github.com/go-chi/chi/v5/tree.go new file mode 100644 index 0000000..c7d3bc5 --- /dev/null +++ b/vendor/github.com/go-chi/chi/v5/tree.go @@ -0,0 +1,892 @@ +package chi + +// Radix tree implementation below is a based on the original work by +// Armon Dadgar in https://github.com/armon/go-radix/blob/master/radix.go +// (MIT licensed). It's been heavily modified for use as a HTTP routing tree. + +import ( + "fmt" + "net/http" + "regexp" + "sort" + "strconv" + "strings" +) + +type methodTyp uint + +const ( + mSTUB methodTyp = 1 << iota + mCONNECT + mDELETE + mGET + mHEAD + mOPTIONS + mPATCH + mPOST + mPUT + mTRACE +) + +var mALL = mCONNECT | mDELETE | mGET | mHEAD | + mOPTIONS | mPATCH | mPOST | mPUT | mTRACE + +var methodMap = map[string]methodTyp{ + http.MethodConnect: mCONNECT, + http.MethodDelete: mDELETE, + http.MethodGet: mGET, + http.MethodHead: mHEAD, + http.MethodOptions: mOPTIONS, + http.MethodPatch: mPATCH, + http.MethodPost: mPOST, + http.MethodPut: mPUT, + http.MethodTrace: mTRACE, +} + +var reverseMethodMap = map[methodTyp]string{ + mCONNECT: http.MethodConnect, + mDELETE: http.MethodDelete, + mGET: http.MethodGet, + mHEAD: http.MethodHead, + mOPTIONS: http.MethodOptions, + mPATCH: http.MethodPatch, + mPOST: http.MethodPost, + mPUT: http.MethodPut, + mTRACE: http.MethodTrace, +} + +// RegisterMethod adds support for custom HTTP method handlers, available +// via Router#Method and Router#MethodFunc +func RegisterMethod(method string) { + if method == "" { + return + } + method = strings.ToUpper(method) + if _, ok := methodMap[method]; ok { + return + } + n := len(methodMap) + if n > strconv.IntSize-2 { + panic(fmt.Sprintf("chi: max number of methods reached (%d)", strconv.IntSize)) + } + mt := methodTyp(2 << n) + methodMap[method] = mt + mALL |= mt +} + +type nodeTyp uint8 + +const ( + ntStatic nodeTyp = iota // /home + ntRegexp // /{id:[0-9]+} + ntParam // /{user} + ntCatchAll // /api/v1/* +) + +type node struct { + // subroutes on the leaf node + subroutes Routes + + // regexp matcher for regexp nodes + rex *regexp.Regexp + + // HTTP handler endpoints on the leaf node + endpoints endpoints + + // prefix is the common prefix we ignore + prefix string + + // child nodes should be stored in-order for iteration, + // in groups of the node type. + children [ntCatchAll + 1]nodes + + // first byte of the child prefix + tail byte + + // node type: static, regexp, param, catchAll + typ nodeTyp + + // first byte of the prefix + label byte +} + +// endpoints is a mapping of http method constants to handlers +// for a given route. +type endpoints map[methodTyp]*endpoint + +type endpoint struct { + // endpoint handler + handler http.Handler + + // pattern is the routing pattern for handler nodes + pattern string + + // parameter keys recorded on handler nodes + paramKeys []string +} + +func (s endpoints) Value(method methodTyp) *endpoint { + mh, ok := s[method] + if !ok { + mh = &endpoint{} + s[method] = mh + } + return mh +} + +func (n *node) InsertRoute(method methodTyp, pattern string, handler http.Handler) *node { + var parent *node + search := pattern + + for { + // Handle key exhaustion + if len(search) == 0 { + // Insert or update the node's leaf handler + n.setEndpoint(method, handler, pattern) + return n + } + + // We're going to be searching for a wild node next, + // in this case, we need to get the tail + var label = search[0] + var segTail byte + var segEndIdx int + var segTyp nodeTyp + var segRexpat string + if label == '{' || label == '*' { + segTyp, _, segRexpat, segTail, _, segEndIdx = patNextSegment(search) + } + + var prefix string + if segTyp == ntRegexp { + prefix = segRexpat + } + + // Look for the edge to attach to + parent = n + n = n.getEdge(segTyp, label, segTail, prefix) + + // No edge, create one + if n == nil { + child := &node{label: label, tail: segTail, prefix: search} + hn := parent.addChild(child, search) + hn.setEndpoint(method, handler, pattern) + + return hn + } + + // Found an edge to match the pattern + + if n.typ > ntStatic { + // We found a param node, trim the param from the search path and continue. + // This param/wild pattern segment would already be on the tree from a previous + // call to addChild when creating a new node. + search = search[segEndIdx:] + continue + } + + // Static nodes fall below here. + // Determine longest prefix of the search key on match. + commonPrefix := longestPrefix(search, n.prefix) + if commonPrefix == len(n.prefix) { + // the common prefix is as long as the current node's prefix we're attempting to insert. + // keep the search going. + search = search[commonPrefix:] + continue + } + + // Split the node + child := &node{ + typ: ntStatic, + prefix: search[:commonPrefix], + } + parent.replaceChild(search[0], segTail, child) + + // Restore the existing node + n.label = n.prefix[commonPrefix] + n.prefix = n.prefix[commonPrefix:] + child.addChild(n, n.prefix) + + // If the new key is a subset, set the method/handler on this node and finish. + search = search[commonPrefix:] + if len(search) == 0 { + child.setEndpoint(method, handler, pattern) + return child + } + + // Create a new edge for the node + subchild := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn := child.addChild(subchild, search) + hn.setEndpoint(method, handler, pattern) + return hn + } +} + +// addChild appends the new `child` node to the tree using the `pattern` as the trie key. +// For a URL router like chi's, we split the static, param, regexp and wildcard segments +// into different nodes. In addition, addChild will recursively call itself until every +// pattern segment is added to the url pattern tree as individual nodes, depending on type. +func (n *node) addChild(child *node, prefix string) *node { + search := prefix + + // handler leaf node added to the tree is the child. + // this may be overridden later down the flow + hn := child + + // Parse next segment + segTyp, _, segRexpat, segTail, segStartIdx, segEndIdx := patNextSegment(search) + + // Add child depending on next up segment + switch segTyp { + + case ntStatic: + // Search prefix is all static (that is, has no params in path) + // noop + + default: + // Search prefix contains a param, regexp or wildcard + + if segTyp == ntRegexp { + rex, err := regexp.Compile(segRexpat) + if err != nil { + panic(fmt.Sprintf("chi: invalid regexp pattern '%s' in route param", segRexpat)) + } + child.prefix = segRexpat + child.rex = rex + } + + if segStartIdx == 0 { + // Route starts with a param + child.typ = segTyp + + if segTyp == ntCatchAll { + segStartIdx = -1 + } else { + segStartIdx = segEndIdx + } + if segStartIdx < 0 { + segStartIdx = len(search) + } + child.tail = segTail // for params, we set the tail + + if segStartIdx != len(search) { + // add static edge for the remaining part, split the end. + // its not possible to have adjacent param nodes, so its certainly + // going to be a static node next. + + search = search[segStartIdx:] // advance search position + + nn := &node{ + typ: ntStatic, + label: search[0], + prefix: search, + } + hn = child.addChild(nn, search) + } + + } else if segStartIdx > 0 { + // Route has some param + + // starts with a static segment + child.typ = ntStatic + child.prefix = search[:segStartIdx] + child.rex = nil + + // add the param edge node + search = search[segStartIdx:] + + nn := &node{ + typ: segTyp, + label: search[0], + tail: segTail, + } + hn = child.addChild(nn, search) + + } + } + + n.children[child.typ] = append(n.children[child.typ], child) + n.children[child.typ].Sort() + return hn +} + +func (n *node) replaceChild(label, tail byte, child *node) { + for i := 0; i < len(n.children[child.typ]); i++ { + if n.children[child.typ][i].label == label && n.children[child.typ][i].tail == tail { + n.children[child.typ][i] = child + n.children[child.typ][i].label = label + n.children[child.typ][i].tail = tail + return + } + } + panic("chi: replacing missing child") +} + +func (n *node) getEdge(ntyp nodeTyp, label, tail byte, prefix string) *node { + nds := n.children[ntyp] + for i := 0; i < len(nds); i++ { + if nds[i].label == label && nds[i].tail == tail { + if ntyp == ntRegexp && nds[i].prefix != prefix { + continue + } + return nds[i] + } + } + return nil +} + +func (n *node) setEndpoint(method methodTyp, handler http.Handler, pattern string) { + // Set the handler for the method type on the node + if n.endpoints == nil { + n.endpoints = make(endpoints) + } + + paramKeys := patParamKeys(pattern) + + if method&mSTUB == mSTUB { + n.endpoints.Value(mSTUB).handler = handler + } + if method&mALL == mALL { + h := n.endpoints.Value(mALL) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + for _, m := range methodMap { + h := n.endpoints.Value(m) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } + } else { + h := n.endpoints.Value(method) + h.handler = handler + h.pattern = pattern + h.paramKeys = paramKeys + } +} + +func (n *node) FindRoute(rctx *Context, method methodTyp, path string) (*node, endpoints, http.Handler) { + // Reset the context routing pattern and params + rctx.routePattern = "" + rctx.routeParams.Keys = rctx.routeParams.Keys[:0] + rctx.routeParams.Values = rctx.routeParams.Values[:0] + + // Find the routing handlers for the path + rn := n.findRoute(rctx, method, path) + if rn == nil { + return nil, nil, nil + } + + // Record the routing params in the request lifecycle + rctx.URLParams.Keys = append(rctx.URLParams.Keys, rctx.routeParams.Keys...) + rctx.URLParams.Values = append(rctx.URLParams.Values, rctx.routeParams.Values...) + + // Record the routing pattern in the request lifecycle + if rn.endpoints[method].pattern != "" { + rctx.routePattern = rn.endpoints[method].pattern + rctx.RoutePatterns = append(rctx.RoutePatterns, rctx.routePattern) + } + + return rn, rn.endpoints, rn.endpoints[method].handler +} + +// Recursive edge traversal by checking all nodeTyp groups along the way. +// It's like searching through a multi-dimensional radix trie. +func (n *node) findRoute(rctx *Context, method methodTyp, path string) *node { + nn := n + search := path + + for t, nds := range nn.children { + ntyp := nodeTyp(t) + if len(nds) == 0 { + continue + } + + var xn *node + xsearch := search + + var label byte + if search != "" { + label = search[0] + } + + switch ntyp { + case ntStatic: + xn = nds.findEdge(label) + if xn == nil || !strings.HasPrefix(xsearch, xn.prefix) { + continue + } + xsearch = xsearch[len(xn.prefix):] + + case ntParam, ntRegexp: + // short-circuit and return no matching route for empty param values + if xsearch == "" { + continue + } + + // serially loop through each node grouped by the tail delimiter + for idx := 0; idx < len(nds); idx++ { + xn = nds[idx] + + // label for param nodes is the delimiter byte + p := strings.IndexByte(xsearch, xn.tail) + + if p < 0 { + if xn.tail == '/' { + p = len(xsearch) + } else { + continue + } + } else if ntyp == ntRegexp && p == 0 { + continue + } + + if ntyp == ntRegexp && xn.rex != nil { + if !xn.rex.MatchString(xsearch[:p]) { + continue + } + } else if strings.IndexByte(xsearch[:p], '/') != -1 { + // avoid a match across path segments + continue + } + + prevlen := len(rctx.routeParams.Values) + rctx.routeParams.Values = append(rctx.routeParams.Values, xsearch[:p]) + xsearch = xsearch[p:] + + if len(xsearch) == 0 { + if xn.isLeaf() { + h := xn.endpoints[method] + if h != nil && h.handler != nil { + rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) + return xn + } + + for endpoints := range xn.endpoints { + if endpoints == mALL || endpoints == mSTUB { + continue + } + rctx.methodsAllowed = append(rctx.methodsAllowed, endpoints) + } + + // flag that the routing context found a route, but not a corresponding + // supported method + rctx.methodNotAllowed = true + } + } + + // recursively find the next node on this branch + fin := xn.findRoute(rctx, method, xsearch) + if fin != nil { + return fin + } + + // not found on this branch, reset vars + rctx.routeParams.Values = rctx.routeParams.Values[:prevlen] + xsearch = search + } + + rctx.routeParams.Values = append(rctx.routeParams.Values, "") + + default: + // catch-all nodes + rctx.routeParams.Values = append(rctx.routeParams.Values, search) + xn = nds[0] + xsearch = "" + } + + if xn == nil { + continue + } + + // did we find it yet? + if len(xsearch) == 0 { + if xn.isLeaf() { + h := xn.endpoints[method] + if h != nil && h.handler != nil { + rctx.routeParams.Keys = append(rctx.routeParams.Keys, h.paramKeys...) + return xn + } + + for endpoints := range xn.endpoints { + if endpoints == mALL || endpoints == mSTUB { + continue + } + rctx.methodsAllowed = append(rctx.methodsAllowed, endpoints) + } + + // flag that the routing context found a route, but not a corresponding + // supported method + rctx.methodNotAllowed = true + } + } + + // recursively find the next node.. + fin := xn.findRoute(rctx, method, xsearch) + if fin != nil { + return fin + } + + // Did not find final handler, let's remove the param here if it was set + if xn.typ > ntStatic { + if len(rctx.routeParams.Values) > 0 { + rctx.routeParams.Values = rctx.routeParams.Values[:len(rctx.routeParams.Values)-1] + } + } + + } + + return nil +} + +func (n *node) findEdge(ntyp nodeTyp, label byte) *node { + nds := n.children[ntyp] + num := len(nds) + idx := 0 + + switch ntyp { + case ntStatic, ntParam, ntRegexp: + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > nds[idx].label { + i = idx + 1 + } else if label < nds[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if nds[idx].label != label { + return nil + } + return nds[idx] + + default: // catch all + return nds[idx] + } +} + +func (n *node) isLeaf() bool { + return n.endpoints != nil +} + +func (n *node) findPattern(pattern string) bool { + nn := n + for _, nds := range nn.children { + if len(nds) == 0 { + continue + } + + n = nn.findEdge(nds[0].typ, pattern[0]) + if n == nil { + continue + } + + var idx int + var xpattern string + + switch n.typ { + case ntStatic: + idx = longestPrefix(pattern, n.prefix) + if idx < len(n.prefix) { + continue + } + + case ntParam, ntRegexp: + idx = strings.IndexByte(pattern, '}') + 1 + + case ntCatchAll: + idx = longestPrefix(pattern, "*") + + default: + panic("chi: unknown node type") + } + + xpattern = pattern[idx:] + if len(xpattern) == 0 { + return true + } + + return n.findPattern(xpattern) + } + return false +} + +func (n *node) routes() []Route { + rts := []Route{} + + n.walk(func(eps endpoints, subroutes Routes) bool { + if eps[mSTUB] != nil && eps[mSTUB].handler != nil && subroutes == nil { + return false + } + + // Group methodHandlers by unique patterns + pats := make(map[string]endpoints) + + for mt, h := range eps { + if h.pattern == "" { + continue + } + p, ok := pats[h.pattern] + if !ok { + p = endpoints{} + pats[h.pattern] = p + } + p[mt] = h + } + + for p, mh := range pats { + hs := make(map[string]http.Handler) + if mh[mALL] != nil && mh[mALL].handler != nil { + hs["*"] = mh[mALL].handler + } + + for mt, h := range mh { + if h.handler == nil { + continue + } + m := methodTypString(mt) + if m == "" { + continue + } + hs[m] = h.handler + } + + rt := Route{subroutes, hs, p} + rts = append(rts, rt) + } + + return false + }) + + return rts +} + +func (n *node) walk(fn func(eps endpoints, subroutes Routes) bool) bool { + // Visit the leaf values if any + if (n.endpoints != nil || n.subroutes != nil) && fn(n.endpoints, n.subroutes) { + return true + } + + // Recurse on the children + for _, ns := range n.children { + for _, cn := range ns { + if cn.walk(fn) { + return true + } + } + } + return false +} + +// patNextSegment returns the next segment details from a pattern: +// node type, param key, regexp string, param tail byte, param starting index, param ending index +func patNextSegment(pattern string) (nodeTyp, string, string, byte, int, int) { + ps := strings.Index(pattern, "{") + ws := strings.Index(pattern, "*") + + if ps < 0 && ws < 0 { + return ntStatic, "", "", 0, 0, len(pattern) // we return the entire thing + } + + // Sanity check + if ps >= 0 && ws >= 0 && ws < ps { + panic("chi: wildcard '*' must be the last pattern in a route, otherwise use a '{param}'") + } + + var tail byte = '/' // Default endpoint tail to / byte + + if ps >= 0 { + // Param/Regexp pattern is next + nt := ntParam + + // Read to closing } taking into account opens and closes in curl count (cc) + cc := 0 + pe := ps + for i, c := range pattern[ps:] { + if c == '{' { + cc++ + } else if c == '}' { + cc-- + if cc == 0 { + pe = ps + i + break + } + } + } + if pe == ps { + panic("chi: route param closing delimiter '}' is missing") + } + + key := pattern[ps+1 : pe] + pe++ // set end to next position + + if pe < len(pattern) { + tail = pattern[pe] + } + + var rexpat string + if idx := strings.Index(key, ":"); idx >= 0 { + nt = ntRegexp + rexpat = key[idx+1:] + key = key[:idx] + } + + if len(rexpat) > 0 { + if rexpat[0] != '^' { + rexpat = "^" + rexpat + } + if rexpat[len(rexpat)-1] != '$' { + rexpat += "$" + } + } + + return nt, key, rexpat, tail, ps, pe + } + + // Wildcard pattern as finale + if ws < len(pattern)-1 { + panic("chi: wildcard '*' must be the last value in a route. trim trailing text or use a '{param}' instead") + } + return ntCatchAll, "*", "", 0, ws, len(pattern) +} + +func patParamKeys(pattern string) []string { + pat := pattern + paramKeys := []string{} + for { + ptyp, paramKey, _, _, _, e := patNextSegment(pat) + if ptyp == ntStatic { + return paramKeys + } + for i := 0; i < len(paramKeys); i++ { + if paramKeys[i] == paramKey { + panic(fmt.Sprintf("chi: routing pattern '%s' contains duplicate param key, '%s'", pattern, paramKey)) + } + } + paramKeys = append(paramKeys, paramKey) + pat = pat[e:] + } +} + +// longestPrefix finds the length of the shared prefix +// of two strings +func longestPrefix(k1, k2 string) int { + max := len(k1) + if l := len(k2); l < max { + max = l + } + var i int + for i = 0; i < max; i++ { + if k1[i] != k2[i] { + break + } + } + return i +} + +func methodTypString(method methodTyp) string { + for s, t := range methodMap { + if method == t { + return s + } + } + return "" +} + +type nodes []*node + +// Sort the list of nodes by label +func (ns nodes) Sort() { sort.Sort(ns); ns.tailSort() } +func (ns nodes) Len() int { return len(ns) } +func (ns nodes) Swap(i, j int) { ns[i], ns[j] = ns[j], ns[i] } +func (ns nodes) Less(i, j int) bool { return ns[i].label < ns[j].label } + +// tailSort pushes nodes with '/' as the tail to the end of the list for param nodes. +// The list order determines the traversal order. +func (ns nodes) tailSort() { + for i := len(ns) - 1; i >= 0; i-- { + if ns[i].typ > ntStatic && ns[i].tail == '/' { + ns.Swap(i, len(ns)-1) + return + } + } +} + +func (ns nodes) findEdge(label byte) *node { + num := len(ns) + idx := 0 + i, j := 0, num-1 + for i <= j { + idx = i + (j-i)/2 + if label > ns[idx].label { + i = idx + 1 + } else if label < ns[idx].label { + j = idx - 1 + } else { + i = num // breaks cond + } + } + if ns[idx].label != label { + return nil + } + return ns[idx] +} + +// Route describes the details of a routing handler. +// Handlers map key is an HTTP method +type Route struct { + SubRoutes Routes + Handlers map[string]http.Handler + Pattern string +} + +// WalkFunc is the type of the function called for each method and route visited by Walk. +type WalkFunc func(method string, route string, handler http.Handler, middlewares ...func(http.Handler) http.Handler) error + +// Walk walks any router tree that implements Routes interface. +func Walk(r Routes, walkFn WalkFunc) error { + return walk(r, walkFn, "") +} + +func walk(r Routes, walkFn WalkFunc, parentRoute string, parentMw ...func(http.Handler) http.Handler) error { + for _, route := range r.Routes() { + mws := make([]func(http.Handler) http.Handler, len(parentMw)) + copy(mws, parentMw) + mws = append(mws, r.Middlewares()...) + + if route.SubRoutes != nil { + if err := walk(route.SubRoutes, walkFn, parentRoute+route.Pattern, mws...); err != nil { + return err + } + continue + } + + for method, handler := range route.Handlers { + if method == "*" { + // Ignore a "catchAll" method, since we pass down all the specific methods for each route. + continue + } + + fullRoute := parentRoute + route.Pattern + fullRoute = strings.Replace(fullRoute, "/*/", "/", -1) + + if chain, ok := handler.(*ChainHandler); ok { + if err := walkFn(method, fullRoute, chain.Endpoint, append(mws, chain.Middlewares...)...); err != nil { + return err + } + } else { + if err := walkFn(method, fullRoute, handler, mws...); err != nil { + return err + } + } + } + } + + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index aaa62c2..25ef135 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -6,6 +6,10 @@ github.com/arl/statsviz/internal/static # github.com/fsnotify/fsnotify v1.7.0 ## explicit; go 1.17 github.com/fsnotify/fsnotify +# github.com/go-chi/chi/v5 v5.0.11 +## explicit; go 1.14 +github.com/go-chi/chi/v5 +github.com/go-chi/chi/v5/middleware # github.com/gorilla/websocket v1.5.1 ## explicit; go 1.20 github.com/gorilla/websocket