func DeleteHandler(w http.ResponseWriter, r *http.Request) { n := new(storage.Needle) vid, fid, _ := parseURLPath(r.URL.Path) volumeId, _ := storage.NewVolumeId(vid) n.ParsePath(fid) debug("deleting", n) cookie := n.Cookie count, ok := store.Read(volumeId, n) if ok != nil { m := make(map[string]uint32) m["size"] = 0 writeJson(w, r, m) return } if n.Cookie != cookie { log.Println("delete with unmaching cookie from ", r.RemoteAddr, "agent", r.UserAgent()) return } n.Size = 0 ret := store.Delete(volumeId, n) needToReplicate := !store.HasVolume(volumeId) if !needToReplicate && ret > 0 { needToReplicate = store.GetVolume(volumeId).NeedToReplicate() } if needToReplicate { //send to other replica locations if r.FormValue("type") != "standard" { if !distributedOperation(volumeId, func(location operation.Location) bool { return nil == operation.Delete("http://"+location.Url+r.URL.Path+"?type=standard") }) { ret = 0 } } } if ret != 0 { w.WriteHeader(http.StatusAccepted) } else { w.WriteHeader(http.StatusInternalServerError) } m := make(map[string]uint32) m["size"] = uint32(count) writeJson(w, r, m) }
func GetHandler(w http.ResponseWriter, r *http.Request) { n := new(storage.Needle) vid, fid, ext := parseURLPath(r.URL.Path) volumeId, err := storage.NewVolumeId(vid) if err != nil { debug("parsing error:", err, r.URL.Path) return } n.ParsePath(fid) debug("volume", volumeId, "reading", n) if !store.HasVolume(volumeId) { lookupResult, err := operation.Lookup(*masterNode, volumeId) debug("volume", volumeId, "found on", lookupResult, "error", err) if err == nil { http.Redirect(w, r, "http://"+lookupResult.Locations[0].PublicUrl+r.URL.Path, http.StatusMovedPermanently) } else { debug("lookup error:", err, r.URL.Path) w.WriteHeader(http.StatusNotFound) } return } cookie := n.Cookie count, e := store.Read(volumeId, n) debug("read bytes", count, "error", e) if e != nil || count <= 0 { debug("read error:", e, r.URL.Path) w.WriteHeader(http.StatusNotFound) return } if n.Cookie != cookie { log.Println("request with unmaching cookie from ", r.RemoteAddr, "agent", r.UserAgent()) w.WriteHeader(http.StatusNotFound) return } if ext != "" { mtype := mime.TypeByExtension(ext) w.Header().Set("Content-Type", mtype) if storage.IsGzippable(ext, mtype) { if strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { w.Header().Set("Content-Encoding", "gzip") } else { n.Data = storage.UnGzipData(n.Data) } } } w.Write(n.Data) }