package main import ( "encoding/json" "net/http" ) type JsonHandler func(http.ResponseWriter, *http.Request) func (h JsonHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "application/json") h(w, req) } type JSONError struct { Reason string `json:"reason"` } type JSONMessage struct { Message string `json:"message"` } func apiInfo(w http.ResponseWriter, req *http.Request) { version := struct { Version string `json:"version"` Name string `json:"name"` Routes []string `json:"routes"` }{ Version: "0.1", Name: "itslog", Routes: []string{ "/api/v0/info/", "/api/v0/put/", }, } if err := json.NewEncoder(w).Encode(version); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } } func put(w http.ResponseWriter, req *http.Request) { if req.Method != "POST" { b, _ := json.Marshal(JSONError{"supported methods: POST"}) http.Error(w, string(b), http.StatusMethodNotAllowed) return } message := LogMessage{} if err := json.NewDecoder(req.Body).Decode(&message); err != nil { b, _ := json.Marshal(JSONError{err.Error()}) http.Error(w, string(b), http.StatusBadRequest) return } _, err := message.save() if err != nil { b, _ := json.Marshal(JSONError{err.Error()}) http.Error(w, string(b), http.StatusMethodNotAllowed) return } if err := json.NewEncoder(w).Encode(JSONMessage{"ok"}); err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) } }