mirror of
https://github.com/acme-dns/acme-dns.git
synced 2026-02-25 12:55:35 -07:00
86 lines
1.6 KiB
Go
86 lines
1.6 KiB
Go
package examples
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
"path"
|
|
)
|
|
|
|
type (
|
|
fruitMap map[string]interface{}
|
|
)
|
|
|
|
// FruitsHandler creates http.Handler for the fruits server.
|
|
//
|
|
// Routes:
|
|
// GET /fruits get fruit list
|
|
// GET /fruits/{name} get fruit
|
|
// PUT /fruits/{name} add or update fruit
|
|
func FruitsHandler() http.Handler {
|
|
fruits := fruitMap{}
|
|
|
|
mux := http.NewServeMux()
|
|
|
|
mux.HandleFunc("/fruits", func(w http.ResponseWriter, r *http.Request) {
|
|
handleFruitList(fruits, w, r)
|
|
})
|
|
|
|
mux.HandleFunc("/fruits/", func(w http.ResponseWriter, r *http.Request) {
|
|
handleFruit(fruits, w, r)
|
|
})
|
|
|
|
return mux
|
|
}
|
|
|
|
func handleFruitList(fruits fruitMap, w http.ResponseWriter, r *http.Request) {
|
|
switch r.Method {
|
|
case "GET":
|
|
ret := []string{}
|
|
for k := range fruits {
|
|
ret = append(ret, k)
|
|
}
|
|
|
|
b, err := json.Marshal(ret)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write(b)
|
|
|
|
default:
|
|
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
}
|
|
}
|
|
|
|
func handleFruit(fruits fruitMap, w http.ResponseWriter, r *http.Request) {
|
|
_, name := path.Split(r.URL.Path)
|
|
|
|
switch r.Method {
|
|
case "GET":
|
|
if data, ok := fruits[name]; ok {
|
|
b, err := json.Marshal(data)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
w.Write(b)
|
|
} else {
|
|
w.WriteHeader(http.StatusNotFound)
|
|
}
|
|
|
|
case "PUT":
|
|
var data map[string]interface{}
|
|
if err := json.NewDecoder(r.Body).Decode(&data); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
fruits[name] = data
|
|
w.WriteHeader(http.StatusNoContent)
|
|
|
|
default:
|
|
w.WriteHeader(http.StatusMethodNotAllowed)
|
|
}
|
|
}
|