Fix bugs and refactor response collector out into its own file TODO write tests for everything

This commit is contained in:
Kelvin Ly 2019-11-20 09:06:04 -05:00
parent 8345b868b7
commit c341321145
3 changed files with 53 additions and 48 deletions

View File

@ -4,50 +4,6 @@ import (
"net/http"
)
type Response struct {
Code int
Headers map[string][]string
Body []byte
}
func (r Response) WriteResponse(rw http.ResponseWriter) {
for k, vs := range r.Headers {
for _, v := range vs {
rw.Header().Add(k, v)
}
}
rw.WriteHeader(r.Code)
rw.Write(r.Body)
}
// implements ResponseWriter to collect HTTP responses
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
}
func (rc *ResponseCollector) Write(bs []byte) (int, error) {
rc.Body = append(rc.Body, bs...)
return len(bs), nil
}
func (rc *ResponseCollector) WriteHeader(code int) {
rc.Code = code
}
func (rc *ResponseCollector) CollectResponse() Response {
return rc.Response
}
type cacheEntry struct {
r Response
}
@ -66,10 +22,10 @@ func Cache(h http.Handler) http.Handler {
if exists {
entry.r.WriteResponse(rw)
} else {
rc := NewResponseCollector()
rc := ResponseCollector{}
// copy request in case they modify it
req := *r
h.ServeHTTP(rc, &req)
h.ServeHTTP(&rc, &req)
resp := rc.CollectResponse()
if resp.Code == 200 {
c[r.URL.String()] = cacheEntry{resp}

49
collector.go Normal file
View File

@ -0,0 +1,49 @@
package main
import (
"net/http"
)
type Response struct {
Code int
Headers map[string][]string
Body []byte
}
func (r Response) WriteResponse(rw http.ResponseWriter) {
for k, vs := range r.Headers {
for _, v := range vs {
rw.Header().Add(k, v)
}
}
rw.WriteHeader(r.Code)
rw.Write(r.Body)
}
// implements ResponseWriter to collect HTTP responses
type ResponseCollector struct {
Response
}
func (rc *ResponseCollector) Header() http.Header {
if rc.Headers == nil {
rc.Headers = make(map[string][]string)
}
return rc.Headers
}
func (rc *ResponseCollector) Write(bs []byte) (int, error) {
if rc.Code == 0 {
rc.Code = 200
}
rc.Body = append(rc.Body, bs...)
return len(bs), nil
}
func (rc *ResponseCollector) WriteHeader(code int) {
rc.Code = code
}
func (rc *ResponseCollector) CollectResponse() Response {
return rc.Response
}

View File

@ -12,9 +12,9 @@ import (
func Resize(maxWidth uint, h http.Handler) http.Handler {
return http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
rc := NewResponseCollector()
rc := ResponseCollector{}
req := *r
h.ServeHTTP(rc, &req)
h.ServeHTTP(&rc, &req)
imageResp := rc.CollectResponse()
if imageResp.Code != 200 {