|
|
@ -3,6 +3,14 @@ |
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
// for www.gravatar.com image cache
|
|
|
|
|
|
|
|
/* |
|
|
|
It is recommend to use this way |
|
|
|
|
|
|
|
cacheDir := "./cache" |
|
|
|
defaultImg := "./default.jpg" |
|
|
|
http.Handle("/avatar/", avatar.HttpHandler(cacheDir, defaultImg)) |
|
|
|
*/ |
|
|
|
package avatar |
|
|
|
|
|
|
|
import ( |
|
|
@ -14,7 +22,6 @@ import ( |
|
|
|
"image/jpeg" |
|
|
|
"image/png" |
|
|
|
"io" |
|
|
|
"log" |
|
|
|
"net/http" |
|
|
|
"net/url" |
|
|
|
"os" |
|
|
@ -23,6 +30,7 @@ import ( |
|
|
|
"sync" |
|
|
|
"time" |
|
|
|
|
|
|
|
"github.com/gogits/gogs/modules/log" |
|
|
|
"github.com/nfnt/resize" |
|
|
|
) |
|
|
|
|
|
|
@ -30,12 +38,6 @@ var ( |
|
|
|
gravatar = "http://www.gravatar.com/avatar" |
|
|
|
) |
|
|
|
|
|
|
|
func debug(a ...interface{}) { |
|
|
|
if true { |
|
|
|
log.Println(a...) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// hash email to md5 string
|
|
|
|
// keep this func in order to make this package indenpent
|
|
|
|
func HashEmail(email string) string { |
|
|
@ -125,7 +127,7 @@ func (this *Avatar) UpdateTimeout(timeout time.Duration) error { |
|
|
|
var err error |
|
|
|
select { |
|
|
|
case <-time.After(timeout): |
|
|
|
err = errors.New("get gravatar image timeout") |
|
|
|
err = fmt.Errorf("get gravatar image %s timeout", this.Hash) |
|
|
|
case err = <-thunder.GoFetch(gravatar+"/"+this.Hash+"?"+this.reqParams, |
|
|
|
this.imagePath): |
|
|
|
} |
|
|
@ -150,16 +152,14 @@ func (this *avatarHandler) mustInt(r *http.Request, defaultValue int, keys ...st |
|
|
|
func (this *avatarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
|
|
urlPath := r.URL.Path |
|
|
|
hash := urlPath[strings.LastIndex(urlPath, "/")+1:] |
|
|
|
//hash = HashEmail(hash)
|
|
|
|
size := this.mustInt(r, 80, "s", "size") // size = 80*80
|
|
|
|
size := this.mustInt(r, 80, "s", "size") // default size = 80*80
|
|
|
|
|
|
|
|
avatar := New(hash, this.cacheDir) |
|
|
|
avatar.AlterImage = this.altImage |
|
|
|
if avatar.Expired() { |
|
|
|
err := avatar.UpdateTimeout(time.Millisecond * 500) |
|
|
|
if err != nil { |
|
|
|
debug(err) |
|
|
|
//log.Trace("avatar update error: %v", err)
|
|
|
|
log.Trace("avatar update error: %v", err) |
|
|
|
} |
|
|
|
} |
|
|
|
if modtime, err := avatar.Modtime(); err == nil { |
|
|
@ -177,8 +177,7 @@ func (this *avatarHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { |
|
|
|
w.Header().Set("Content-Type", "image/jpeg") |
|
|
|
err := avatar.Encode(w, size) |
|
|
|
if err != nil { |
|
|
|
//log.Warn("avatar encode error: %v", err) // will panic when err != nil
|
|
|
|
debug(err) |
|
|
|
log.Warn("avatar encode error: %v", err) |
|
|
|
w.WriteHeader(500) |
|
|
|
} |
|
|
|
} |
|
|
@ -251,7 +250,6 @@ func (this *thunderTask) Fetch() { |
|
|
|
var client = &http.Client{} |
|
|
|
|
|
|
|
func (this *thunderTask) fetch() error { |
|
|
|
//log.Println("thunder, fetch", this.Url)
|
|
|
|
req, _ := http.NewRequest("GET", this.Url, nil) |
|
|
|
req.Header.Set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8") |
|
|
|
req.Header.Set("Accept-Encoding", "gzip,deflate,sdch") |
|
|
|