68 lines
1.1 KiB
Go
68 lines
1.1 KiB
Go
|
|
// backend/util.go
|
||
|
|
package main
|
||
|
|
|
||
|
|
import (
|
||
|
|
"encoding/json"
|
||
|
|
"log"
|
||
|
|
"net/http"
|
||
|
|
"os"
|
||
|
|
"strings"
|
||
|
|
)
|
||
|
|
|
||
|
|
func writeJSON(w http.ResponseWriter, v any) {
|
||
|
|
w.Header().Set("Content-Type", "application/json")
|
||
|
|
if err := json.NewEncoder(w).Encode(v); err != nil {
|
||
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func env(k, def string) string {
|
||
|
|
if v := os.Getenv(k); v != "" {
|
||
|
|
return v
|
||
|
|
}
|
||
|
|
return def
|
||
|
|
}
|
||
|
|
|
||
|
|
func must(err error, msg string) {
|
||
|
|
if err != nil {
|
||
|
|
log.Fatalf("%s: %v", msg, err)
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
func contains(ss []string, v string) bool {
|
||
|
|
for _, s := range ss {
|
||
|
|
if s == v {
|
||
|
|
return true
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return false
|
||
|
|
}
|
||
|
|
|
||
|
|
func sanitizeSegment(s string) string {
|
||
|
|
s = strings.TrimSpace(s)
|
||
|
|
s = strings.ReplaceAll(s, " ", "_")
|
||
|
|
s = strings.Trim(s, "/")
|
||
|
|
if i := strings.IndexByte(s, '/'); i >= 0 {
|
||
|
|
s = s[:i]
|
||
|
|
}
|
||
|
|
|
||
|
|
out := make([]rune, 0, len(s))
|
||
|
|
for _, r := range s {
|
||
|
|
switch {
|
||
|
|
case r >= 'a' && r <= 'z',
|
||
|
|
r >= 'A' && r <= 'Z',
|
||
|
|
r >= '0' && r <= '9',
|
||
|
|
r == '_',
|
||
|
|
r == '-',
|
||
|
|
r == '.':
|
||
|
|
out = append(out, r)
|
||
|
|
default:
|
||
|
|
out = append(out, '_')
|
||
|
|
}
|
||
|
|
}
|
||
|
|
if len(out) > 64 {
|
||
|
|
out = out[:64]
|
||
|
|
}
|
||
|
|
return string(out)
|
||
|
|
}
|