func handleRootPost(w http.ResponseWriter, req *http.Request, ps URLParams, cs chunks.ChunkStore) { d.PanicIfTrue(req.Method != "POST", "Expected post method.") params := req.URL.Query() tokens := params["last"] d.PanicIfTrue(len(tokens) != 1, `Expected "last" query param value`) last := hash.Parse(tokens[0]) tokens = params["current"] d.PanicIfTrue(len(tokens) != 1, `Expected "current" query param value`) current := hash.Parse(tokens[0]) // Ensure that proposed new Root is present in cs c := cs.Get(current) d.PanicIfTrue(c.IsEmpty(), "Can't set Root to a non-present Chunk") // Ensure that proposed new Root is a Map and, if it has anything in it, that it's <String, <RefCommit>> v := types.DecodeValue(c, nil) d.PanicIfTrue(v.Type().Kind() != types.MapKind, "Root of a Database must be a Map") m := v.(types.Map) if !m.Empty() && !isMapOfStringToRefOfCommit(m) { panic(d.Wrap(fmt.Errorf("Root of a Database must be a Map<String, Ref<Commit>>, not %s", m.Type().Describe()))) } if !cs.UpdateRoot(current, last) { w.WriteHeader(http.StatusConflict) return } }
func HandleGetRefs(w http.ResponseWriter, req *http.Request, ps URLParams, cs chunks.ChunkStore) { err := d.Try(func() { d.Exp.Equal("POST", req.Method) hashes := extractHashes(req) w.Header().Add("Content-Type", "application/octet-stream") writer := respWriter(req, w) defer writer.Close() sz := chunks.NewSerializer(writer) for _, h := range hashes { c := cs.Get(h) if !c.IsEmpty() { sz.Put(c) } } sz.Close() }) if err != nil { http.Error(w, fmt.Sprintf("Error: %v", err), http.StatusBadRequest) return } }
func handleGetRefs(w http.ResponseWriter, req *http.Request, ps URLParams, cs chunks.ChunkStore) { d.PanicIfTrue(req.Method != "POST", "Expected post method.") hashes := extractHashes(req) w.Header().Add("Content-Type", "application/octet-stream") writer := respWriter(req, w) defer writer.Close() for _, h := range hashes { c := cs.Get(h) if !c.IsEmpty() { chunks.Serialize(c, writer) } } }