reprogl

Форк
0
/
gravatar.go 
87 строк · 1.7 Кб
1
package avatar
2

3
import (
4
	"errors"
5
	"fmt"
6
	"image"
7
	"log"
8
	"net/http"
9
	"runtime"
10
	"strings"
11
	"time"
12

13
	"xelbot.com/reprogl/container"
14
)
15

16
var (
17
	GravatarNotFound = errors.New("gravatar: not found")
18
	chanBuf          chan struct{}
19
)
20

21
func init() {
22
	chanBuf = make(chan struct{}, (runtime.NumCPU()/2)+1)
23
}
24

25
type MaybeGravatar interface {
26
	NeedToCheckGravatar() bool
27
	GetEmail() string
28
}
29

30
func tryGravatar(object MaybeGravatar, size int, logger *log.Logger) (image.Image, error) {
31
	if !object.NeedToCheckGravatar() {
32
		return nil, GravatarNotFound
33
	}
34

35
	hash := gravatarHash(object.GetEmail())
36
	request, err := http.NewRequest(
37
		http.MethodGet,
38
		fmt.Sprintf(
39
			"https://www.gravatar.com/avatar/%s?s=%d&d=404",
40
			hash,
41
			size,
42
		),
43
		nil)
44

45
	if err != nil {
46
		return nil, err
47
	}
48

49
	logger.Printf("[IMG] check gravatar hash %s on gravatar.com\n", hash)
50
	resp, err := sendRequest(request)
51
	if err != nil {
52
		return nil, err
53
	}
54

55
	if resp.StatusCode != http.StatusOK {
56
		return nil, GravatarNotFound
57
	}
58

59
	contentType, ok := resp.Header["Content-Type"]
60
	if !ok || !strings.HasPrefix(contentType[0], "image") {
61
		return nil, GravatarNotFound
62
	}
63

64
	defer resp.Body.Close()
65
	img, _, err := image.Decode(resp.Body)
66
	if err != nil {
67
		return nil, err
68
	}
69

70
	return img, nil
71
}
72

73
func gravatarHash(s string) string {
74
	return container.MD5(strings.ToLower(strings.TrimSpace(s)))
75
}
76

77
func sendRequest(req *http.Request) (*http.Response, error) {
78
	chanBuf <- struct{}{}
79
	defer func() { <-chanBuf }()
80

81
	req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11")
82
	client := http.Client{
83
		Timeout: 5 * time.Second,
84
	}
85

86
	return client.Do(req)
87
}
88

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.