diff options
| author | Paul Buetow <paul@buetow.org> | 2024-05-06 19:57:36 +0300 |
|---|---|---|
| committer | Paul Buetow <paul@buetow.org> | 2024-05-06 19:57:36 +0300 |
| commit | 8a9b9038dd46f296747699613a14cadbc2f9934c (patch) | |
| tree | 6a5593ed83713f0a60af59ad1b637bc5538b704b | |
| parent | 1383e8a198313341ad1734e65a91de6e56267fb4 (diff) | |
can get entry by path
| -rw-r--r-- | handlers.go | 19 | ||||
| -rw-r--r-- | health.go | 3 | ||||
| -rw-r--r-- | main.go | 15 |
3 files changed, 35 insertions, 2 deletions
diff --git a/handlers.go b/handlers.go index ed030eb..f293e9c 100644 --- a/handlers.go +++ b/handlers.go @@ -5,9 +5,13 @@ import ( "fmt" "io" "net/http" + "os" + "regexp" "time" ) +var getIDRe = regexp.MustCompile(`^/[0-9]{4}/[a-z0-9]{64}\.json$`) + func handleSubmit(w http.ResponseWriter, r *http.Request, dataDir string) error { if r.Method != "POST" { return fmt.Errorf("expexted POST request") @@ -55,3 +59,18 @@ func handleList(w http.ResponseWriter, r *http.Request, dataDir string) error { fmt.Fprint(w, string(jsonData)) return nil } + +func handleGet(w http.ResponseWriter, r *http.Request, dataDir string) error { + path := r.URL.Query().Get("path") + if !getIDRe.MatchString(path) { + return fmt.Errorf("invalid path %s", path) + } + + data, err := os.ReadFile(fmt.Sprintf("%s/%s", dataDir, path)) + if err != err { + return err + } + + fmt.Fprint(w, string(data)) + return nil +} @@ -2,6 +2,7 @@ package main import ( "fmt" + "log" "strings" "sync" ) @@ -51,6 +52,8 @@ func newHealthStatus() healthStatus { } func (hs healthStatus) set(s alertSeverity, what, text string) { + log.Println("setting health status for", what, "to", text, "with severity", s) + hs.mu.Lock() defer hs.mu.Unlock() @@ -13,13 +13,14 @@ func main() { health := newHealthStatus() http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + log.Println("Someone requested /health") fmt.Fprint(w, health.String()) }) http.HandleFunc("/submit", func(w http.ResponseWriter, r *http.Request) { + log.Println("Someone requested /submit") if err := handleSubmit(w, r, *dataDir); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) - log.Println(err) health.set(critical, "submitHandler", err.Error()) return } @@ -27,15 +28,25 @@ func main() { }) http.HandleFunc("/list", func(w http.ResponseWriter, r *http.Request) { + log.Println("Someone requested /list") if err := handleList(w, r, *dataDir); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) - log.Println(err) health.set(critical, "listHandler", err.Error()) return } health.clear("listHandler") }) + http.HandleFunc("/get", func(w http.ResponseWriter, r *http.Request) { + log.Println("Someone requested /get") + if err := handleGet(w, r, *dataDir); err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + health.set(critical, "getHandler", err.Error()) + return + } + health.clear("getHandler") + }) + log.Println("Server is starting on ", *listenAddr) if err := http.ListenAndServe(*listenAddr, nil); err != err { log.Fatal("Error starting server: ", err) |
