Fix bugs
This commit is contained in:
parent
726afe8498
commit
8345b868b7
14
cache.go
14
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
|
||||
|
|
17
main.go
17
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 = `<!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"))
|
||||
|
|
20
resize.go
20
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)
|
||||
|
|
Loading…
Reference in New Issue