func (server *isolatedFake) fakeCloudStorage(w http.ResponseWriter, r *http.Request) { defer r.Body.Close() if r.Header.Get("Content-Type") != "application/octet-stream" { w.WriteHeader(400) server.Fail(fmt.Errorf("invalid content type: %s", r.Header.Get("Content-Type"))) return } if r.Method != "PUT" { w.WriteHeader(405) server.Fail(fmt.Errorf("invalid method: %s", r.Method)) return } raw, err := ioutil.ReadAll(isolated.GetDecompressor(r.Body)) if err != nil { w.WriteHeader(500) server.Fail(err) return } digest := isolated.HexDigest(r.URL.Query().Get("digest")) if digest != isolated.HashBytes(raw) { w.WriteHeader(400) server.Fail(fmt.Errorf("invalid digest %#v", digest)) return } server.lock.Lock() defer server.lock.Unlock() server.staging[digest] = raw w.WriteHeader(200) }
func (server *isolatedFake) storeInline(r *http.Request) interface{} { data := &isolated.StorageRequest{} if err := json.NewDecoder(r.Body).Decode(data); err != nil { server.Fail(err) return map[string]string{"err": err.Error()} } prefix := "ticket:" if !strings.HasPrefix(data.UploadTicket, prefix) { err := fmt.Errorf("unexpected ticket %#v", data.UploadTicket) server.Fail(err) return map[string]string{"err": err.Error()} } digest := isolated.HexDigest(data.UploadTicket[len(prefix):]) if !digest.Validate() { err := fmt.Errorf("invalid digest %#v", digest) server.Fail(err) return map[string]string{"err": err.Error()} } raw, err := ioutil.ReadAll(isolated.GetDecompressor(bytes.NewBuffer(data.Content))) if err != nil { server.Fail(err) return map[string]string{"err": err.Error()} } if digest != isolated.HashBytes(raw) { err := fmt.Errorf("invalid digest %#v", digest) server.Fail(err) return map[string]string{"err": err.Error()} } server.lock.Lock() defer server.lock.Unlock() server.contents[digest] = raw return map[string]string{"ok": "true"} }