- var filenameClean string
- for _, file := range files {
- if !strings.HasSuffix(file.Name(), SHA256Ext) {
- continue
- }
- if killed {
- // Skip expensive I/O when shutting down
- http.Error(w, "shutting down", http.StatusInternalServerError)
- return
- }
- data, err = ioutil.ReadFile(filepath.Join(dirPath, file.Name()))
- if err != nil {
- http.Error(w, err.Error(), http.StatusInternalServerError)
- return
+ var fnClean string
+ files := make(map[string]struct{}, len(fis)/2)
+ for _, fi := range fis {
+ files[fi.Name()] = struct{}{}
+ }
+ for _, algoExt := range []string{".sha256", ".sha512", ".md5"} {
+ for fn, _ := range files {
+ if killed {
+ // Skip expensive I/O when shutting down
+ http.Error(w, "shutting down", http.StatusInternalServerError)
+ return
+ }
+ if !strings.HasSuffix(fn, algoExt) {
+ continue
+ }
+ digest, err = ioutil.ReadFile(filepath.Join(dirPath, fn))
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ fnClean = strings.TrimSuffix(fn, algoExt)
+ if _, err = os.Stat(filepath.Join(dirPath, fnClean+GPGSigExt)); os.IsNotExist(err) {
+ gpgSigAttr = ""
+ } else {
+ gpgSigAttr = GPGSigAttr
+ }
+ result.WriteString(fmt.Sprintf(
+ HTMLElement,
+ strings.Join([]string{
+ *refreshURLPath, dir, "/", fnClean,
+ "#", algoExt[1:], "=", hex.EncodeToString(digest),
+ }, ""),
+ gpgSigAttr,
+ fnClean,
+ ))
+ for _, n := range []string{
+ fnClean,
+ fnClean + GPGSigExt,
+ fnClean + ".sha256",
+ fnClean + ".sha512",
+ fnClean + ".md5",
+ } {
+ delete(files, n)
+ }