func iconHandler(w http.ResponseWriter, r *http.Request) { url := r.FormValue("url") if len(url) == 0 { writeAPIError(w, 400, errors.New("need url parameter"), true) return } size := r.FormValue("size") if size == "" { writeAPIError(w, 400, errors.New("need size parameter"), true) return } minSize, err := strconv.Atoi(size) if err != nil || minSize < 0 || minSize > 500 { writeAPIError(w, 400, errors.New("bad size parameter"), true) return } finder := besticon.IconFinder{} formats := r.FormValue("formats") if formats != "" { finder.FormatsAllowed = strings.Split(r.FormValue("formats"), ",") } err, _ = finder.FetchIcons(url) if err != nil { writeAPIError(w, 404, err, true) return } icon := finder.IconWithMinSize(minSize) if icon != nil { http.Redirect(w, r, icon.URL, 302) return } fallbackIconURL := r.FormValue("fallback_icon_url") if fallbackIconURL != "" { http.Redirect(w, r, fallbackIconURL, 302) return } iconColor := finder.MainColorForIcons() letter := lettericon.MainLetterFromURL(url) redirectPath := lettericon.IconPath(letter, size, iconColor) http.Redirect(w, r, redirectPath, 302) }