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
|
Response
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewResponseCollector() *ResponseCollector {
|
||||||
|
return &ResponseCollector{
|
||||||
|
Response{Code: 200, Headers: make(map[string][]string)},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (rc *ResponseCollector) Header() http.Header {
|
func (rc *ResponseCollector) Header() http.Header {
|
||||||
return rc.Headers
|
return rc.Headers
|
||||||
}
|
}
|
||||||
|
@ -60,12 +66,14 @@ func Cache(h http.Handler) http.Handler {
|
||||||
if exists {
|
if exists {
|
||||||
entry.r.WriteResponse(rw)
|
entry.r.WriteResponse(rw)
|
||||||
} else {
|
} else {
|
||||||
rc := ResponseCollector{}
|
rc := NewResponseCollector()
|
||||||
// copy request in case they modify it
|
// copy request in case they modify it
|
||||||
req := *r
|
req := *r
|
||||||
h.ServeHTTP(&rc, &req)
|
h.ServeHTTP(rc, &req)
|
||||||
resp := rc.CollectResponse()
|
resp := rc.CollectResponse()
|
||||||
c[r.URL.String()] = cacheEntry{resp}
|
if resp.Code == 200 {
|
||||||
|
c[r.URL.String()] = cacheEntry{resp}
|
||||||
|
}
|
||||||
resp.WriteResponse(rw)
|
resp.WriteResponse(rw)
|
||||||
}
|
}
|
||||||
// TODO bookkeeping for the cache here
|
// 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")
|
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 DOMAIN_NAME = "threefortiethofonehamster.com"
|
||||||
|
|
||||||
const HTML_HEADER = `<!doctype html5>
|
const HTML_HEADER = `<!doctype html5>
|
||||||
|
@ -130,12 +129,16 @@ func main() {
|
||||||
daemon.AddCommand(daemon.StringFlag(signal, "reload"), syscall.SIGHUP, reloadHandler)
|
daemon.AddCommand(daemon.StringFlag(signal, "reload"), syscall.SIGHUP, reloadHandler)
|
||||||
|
|
||||||
execName := path.Base(os.Args[0])
|
execName := path.Base(os.Args[0])
|
||||||
|
cwd, cwdErr := os.Getwd()
|
||||||
|
if cwdErr != nil {
|
||||||
|
log.Fatalln("unable to get cwd:", cwdErr)
|
||||||
|
}
|
||||||
cntxt := &daemon.Context{
|
cntxt := &daemon.Context{
|
||||||
PidFileName: "/tmp/" + execName + "-pid",
|
PidFileName: "/tmp/" + execName + "-pid",
|
||||||
PidFilePerm: 0644,
|
PidFilePerm: 0644,
|
||||||
LogFileName: "/tmp/" + execName + "-log",
|
LogFileName: "/tmp/" + execName + "-log",
|
||||||
LogFilePerm: 0640,
|
LogFilePerm: 0640,
|
||||||
WorkDir: HOME_DIR + execName + "/",
|
WorkDir: cwd + "/",
|
||||||
Umask: 027,
|
Umask: 027,
|
||||||
}
|
}
|
||||||
if DEBUG {
|
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("/certbot/", http.StripPrefix("/certbot/", http.FileServer(http.Dir("./certbot-tmp"))))
|
||||||
serveMux.Handle("/gfm/", http.StripPrefix("/gfm", http.FileServer(gfmstyle.Assets)))
|
serveMux.Handle("/gfm/", http.StripPrefix("/gfm", http.FileServer(gfmstyle.Assets)))
|
||||||
serveMux.Handle("/resume/", http.StripPrefix("/resume", http.FileServer(http.Dir("resume/"))))
|
serveMux.Handle("/resume/", http.StripPrefix("/resume", http.FileServer(http.Dir("resume/"))))
|
||||||
/*
|
serveMux.Handle("/thumbnail/", Cache(Resize(1024, http.StripPrefix("/thumbnail", http.FileServer(http.Dir("static/"))))))
|
||||||
serveMux.HandleFunc("/thumbnail/", cache(func(w http.ResponseWriter, r *http.Request) {
|
|
||||||
// TODO get file prefix; must be png or jpeg
|
|
||||||
}))
|
|
||||||
*/
|
|
||||||
serveMux.HandleFunc("/main.css", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "main.css") })
|
serveMux.HandleFunc("/main.css", func(w http.ResponseWriter, r *http.Request) { http.ServeFile(w, r, "main.css") })
|
||||||
if webhookKey != nil {
|
if webhookKey != nil {
|
||||||
log.Print("web hook found")
|
log.Print("web hook found")
|
||||||
|
@ -302,7 +301,7 @@ func startServer(srv *http.Server) {
|
||||||
srv.Addr = ":8443"
|
srv.Addr = ":8443"
|
||||||
srv.Handler = Gzip(serveMux)
|
srv.Handler = Gzip(serveMux)
|
||||||
}
|
}
|
||||||
log.Print("starting server")
|
log.Print("starting server at " + srv.Addr)
|
||||||
if !DEBUG && !*devmode {
|
if !DEBUG && !*devmode {
|
||||||
log.Fatal(srv.ListenAndServeTLS("/etc/letsencrypt/live/"+DOMAIN_NAME+"/fullchain.pem",
|
log.Fatal(srv.ListenAndServeTLS("/etc/letsencrypt/live/"+DOMAIN_NAME+"/fullchain.pem",
|
||||||
"/etc/letsencrypt/live/"+DOMAIN_NAME+"/privkey.pem"))
|
"/etc/letsencrypt/live/"+DOMAIN_NAME+"/privkey.pem"))
|
||||||
|
|
20
resize.go
20
resize.go
|
@ -4,6 +4,7 @@ import (
|
||||||
"bytes"
|
"bytes"
|
||||||
"image/jpeg"
|
"image/jpeg"
|
||||||
"image/png"
|
"image/png"
|
||||||
|
"log"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
"github.com/nfnt/resize"
|
"github.com/nfnt/resize"
|
||||||
|
@ -11,9 +12,9 @@ import (
|
||||||
|
|
||||||
func Resize(maxWidth uint, h http.Handler) http.Handler {
|
func Resize(maxWidth uint, h http.Handler) http.Handler {
|
||||||
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
|
||||||
rc := ResponseCollector{}
|
rc := NewResponseCollector()
|
||||||
req := *r
|
req := *r
|
||||||
h.ServeHTTP(&rc, &req)
|
h.ServeHTTP(rc, &req)
|
||||||
imageResp := rc.CollectResponse()
|
imageResp := rc.CollectResponse()
|
||||||
|
|
||||||
if imageResp.Code != 200 {
|
if imageResp.Code != 200 {
|
||||||
|
@ -21,7 +22,7 @@ func Resize(maxWidth uint, h http.Handler) http.Handler {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
typ, hasType := imageResp.Headers["content-type"]
|
typ, hasType := imageResp.Headers["Content-Type"]
|
||||||
if !hasType || len(typ) == 0 {
|
if !hasType || len(typ) == 0 {
|
||||||
rw.WriteHeader(501)
|
rw.WriteHeader(501)
|
||||||
rw.Write([]byte("could not determine content type of image"))
|
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)
|
buf := bytes.NewBuffer(imageResp.Body)
|
||||||
|
log.Println("buf len: ", buf.Len())
|
||||||
switch typ[0] {
|
switch typ[0] {
|
||||||
case "image/png":
|
case "image/png":
|
||||||
image, err := png.Decode(buf)
|
image, err := png.Decode(buf)
|
||||||
|
@ -50,18 +52,20 @@ func Resize(maxWidth uint, h http.Handler) http.Handler {
|
||||||
image, err := jpeg.Decode(buf)
|
image, err := jpeg.Decode(buf)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
rw.WriteHeader(501)
|
rw.WriteHeader(501)
|
||||||
rw.Write([]byte("error while decoding png: " + err.Error()))
|
rw.Write([]byte("error while decoding jpeg: " + err.Error()))
|
||||||
return
|
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)
|
resizedBuf := new(bytes.Buffer)
|
||||||
jpegOptions := jpeg.Options{Quality: 75}
|
jpegOptions := jpeg.Options{Quality: 99}
|
||||||
if encodeErr := jpeg.Encode(resizedBuf, resizedImage, &jpegOptions); encodeErr != nil {
|
if encodeErr := jpeg.Encode(resizedBuf, resizedImage, &jpegOptions); encodeErr != nil {
|
||||||
rw.WriteHeader(501)
|
rw.WriteHeader(501)
|
||||||
rw.Write([]byte("error while encoding png: " + err.Error()))
|
rw.Write([]byte("error while encoding jpeg: " + err.Error()))
|
||||||
return
|
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())
|
rw.Write(resizedBuf.Bytes())
|
||||||
case "text/html":
|
case "text/html":
|
||||||
rw.WriteHeader(415)
|
rw.WriteHeader(415)
|
||||||
|
|
Loading…
Reference in New Issue