diff --git a/swarm/api/api.go b/swarm/api/api.go index 0c8d9d1ea7..5197d7a4bd 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -384,11 +384,7 @@ func (self *Api) ResourceLookup(name string, period uint32, version uint32) (sto if err != nil { return nil, nil, err } - key, data, err := self.resource.GetContent(name) - if err != nil { - return nil, nil, err - } - return key, data, nil + return self.resource.GetContent(name) } func (self *Api) ResourceCreate(name string, frequency uint64) (err error) { diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go index 0b22b9d8da..c84d47dac4 100644 --- a/swarm/api/http/server.go +++ b/swarm/api/http/server.go @@ -378,19 +378,19 @@ func (s *Server) handleGetResource(w http.ResponseWriter, r *Request, name strin if err != nil { break } - updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version)) - case 1: - version, err = strconv.ParseUint(params[1], 10, 32) + period, err = strconv.ParseUint(params[0], 10, 32) if err != nil { break } + updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version)) + case 1: period, err = strconv.ParseUint(params[0], 10, 32) if err != nil { break } updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version)) default: - s.BadRequest(w, r, fmt.Sprintf("Invalid mutable resource request")) + s.BadRequest(w, r, "Invalid mutable resource request") return } if err != nil { @@ -463,14 +463,18 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *Request) { switch { case r.uri.Raw(): m := &api.Manifest{} - sz, _ := reader.Size(nil) - b := make([]byte, sz) - reader.Read(b) - err = json.Unmarshal(b, m) - if len(m.Entries) > 0 { - if m.Entries[0].ContentType == api.ResourceContentType { - s.handleGetResource(w, r, m.Entries[0].Path) - return + 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 diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index e75bd04bcf..73036de203 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -55,14 +55,14 @@ func TestBzzResource(t *testing.T) { resp, err := http.Post(url, "application/octet-stream", bytes.NewReader(databytes)) if err != nil { t.Fatal(err) + } else if resp.StatusCode != http.StatusOK { + t.Fatalf("err %s", resp.Status) } manifesthash, err := ioutil.ReadAll(resp.Body) if err != nil { t.Fatal(err) } - if resp.StatusCode != http.StatusOK { - t.Fatalf("err %s", resp.Status) - } + resp.Body.Close() // update 2 url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes) @@ -79,6 +79,8 @@ func TestBzzResource(t *testing.T) { 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 { @@ -86,12 +88,15 @@ func TestBzzResource(t *testing.T) { } 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) 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 { @@ -99,7 +104,7 @@ func TestBzzResource(t *testing.T) { } else if !bytes.Equal(data, b) { t.Fatalf("Expected body '%x', got '%x'", data, b) } - + resp.Body.Close() } func TestBzzGetPath(t *testing.T) { diff --git a/swarm/storage/resource.go b/swarm/storage/resource.go index 80251c841e..62e0dc5456 100644 --- a/swarm/storage/resource.go +++ b/swarm/storage/resource.go @@ -13,6 +13,7 @@ import ( "golang.org/x/net/idna" "github.com/ethereum/go-ethereum/common" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" ) @@ -60,7 +61,7 @@ type ResourceValidator interface { } type ethApi interface { - BlockNumber(context.Context) (big.Int, error) + HeaderByNumber(context.Context, *big.Int) (*types.Header, error) } // Mutable resource is an entity which allows updates to a resource @@ -124,7 +125,7 @@ type ethApi interface { // TODO: Include modtime in chunk data + signature type ResourceHandler struct { ChunkStore - ctx context.Context + ctx context.Context // base for new contexts passed to storage layer and ethapi, to ensure teardown when Close() is called cancelFunc func() validator ResourceValidator ethClient ethApi @@ -609,11 +610,13 @@ func (self *ResourceHandler) Close() { } func (self *ResourceHandler) GetBlock() (uint64, error) { - bigblocknumber, err := self.ethClient.BlockNumber(self.ctx) + ctx, cancel := context.WithCancel(self.ctx) + defer cancel() + blockheader, err := self.ethClient.HeaderByNumber(ctx, nil) if err != nil { return 0, err } - return bigblocknumber.Uint64(), nil + return blockheader.Number.Uint64(), nil } // Calculate the period index (aka major version number) from a given block number @@ -771,11 +774,7 @@ func getNextPeriod(start uint64, current uint64, frequency uint64) uint32 { } func ToSafeName(name string) (string, error) { - validname, err := idna.ToASCII(name) - if err != nil { - return "", err - } - return validname, nil + return idna.ToASCII(name) } // check that name identifiers contain valid bytes diff --git a/swarm/storage/resource_test.go b/swarm/storage/resource_test.go index dd96f0b3d7..e6a00d88f4 100644 --- a/swarm/storage/resource_test.go +++ b/swarm/storage/resource_test.go @@ -20,6 +20,7 @@ import ( "github.com/ethereum/go-ethereum/contracts/ens" "github.com/ethereum/go-ethereum/contracts/ens/contract" "github.com/ethereum/go-ethereum/core" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/crypto" "github.com/ethereum/go-ethereum/log" ) @@ -57,10 +58,12 @@ func (f *fakeBackend) Commit() { f.blocknumber++ } -func (f *fakeBackend) BlockNumber(context context.Context) (big.Int, error) { +func (f *fakeBackend) HeaderByNumber(context context.Context, bigblock *big.Int) (*types.Header, error) { f.blocknumber++ biggie := big.NewInt(f.blocknumber) - return *biggie, nil + return &types.Header{ + Number: biggie, + }, nil } // check that signature address matches update signer address diff --git a/swarm/testutil/http.go b/swarm/testutil/http.go index 4a6a68e43b..cf4b045c6d 100644 --- a/swarm/testutil/http.go +++ b/swarm/testutil/http.go @@ -25,6 +25,7 @@ import ( "strconv" "testing" + "github.com/ethereum/go-ethereum/core/types" "github.com/ethereum/go-ethereum/swarm/api" httpapi "github.com/ethereum/go-ethereum/swarm/api/http" "github.com/ethereum/go-ethereum/swarm/storage" @@ -34,10 +35,12 @@ type fakeBackend struct { blocknumber int64 } -func (f *fakeBackend) BlockNumber(ctx context.Context) (big.Int, error) { +func (f *fakeBackend) HeaderByNumber(context context.Context, bigblock *big.Int) (*types.Header, error) { f.blocknumber++ biggie := big.NewInt(f.blocknumber) - return *biggie, nil + return &types.Header{ + Number: biggie, + }, nil } func NewTestSwarmServer(t *testing.T) *TestSwarmServer {