|
|
|
|
@ -24,6 +24,7 @@ import ( |
|
|
|
|
|
|
|
|
|
"github.com/grafana/grafana/pkg/log" |
|
|
|
|
"github.com/grafana/grafana/pkg/setting" |
|
|
|
|
"gopkg.in/macaron.v1" |
|
|
|
|
) |
|
|
|
|
|
|
|
|
|
var gravatarSource string |
|
|
|
|
@ -89,12 +90,12 @@ func (this *Avatar) Update() (err error) { |
|
|
|
|
return err |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
type service struct { |
|
|
|
|
type CacheServer struct { |
|
|
|
|
notFound *Avatar |
|
|
|
|
cache map[string]*Avatar |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (this *service) mustInt(r *http.Request, defaultValue int, keys ...string) (v int) { |
|
|
|
|
func (this *CacheServer) mustInt(r *http.Request, defaultValue int, keys ...string) (v int) { |
|
|
|
|
for _, k := range keys { |
|
|
|
|
if _, err := fmt.Sscanf(r.FormValue(k), "%d", &v); err == nil { |
|
|
|
|
defaultValue = v |
|
|
|
|
@ -103,8 +104,8 @@ func (this *service) mustInt(r *http.Request, defaultValue int, keys ...string) |
|
|
|
|
return defaultValue |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (this *service) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
urlPath := r.URL.Path |
|
|
|
|
func (this *CacheServer) Handler(ctx *macaron.Context) { |
|
|
|
|
urlPath := ctx.Req.URL.Path |
|
|
|
|
hash := urlPath[strings.LastIndex(urlPath, "/")+1:] |
|
|
|
|
|
|
|
|
|
var avatar *Avatar |
|
|
|
|
@ -126,20 +127,24 @@ func (this *service) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
|
|
|
this.cache[hash] = avatar |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
w.Header().Set("Content-Type", "image/jpeg") |
|
|
|
|
w.Header().Set("Content-Length", strconv.Itoa(len(avatar.data.Bytes()))) |
|
|
|
|
w.Header().Set("Cache-Control", "private, max-age=3600") |
|
|
|
|
ctx.Resp.Header().Add("Content-Type", "image/jpeg") |
|
|
|
|
|
|
|
|
|
if err := avatar.Encode(w); err != nil { |
|
|
|
|
if !setting.EnableGzip { |
|
|
|
|
ctx.Resp.Header().Add("Content-Length", strconv.Itoa(len(avatar.data.Bytes()))) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
ctx.Resp.Header().Add("Cache-Control", "private, max-age=3600") |
|
|
|
|
|
|
|
|
|
if err := avatar.Encode(ctx.Resp); err != nil { |
|
|
|
|
log.Warn("avatar encode error: %v", err) |
|
|
|
|
w.WriteHeader(500) |
|
|
|
|
ctx.WriteHeader(500) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func CacheServer() http.Handler { |
|
|
|
|
func NewCacheServer() *CacheServer { |
|
|
|
|
UpdateGravatarSource() |
|
|
|
|
|
|
|
|
|
return &service{ |
|
|
|
|
return &CacheServer{ |
|
|
|
|
notFound: newNotFound(), |
|
|
|
|
cache: make(map[string]*Avatar), |
|
|
|
|
} |
|
|
|
|
|