- var data []byte
- var gpgSigAttr string
- 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
+ for _, algo := range knownHashAlgos {
+ 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, "."+algo) {
+ continue
+ }
+ delete(files, fn)
+ digest, err := ioutil.ReadFile(filepath.Join(dirPath, fn))
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ fnClean := strings.TrimSuffix(fn, "."+algo)
+ delete(files, fnClean)
+ gpgSigAttr := ""
+ if _, err = os.Stat(filepath.Join(dirPath, fnClean+GPGSigExt)); err == nil {
+ gpgSigAttr = " data-gpg-sig=true"
+ delete(files, fnClean+GPGSigExt)
+ }
+ result.WriteString(fmt.Sprintf(
+ HTMLElement,
+ strings.Join([]string{
+ *refreshURLPath, dir, "/", fnClean,
+ "#", algo, "=", hex.EncodeToString(digest),
+ }, ""),
+ gpgSigAttr,
+ fnClean,
+ ))