|
|
@ -16,6 +16,7 @@ import (
|
|
16
|
16
|
|
|
17
|
17
|
var port = flag.Int("p", 8080, "port [8080]")
|
|
18
|
18
|
var cacheSize = flag.Int("s", 10000, "cache size [10000]")
|
|
|
19
|
var debug = flag.Bool("debug", false, "Print out debug info")
|
|
19
|
20
|
|
|
20
|
21
|
var faviconCache *lru.Cache
|
|
21
|
22
|
var lock sync.RWMutex
|
|
|
@ -43,6 +44,7 @@ func HandleGetFavicon(w http.ResponseWriter, r *http.Request) {
|
|
43
|
44
|
url := r.URL.Query()["url"][0]
|
|
44
|
45
|
favicon, err := GetFaviconCached(url)
|
|
45
|
46
|
if err != nil {
|
|
|
47
|
fmt.Printf("Error: '%s': %s\n", url, err)
|
|
46
|
48
|
w.WriteHeader(http.StatusNotFound)
|
|
47
|
49
|
w.Write([]byte(fmt.Sprint(err)))
|
|
48
|
50
|
return
|
|
|
@ -87,17 +89,23 @@ func GetFavicon(url string) (string, error) {
|
|
87
|
89
|
if favicon, err := GetCanonicalFavicon(url); err == nil {
|
|
88
|
90
|
fmt.Println("found favicon.ico")
|
|
89
|
91
|
return favicon, nil
|
|
|
92
|
} else if *debug {
|
|
|
93
|
fmt.Printf("Error: getting /favicon.ico: %s\n", err)
|
|
90
|
94
|
}
|
|
91
|
95
|
|
|
92
|
96
|
resp, err := http.Get(url)
|
|
93
|
|
fmt.Println("get html", resp, err)
|
|
|
97
|
if *debug {
|
|
|
98
|
fmt.Println("get html", resp, err)
|
|
|
99
|
}
|
|
94
|
100
|
if err != nil {
|
|
95
|
101
|
return "", err
|
|
96
|
102
|
}
|
|
97
|
103
|
defer resp.Body.Close()
|
|
98
|
104
|
|
|
99
|
105
|
tree, err := html.Parse(resp.Body)
|
|
100
|
|
fmt.Println("parse html", tree, err)
|
|
|
106
|
if *debug {
|
|
|
107
|
fmt.Println("parse html", tree, err)
|
|
|
108
|
}
|
|
101
|
109
|
if err != nil {
|
|
102
|
110
|
return "", err
|
|
103
|
111
|
}
|
|
|
@ -124,7 +132,9 @@ func GetCanonicalFavicon(u string) (string, error) {
|
|
124
|
132
|
faviconUrl := fmt.Sprintf("%s://%s/favicon.ico", parsed.Scheme, parsed.Host)
|
|
125
|
133
|
|
|
126
|
134
|
resp, err := http.Get(faviconUrl)
|
|
127
|
|
fmt.Println("get favicon.ico", resp, err)
|
|
|
135
|
if *debug {
|
|
|
136
|
fmt.Println("get favicon.ico", resp, err)
|
|
|
137
|
}
|
|
128
|
138
|
if err != nil {
|
|
129
|
139
|
return "", err
|
|
130
|
140
|
}
|
|
|
@ -137,7 +147,9 @@ func GetCanonicalFavicon(u string) (string, error) {
|
|
137
|
147
|
if err != nil || n == 0 {
|
|
138
|
148
|
return "", errors.New("can't read /favicon.ico")
|
|
139
|
149
|
}
|
|
140
|
|
fmt.Println("favicon.ico", resp.Request.URL.String(), faviconUrl)
|
|
|
150
|
if *debug {
|
|
|
151
|
fmt.Println("favicon.ico", resp.Request.URL.String(), faviconUrl)
|
|
|
152
|
}
|
|
141
|
153
|
return resp.Request.URL.String(), nil
|
|
142
|
154
|
}
|
|
143
|
155
|
|