diff options
-rw-r--r-- | src/hub/src/spreadspace.org/sfive/s5srvWeb.go | 99 |
1 files changed, 50 insertions, 49 deletions
diff --git a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go index efe2ff4..d098626 100644 --- a/src/hub/src/spreadspace.org/sfive/s5srvWeb.go +++ b/src/hub/src/spreadspace.org/sfive/s5srvWeb.go @@ -34,8 +34,8 @@ package sfive import ( "encoding/json" - // "io" "fmt" + "io" "net" "net/http" "path" @@ -189,7 +189,7 @@ func webUpdateGet(srv *Server, id int, w http.ResponseWriter, r *http.Request) { // get list of updates (as json array) -type webUpdatesResponse struct { +type webUpdatesGetResponse struct { Updates []DataUpdateFull `json:"updates"` } @@ -199,7 +199,7 @@ func webUpdatesGet(srv *Server, w http.ResponseWriter, r *http.Request) { sendWebResponse(w, http.StatusBadRequest, webErrorResponse{err.Error()}) } - resp := webUpdatesResponse{} + resp := webUpdatesGetResponse{} if resp.Updates, err = srv.store.GetUpdatesAfter(after, limit); err != nil { sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()}) return @@ -234,58 +234,59 @@ func webUpdatesGetBulk(srv *Server, w http.ResponseWriter, r *http.Request) { // post one update +type webUpdatesPostResponse struct { + NumUpdates int `json:"num-updates"` +} + func webUpdatePost(srv *Server, w http.ResponseWriter, r *http.Request) { - // TODO: implement this! - - // decoder := NewStatelessDecoder(r.Body) - // data, err := decoder.Decode() - // if err != nil && err != io.EOF { - // s5l.Printf("web: failed to decode: %v\n", err) - // http.Error(w, fmt.Sprintf("failed to read/decode update message: %v", err), http.StatusBadRequest) - // return - // } - - // if err = srv.Append(data); err != nil { - // http.Error(w, fmt.Sprintf("failed to store data: %s", err), http.StatusInternalServerError) - // } else { - // fmt.Fprintf(w, "1 update successfully stored.") - // } - - sendWebResponse(w, http.StatusNotImplemented, webErrorResponse{"posting signle update data not yet implemented!"}) + decoder := NewStatelessDecoder(r.Body) + value, err := decoder.Decode() + if err != nil { + sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"error while decoding update: " + err.Error()}) + return + } + + if err = srv.Append(value); err != nil { + sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()}) + return + } + + sendWebResponse(w, http.StatusOK, webUpdatesPostResponse{1}) } // post multiple updates in bulk mode func webUpdatesPostBulk(srv *Server, w http.ResponseWriter, r *http.Request) { - // TODO: implement this! - - // decoder, err := NewStatefulDecoder(r.Body) - // if err != nil { - // http.Error(w, fmt.Sprintf("failed to read/decode init message: %v", err), http.StatusBadRequest) - // return - // } - - // data := []DataUpdateFull{} - // for { - // value, err := decoder.Decode() - // if err != nil { - // if err != io.EOF { - // http.Error(w, fmt.Sprintf("failed to read/decode update message: %v", err), http.StatusBadRequest) - // return - // } - // // TODO: check for temporary error? - // return - // } - // data = append(data, value) - // } - - // if err = srv.AppendMany(data); err != nil { - // http.Error(w, fmt.Sprintf("failed to store data: %s", err), http.StatusInternalServerError) - // } else { - // fmt.Fprintf(w, "%d update(s) successfully stored.", len(data)) - // } - - sendWebResponse(w, http.StatusNotImplemented, webErrorResponse{"posting bulk update data not yet implemented!"}) + decoder, err := NewStatefulDecoder(r.Body) + if err != nil && err != io.EOF { + sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"failed to read/decode init message: " + err.Error()}) + return + } + + values := []DataUpdateFull{} + for { + value, err := decoder.Decode() + if err != nil { + if err != io.EOF { + sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"failed to read/decode data message: " + err.Error()}) + return + } + break + } + values = append(values, value) + } + numValues := len(values) + if numValues < 1 { + sendWebResponse(w, http.StatusBadRequest, webErrorResponse{"got no data messages"}) + return + } + + if err = srv.AppendMany(values); err != nil { + sendWebResponse(w, http.StatusInternalServerError, webErrorResponse{err.Error()}) + return + } + + sendWebResponse(w, http.StatusOK, webUpdatesPostResponse{numValues}) } // |