From 1c153a8e8ea709cfc89eda810c41b5d2c9fa8472 Mon Sep 17 00:00:00 2001 From: Přemysl Eric Janouch Date: Sat, 9 Dec 2023 05:37:40 +0100 Subject: Make some HTTP handlers work --- main.go | 51 ++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 44 insertions(+), 7 deletions(-) (limited to 'main.go') diff --git a/main.go b/main.go index 2a46b21..7d6d311 100644 --- a/main.go +++ b/main.go @@ -15,6 +15,7 @@ import ( "os" "os/exec" "path/filepath" + "regexp" "time" _ "github.com/mattn/go-sqlite3" @@ -87,6 +88,35 @@ func cmdInit(args []string) error { return nil } +var hashRE = regexp.MustCompile(`^/.*?/([0-9a-f]{40})$`) +var staticHandler http.Handler + +func handleRequest(w http.ResponseWriter, r *http.Request) { + if r.URL.Path != "/" { + staticHandler.ServeHTTP(w, r) + return + } + + // TODO: Return something. + http.NotFound(w, r) +} + +func handleImages(w http.ResponseWriter, r *http.Request) { + if m := hashRE.FindStringSubmatch(r.URL.Path); m == nil { + http.NotFound(w, r) + } else { + http.ServeFile(w, r, imagePath(m[1])) + } +} + +func handleThumbs(w http.ResponseWriter, r *http.Request) { + if m := hashRE.FindStringSubmatch(r.URL.Path); m == nil { + http.NotFound(w, r) + } else { + http.ServeFile(w, r, thumbPath(m[1])) + } +} + // cmdRun runs a web UI against GD on ADDRESS. func cmdRun(args []string) error { if len(args) != 2 { @@ -98,13 +128,10 @@ func cmdRun(args []string) error { address := args[1] - http.Handle("/", http.FileServer(http.Dir("public"))) - // TODO: These subdirectories should be indirect - // (skip the hash subpath, don't require the .webp suffix). - http.Handle("/images", - http.FileServer(http.Dir(filepath.Join(gd, "images")))) - http.Handle("/thumbs", - http.FileServer(http.Dir(filepath.Join(gd, "thumbs")))) + staticHandler = http.FileServer(http.Dir("public")) + http.HandleFunc("/", handleRequest) + http.HandleFunc("/images/", handleImages) + http.HandleFunc("/thumbs/", handleThumbs) host, port, err := net.SplitHostPort(address) if err != nil { @@ -258,6 +285,16 @@ func makeThumbnail(pathImage, pathThumb string) (int, int, error) { return 0, 0, err } + // Create a normalized thumbnail. Since we don't particularly need + // any complex processing, such as surrounding of metadata, + // simply push it through ImageMagick. + // + // - http://www.ericbrasseur.org/gamma.html + // - https://www.imagemagick.org/Usage/thumbnails/ + // - https://imagemagick.org/script/command-line-options.php#layers + // + // TODO: See if we can optimize resulting WebP animations. + // (Do -layers optimize* apply to this format at all?) cmd := exec.Command("convert", pathImage, "-coalesce", "-colorspace", "RGB", "-auto-orient", "-strip", "-resize", "256x128>", "-colorspace", "sRGB", "-format", "%w %h", "+write", "info:", pathThumb) -- cgit v1.2.3-70-g09d2