From 8345b868b7d0b294022558f077978f9b11f32f91 Mon Sep 17 00:00:00 2001 From: Kelvin Ly Date: Wed, 20 Nov 2019 08:55:17 -0500 Subject: [PATCH] Fix bugs --- cache.go | 14 +++++++++++--- main.go | 17 ++++++++--------- resize.go | 20 ++++++++++++-------- 3 files changed, 31 insertions(+), 20 deletions(-) diff --git a/cache.go b/cache.go index 43ed1f4..c764c6d 100644 --- a/cache.go +++ b/cache.go @@ -25,6 +25,12 @@ type ResponseCollector struct { Response } +func NewResponseCollector() *ResponseCollector { + return &ResponseCollector{ + Response{Code: 200, Headers: make(map[string][]string)}, + } +} + func (rc *ResponseCollector) Header() http.Header { return rc.Headers } @@ -60,12 +66,14 @@ func Cache(h http.Handler) http.Handler { if exists { entry.r.WriteResponse(rw) } else { - rc := ResponseCollector{} + rc := NewResponseCollector() // copy request in case they modify it req := *r - h.ServeHTTP(&rc, &req) + h.ServeHTTP(rc, &req) resp := rc.CollectResponse() - c[r.URL.String()] = cacheEntry{resp} + if resp.Code == 200 { + c[r.URL.String()] = cacheEntry{resp} + } resp.WriteResponse(rw) } // TODO bookkeeping for the cache here diff --git a/main.go b/main.go index 910d855..d6c89ef 100644 --- a/main.go +++ b/main.go @@ -34,9 +34,8 @@ var ( devmode = flag.Bool("dev_mode", false, "whether this server should run in developer mode or not") ) -const DEBUG = false +const DEBUG = true -const HOME_DIR = "/home/kelvin/" const DOMAIN_NAME = "threefortiethofonehamster.com" const HTML_HEADER = ` @@ -130,12 +129,16 @@ func main() { daemon.AddCommand(daemon.StringFlag(signal, "reload"), syscall.SIGHUP, reloadHandler) execName := path.Base(os.Args[0]) + cwd, cwdErr := os.Getwd() + if cwdErr != nil { + log.Fatalln("unable to get cwd:", cwdErr) + } cntxt := &daemon.Context{ PidFileName: "/tmp/" + execName + "-pid", PidFilePerm: 0644, LogFileName: "/tmp/" + execName + "-log", LogFilePerm: 0640, - WorkDir: HOME_DIR + execName + "/", + WorkDir: cwd + "/", Umask: 027, } if DEBUG { @@ -237,11 +240,7 @@ func startServer(srv *http.Server) { //serveMux.Handle("/certbot/", http.StripPrefix("/certbot/", http.FileServer(http.Dir("./certbot-tmp")))) serveMux.Handle("/gfm/", http.StripPrefix("/gfm", http.FileServer(gfmstyle.Assets))) serveMux.Handle("/resume/", http.StripPrefix("/resume", http.FileServer(http.Dir("resume/")))) - /* - serveMux.HandleFunc("/thumbnail/", cache(func(w http.ResponseWriter, r *http.Request) { - // TODO get file prefix; must be png or jpeg - })) - */ + serveMux.Handle("/thumbnail/", Cache(Resize(1024, http.StripPrefix("/thumbnail", http.FileServer(http.Dir("static/")))))) serveMux.HandleFunc("/main.css", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "main.css") }) if webhookKey != nil { log.Print("web hook found") @@ -302,7 +301,7 @@ func startServer(srv *http.Server) { srv.Addr = ":8443" srv.Handler = Gzip(serveMux) } - log.Print("starting server") + log.Print("starting server at " + srv.Addr) if !DEBUG && !*devmode { log.Fatal(srv.ListenAndServeTLS("/etc/letsencrypt/live/"+DOMAIN_NAME+"/fullchain.pem", "/etc/letsencrypt/live/"+DOMAIN_NAME+"/privkey.pem")) diff --git a/resize.go b/resize.go index cb98ff6..baaab9a 100644 --- a/resize.go +++ b/resize.go @@ -4,6 +4,7 @@ import ( "bytes" "image/jpeg" "image/png" + "log" "net/http" "github.com/nfnt/resize" @@ -11,9 +12,9 @@ import ( func Resize(maxWidth uint, h http.Handler) http.Handler { return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) { - rc := ResponseCollector{} + rc := NewResponseCollector() req := *r - h.ServeHTTP(&rc, &req) + h.ServeHTTP(rc, &req) imageResp := rc.CollectResponse() if imageResp.Code != 200 { @@ -21,7 +22,7 @@ func Resize(maxWidth uint, h http.Handler) http.Handler { return } - typ, hasType := imageResp.Headers["content-type"] + typ, hasType := imageResp.Headers["Content-Type"] if !hasType || len(typ) == 0 { rw.WriteHeader(501) rw.Write([]byte("could not determine content type of image")) @@ -29,6 +30,7 @@ func Resize(maxWidth uint, h http.Handler) http.Handler { } buf := bytes.NewBuffer(imageResp.Body) + log.Println("buf len: ", buf.Len()) switch typ[0] { case "image/png": image, err := png.Decode(buf) @@ -50,18 +52,20 @@ func Resize(maxWidth uint, h http.Handler) http.Handler { image, err := jpeg.Decode(buf) if err != nil { rw.WriteHeader(501) - rw.Write([]byte("error while decoding png: " + err.Error())) + rw.Write([]byte("error while decoding jpeg: " + err.Error())) return } - resizedImage := resize.Thumbnail(maxWidth, 0, image, resize.Lanczos3) + log.Println("resizing ", r.URL.String(), "(", image.Bounds().Max.X, ") to ", maxWidth) + resizedImage := resize.Thumbnail(maxWidth, 100000, image, resize.Lanczos3) resizedBuf := new(bytes.Buffer) - jpegOptions := jpeg.Options{Quality: 75} + jpegOptions := jpeg.Options{Quality: 99} if encodeErr := jpeg.Encode(resizedBuf, resizedImage, &jpegOptions); encodeErr != nil { rw.WriteHeader(501) - rw.Write([]byte("error while encoding png: " + err.Error())) + rw.Write([]byte("error while encoding jpeg: " + err.Error())) return } - rw.Header().Add("Content-Type", "image/png") + rw.Header().Add("Content-Type", "image/jpeg") + log.Println("resized size: ", resizedBuf.Len()) rw.Write(resizedBuf.Bytes()) case "text/html": rw.WriteHeader(415)