forked from security/hakurei
60 lines
1.4 KiB
Go
60 lines
1.4 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"net/http"
|
|
"path"
|
|
"strconv"
|
|
"strings"
|
|
|
|
"hakurei.app/internal/rosa"
|
|
)
|
|
|
|
func serveCount(index *PackageIndex) func(http.ResponseWriter, *http.Request) {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
|
count := len(index.names)
|
|
w.Write([]byte(strconv.Itoa(count)))
|
|
}
|
|
}
|
|
|
|
func serveStatus(index *PackageIndex) func(w http.ResponseWriter, r *http.Request) {
|
|
return func(w http.ResponseWriter, r *http.Request) {
|
|
if index == nil {
|
|
http.Error(w, "index is nil", http.StatusInternalServerError)
|
|
return
|
|
}
|
|
base := path.Base(r.URL.Path)
|
|
name := strings.TrimSuffix(base, ".log")
|
|
p, ok := rosa.ResolveName(name)
|
|
if !ok {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
m := rosa.GetMetadata(p)
|
|
pk, ok := index.names[m.Name]
|
|
if !ok {
|
|
http.NotFound(w, r)
|
|
return
|
|
}
|
|
if len(pk.status) > 0 {
|
|
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
|
|
w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
|
|
w.WriteHeader(http.StatusOK)
|
|
_, err := io.Copy(w, bytes.NewReader(pk.status))
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
}
|
|
} else {
|
|
http.NotFound(w, r)
|
|
}
|
|
}
|
|
}
|
|
|
|
func apiRoutes(index *PackageIndex) {
|
|
http.HandleFunc("GET /api/count", serveCount(index))
|
|
http.HandleFunc("GET /api/status/", serveStatus(index))
|
|
}
|