This commit is contained in:
Kelvin Ly 2019-11-20 08:55:17 -05:00
parent 726afe8498
commit 8345b868b7
3 changed files with 31 additions and 20 deletions

View File

@ -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

17
main.go
View File

@ -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 = `<!doctype html5>
@ -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"))

View File

@ -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)