From 9e458aa0bbea5da049666ace9a4655ba1c3540c4 Mon Sep 17 00:00:00 2001 From: Seednode Date: Wed, 10 Jan 2024 13:07:24 -0600 Subject: [PATCH] Move regex compilation to global variable --- cmd/files.go | 37 +++++++++++++++------------------ cmd/root.go | 5 +++-- cmd/sort.go | 14 ++++++------- cmd/uri.go | 2 +- cmd/web.go | 58 +++++++++++++++++----------------------------------- 5 files changed, 47 insertions(+), 69 deletions(-) diff --git a/cmd/files.go b/cmd/files.go index 8fa2cb5..a6689ee 100644 --- a/cmd/files.go +++ b/cmd/files.go @@ -24,10 +24,9 @@ import ( "seedno.de/seednode/roulette/types" ) -type regexes struct { - alphanumeric *regexp.Regexp - filename *regexp.Regexp -} +var ( + filename = regexp.MustCompile(`(.+?)([0-9]*)(\..+)`) +) type scanStats struct { filesMatched chan int @@ -79,14 +78,14 @@ func kill(path string, index *fileIndex) error { return nil } -func newFile(list []string, sortOrder string, regexes *regexes, formats types.Types) (string, error) { +func newFile(list []string, sortOrder string, formats types.Types) (string, error) { path, err := pickFile(list) if err != nil { return "", err } if sortOrder == "asc" || sortOrder == "desc" { - splitPath, err := split(path, regexes) + splitPath, err := split(path) if err != nil { return "", err } @@ -125,8 +124,8 @@ func newFile(list []string, sortOrder string, regexes *regexes, formats types.Ty return path, nil } -func nextFile(filePath, sortOrder string, regexes *regexes, formats types.Types) (string, error) { - splitPath, err := split(filePath, regexes) +func nextFile(filePath, sortOrder string, formats types.Types) (string, error) { + splitPath, err := split(filePath) if err != nil { return "", err } @@ -261,11 +260,13 @@ func walkPath(path string, fileChannel chan<- string, wg1 *sync.WaitGroup, stats var skipDir = false for _, node := range nodes { - if Ignore && !node.IsDir() && node.Name() == IgnoreFile { - skipDir = true - } + if !node.IsDir() { + files++ - files++ + if Ignore && node.Name() == IgnoreFile { + skipDir = true + } + } } var skipFiles = false @@ -301,15 +302,11 @@ func walkPath(path string, fileChannel chan<- string, wg1 *sync.WaitGroup, stats case !node.IsDir() && !skipFiles: path, err := normalizePath(fullPath) - if err != nil { + + switch { + case err != nil: errorChannel <- err - - stats.filesSkipped <- 1 - - return - } - - if formats.Validate(path) || Fallback { + case formats.Validate(path) || Fallback: fileChannel <- path stats.filesMatched <- 1 diff --git a/cmd/root.go b/cmd/root.go index d227ff6..f3192d6 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -6,6 +6,7 @@ package cmd import ( "fmt" + "log" "math" "os" "regexp" @@ -167,8 +168,6 @@ func init() { rootCmd.Flags().SetInterspersed(true) - rootCmd.MarkFlagsMutuallyExclusive("debug", "exit-on-error") - rootCmd.MarkFlagsOneRequired(RequiredArgs...) rootCmd.SetHelpCommand(&cobra.Command{ @@ -180,4 +179,6 @@ func init() { rootCmd.SilenceErrors = true rootCmd.Version = ReleaseVersion + + log.SetFlags(0) } diff --git a/cmd/sort.go b/cmd/sort.go index ab850f8..cd117b0 100644 --- a/cmd/sort.go +++ b/cmd/sort.go @@ -38,8 +38,8 @@ func (splitPath *splitPath) decrement() string { return fmt.Sprintf("%0*d", len(splitPath.number), asInt-1) } -func split(path string, regexes *regexes) (*splitPath, error) { - split := regexes.filename.FindAllStringSubmatch(path, -1) +func split(path string) (*splitPath, error) { + split := filename.FindAllStringSubmatch(path, -1) if len(split) < 1 || len(split[0]) < 3 { return &splitPath{}, nil @@ -54,8 +54,8 @@ func split(path string, regexes *regexes) (*splitPath, error) { return p, nil } -func getRange(path string, regexes *regexes, index *fileIndex) (string, string, error) { - splitPath, err := split(path, regexes) +func getRange(path string, index *fileIndex) (string, string, error) { + splitPath, err := split(path) if err != nil { return "", "", err } @@ -70,7 +70,7 @@ func getRange(path string, regexes *regexes, index *fileIndex) (string, string, Loop: for _, val := range list { - splitVal, err := split(val, regexes) + splitVal, err := split(val) if err != nil { return "", "", err } @@ -94,8 +94,8 @@ func pathUrlEscape(path string) string { return strings.Replace(path, `'`, `%27`, -1) } -func paginateSorted(path, first, last, queryParams string, regexes *regexes, formats types.Types) (string, error) { - split, err := split(path, regexes) +func paginateSorted(path, first, last, queryParams string, formats types.Types) (string, error) { + split, err := split(path) if err != nil { return "", err } diff --git a/cmd/uri.go b/cmd/uri.go index b3b07d3..6bb5280 100644 --- a/cmd/uri.go +++ b/cmd/uri.go @@ -21,7 +21,7 @@ func sortOrder(r *http.Request) string { return "" } -func splitQueryParams(query string, regexes *regexes) []string { +func splitQueryParams(query string) []string { results := []string{} if query == "" { diff --git a/cmd/web.go b/cmd/web.go index 72ffd08..4400318 100644 --- a/cmd/web.go +++ b/cmd/web.go @@ -6,16 +6,13 @@ package cmd import ( "bytes" - "context" "errors" "fmt" "io" - "log" "net" "net/http" "os" "path/filepath" - "regexp" "runtime" "strconv" "strings" @@ -171,7 +168,7 @@ func serveStaticFile(paths []string, index *fileIndex, errorChannel chan<- error } } -func serveRoot(paths []string, regexes *regexes, index *fileIndex, formats types.Types, errorChannel chan<- error) httprouter.Handle { +func serveRoot(paths []string, index *fileIndex, formats types.Types, errorChannel chan<- error) httprouter.Handle { return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { refererUri, err := stripQueryParams(refererToUri(r.Referer())) if err != nil { @@ -185,8 +182,8 @@ func serveRoot(paths []string, regexes *regexes, index *fileIndex, formats types strippedRefererUri := strings.TrimPrefix(refererUri, Prefix+mediaPrefix) filters := &filters{ - included: splitQueryParams(r.URL.Query().Get("include"), regexes), - excluded: splitQueryParams(r.URL.Query().Get("exclude"), regexes), + included: splitQueryParams(r.URL.Query().Get("include")), + excluded: splitQueryParams(r.URL.Query().Get("exclude")), } sortOrder := sortOrder(r) @@ -196,7 +193,7 @@ func serveRoot(paths []string, regexes *regexes, index *fileIndex, formats types var path string if refererUri != "" { - path, err = nextFile(strippedRefererUri, sortOrder, regexes, formats) + path, err = nextFile(strippedRefererUri, sortOrder, formats) if err != nil { errorChannel <- err @@ -220,7 +217,7 @@ func serveRoot(paths []string, regexes *regexes, index *fileIndex, formats types break loop } - path, err = newFile(list, sortOrder, regexes, formats) + path, err = newFile(list, sortOrder, formats) switch { case path == "": noFiles(w, r) @@ -251,13 +248,13 @@ func serveRoot(paths []string, regexes *regexes, index *fileIndex, formats types } } -func serveMedia(paths []string, regexes *regexes, index *fileIndex, formats types.Types, errorChannel chan<- error) httprouter.Handle { +func serveMedia(paths []string, index *fileIndex, formats types.Types, errorChannel chan<- error) httprouter.Handle { return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) { startTime := time.Now() filters := &filters{ - included: splitQueryParams(r.URL.Query().Get("include"), regexes), - excluded: splitQueryParams(r.URL.Query().Get("exclude"), regexes), + included: splitQueryParams(r.URL.Query().Get("include")), + excluded: splitQueryParams(r.URL.Query().Get("exclude")), } sortOrder := sortOrder(r) @@ -347,7 +344,7 @@ func serveMedia(paths []string, regexes *regexes, index *fileIndex, formats type var first, last string if Index && sortOrder != "" { - first, last, err = getRange(path, regexes, index) + first, last, err = getRange(path, index) if err != nil { errorChannel <- err @@ -358,7 +355,7 @@ func serveMedia(paths []string, regexes *regexes, index *fileIndex, formats type } if Index && !DisableButtons && sortOrder != "" { - paginate, err := paginateSorted(path, first, last, queryParams, regexes, formats) + paginate, err := paginateSorted(path, first, last, queryParams, formats) if err != nil { errorChannel <- err @@ -478,8 +475,6 @@ func redirectRoot() httprouter.Handle { } func ServePage(args []string) error { - log.SetFlags(0) - timeZone := os.Getenv("TZ") if timeZone != "" { var err error @@ -541,11 +536,6 @@ func ServePage(args []string) error { return ErrNoMediaFound } - regexes := ®exes{ - filename: regexp.MustCompile(`(.+?)([0-9]*)(\..+)`), - alphanumeric: regexp.MustCompile(`^[A-z0-9]*$`), - } - if !strings.HasSuffix(Prefix, "/") { Prefix = Prefix + "/" } @@ -573,30 +563,20 @@ func ServePage(args []string) error { go func() { for err := range errorChannel { - prefix := "ERROR" - switch { - case errors.Is(err, os.ErrNotExist) && Debug: - prefix = "DEBUG" - case errors.Is(err, os.ErrNotExist): + case ExitOnError: + fmt.Printf("%s | FATAL: %v\n", time.Now().Format(logDate), err) + case Debug && errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission): + fmt.Printf("%s | DEBUG: %v\n", time.Now().Format(logDate), err) + case errors.Is(err, os.ErrNotExist) || errors.Is(err, os.ErrPermission): continue - case errors.Is(err, os.ErrPermission) && Debug: - prefix = "DEBUG" - case errors.Is(err, os.ErrPermission): - continue - } - - fmt.Printf("%s | %s: %v\n", time.Now().Format(logDate), prefix, err) - - if ExitOnError { - fmt.Printf("%s | %s: Shutting down...\n", time.Now().Format(logDate), prefix) - - srv.Shutdown(context.Background()) + default: + fmt.Printf("%s | ERROR: %v\n", time.Now().Format(logDate), err) } } }() - registerHandler(mux, Prefix, serveRoot(paths, regexes, index, formats, errorChannel)) + registerHandler(mux, Prefix, serveRoot(paths, index, formats, errorChannel)) Prefix = strings.TrimSuffix(Prefix, "/") @@ -608,7 +588,7 @@ func ServePage(args []string) error { registerHandler(mux, Prefix+"/favicon.ico", serveFavicons(errorChannel)) - registerHandler(mux, Prefix+mediaPrefix+"/*media", serveMedia(paths, regexes, index, formats, errorChannel)) + registerHandler(mux, Prefix+mediaPrefix+"/*media", serveMedia(paths, index, formats, errorChannel)) registerHandler(mux, Prefix+sourcePrefix+"/*static", serveStaticFile(paths, index, errorChannel))