diff --git a/swarm/api/api.go b/swarm/api/api.go index 5197d7a4bd..7abe5295c1 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -387,9 +387,10 @@ func (self *Api) ResourceLookup(name string, period uint32, version uint32) (sto return self.resource.GetContent(name) } -func (self *Api) ResourceCreate(name string, frequency uint64) (err error) { - _, err = self.resource.NewResource(name, frequency) - return err +func (self *Api) ResourceCreate(name string, frequency uint64) (storage.Key, error) { + rsrc, err := self.resource.NewResource(name, frequency) + h := rsrc.NameHash() + return storage.Key(h[:]), err } func (self *Api) ResourceUpdate(name string, data []byte) (storage.Key, uint32, uint32, error) { diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index c84d47dac4..db81d89c59 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -299,36 +299,12 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *Request) { s.BadRequest(w, r, fmt.Sprintf("Cannot parse frequency parameter: %v", err)) return } - err = s.api.ResourceCreate(r.uri.Addr, frequency) + key, err := s.api.ResourceCreate(r.uri.Addr, frequency) if err != nil { s.Error(w, r, fmt.Errorf("Resource creation failed: %v", err)) return } - manifestKey, err := s.api.NewManifest() - if err != nil { - s.Error(w, r, fmt.Errorf("create manifest err: %v", err)) - return - } - newKey, err := s.updateManifest(manifestKey, func(mw *api.ManifestWriter) error { - key, err := mw.AddEntry(bytes.NewReader([]byte(r.uri.Addr)), &api.ManifestEntry{ - Path: r.uri.Addr, - ContentType: api.ResourceContentType, - Mode: 0644, - Size: int64(len(r.uri.Addr)), - ModTime: time.Now(), - }) - if err != nil { - return err - } - s.logDebug("resource manifest for for %s stored", key.Log()) - return nil - }) - if err != nil { - s.Error(w, r, fmt.Errorf("update manifest err: %v", err)) - return - } - log.Debug("manifests", "new", newKey, "old", manifestKey) - outdata = fmt.Sprintf("%s", newKey) + outdata = key.Hex() } data, err := ioutil.ReadAll(r.Body) @@ -338,15 +314,17 @@ func (s *Server) HandlePostResource(w http.ResponseWriter, r *Request) { } _, _, _, err = s.api.ResourceUpdate(r.uri.Addr, data) if err != nil { - w.WriteHeader(http.StatusUnauthorized) + s.Error(w, r, fmt.Errorf("Update resource failed: %v", err)) return } - w.WriteHeader(http.StatusOK) if outdata != "" { - w.Header().Set("Content-type", "text/plain") - fmt.Fprintf(w, outdata) + w.Header().Add("Content-type", "text/plain") + w.WriteHeader(http.StatusOK) + fmt.Fprint(w, outdata) + return } + w.WriteHeader(http.StatusOK) } // Retrieve mutable resource updates: @@ -462,21 +440,6 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *Request) { switch { case r.uri.Raw(): - m := &api.Manifest{} - sz, err := reader.Size(nil) - if err == nil { - b := make([]byte, sz) - reader.Read(b) - err = json.Unmarshal(b, m) - if err == nil { - if len(m.Entries) > 0 { - if m.Entries[0].ContentType == api.ResourceContentType { - s.handleGetResource(w, r, m.Entries[0].Path) - return - } - } - } - } // allow the request to overwrite the content type using a query // parameter contentType := "application/octet-stream" diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 664e56ca42..1a01108977 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -48,6 +48,9 @@ func TestBzzResource(t *testing.T) { // our mutable resource "name" keybytes := make([]byte, common.HashLength) copy(keybytes, []byte{42}) + srv.Hasher.Reset() + srv.Hasher.Write([]byte(fmt.Sprintf("%x", keybytes))) + keybyteshash := fmt.Sprintf("%x", srv.Hasher.Sum(nil)) // data of update 1 databytes := make([]byte, 666) @@ -64,9 +67,11 @@ func TestBzzResource(t *testing.T) { } else if resp.StatusCode != http.StatusOK { t.Fatalf("err %s", resp.Status) } - manifesthash, err := ioutil.ReadAll(resp.Body) + b, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fatal(err) + } else if !bytes.Equal(b, []byte(keybyteshash)) { + t.Fatalf("resource update hash mismatch, expected '%s' got '%s'", keybyteshash, b) } resp.Body.Close() @@ -78,7 +83,7 @@ func TestBzzResource(t *testing.T) { } else if resp.StatusCode != http.StatusOK { t.Fatalf("err %s", resp.Status) } - b, err := ioutil.ReadAll(resp.Body) + b, err = ioutil.ReadAll(resp.Body) if err != nil { t.Fatal(err) } else if !bytes.Equal(databytes, b) { @@ -96,22 +101,6 @@ func TestBzzResource(t *testing.T) { t.Fatalf("Update returned %d", resp.Status) } - // get latest update (1.2) through swarm manifest - url = fmt.Sprintf("%s/bzz-raw:/%s", srv.URL, manifesthash) - resp, err = http.Get(url) - if err != nil { - t.Fatal(err) - } else if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } - b, err = ioutil.ReadAll(resp.Body) - if err != nil { - t.Fatal(err) - } else if !bytes.Equal(data, b) { - t.Fatalf("Expected body '%x', got '%x'", data, b) - } - resp.Body.Close() - // get latest update (1.2) through resource directly url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes) resp, err = http.Get(url) diff --git a/swarm/storage/resource.go b/swarm/storage/resource.go index 2ec3e5327c..39b4fafa6f 100644 --- a/swarm/storage/resource.go +++ b/swarm/storage/resource.go @@ -52,6 +52,10 @@ func (self *resource) isSynced() bool { return !self.updated.IsZero() } +func (self *resource) NameHash() common.Hash { + return self.nameHash +} + // Implement to activate validation of resource updates // Specifically signing data and verification of signatures type ResourceValidator interface { @@ -178,7 +182,9 @@ func NewResourceHandler(datadir string, cloudStore CloudStore, ethClient ethApi, defer rh.hashPool.Put(hasher) hasher.Reset() hasher.Write([]byte(name)) - return common.BytesToHash(hasher.Sum(nil)) + hashval := common.BytesToHash(hasher.Sum(nil)) + log.Debug("generic namehasher", "name", name, "hash", hashval) + return hashval } } diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index afbd5d6103..77e3386fd2 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -82,7 +82,7 @@ func NewTestSwarmServer(t *testing.T) *TestSwarmServer { Server: srv, Dpa: dpa, dir: dir, - hasher: storage.MakeHashFunc(storage.SHA3Hash)(), + Hasher: storage.MakeHashFunc(storage.SHA3Hash)(), cleanup: func() { srv.Close() rh.Close() @@ -95,7 +95,7 @@ func NewTestSwarmServer(t *testing.T) *TestSwarmServer { type TestSwarmServer struct { *httptest.Server - hasher storage.SwarmHash + Hasher storage.SwarmHash Dpa *storage.DPA dir string cleanup func()