mirror of
https://github.com/ethereum/go-ethereum.git
synced 2026-08-17 09:23:48 +00:00
swarm: Amend comments from @lmars PR 204 second review, part I
This commit is contained in:
parent
400b7d6d1c
commit
0455925ebf
6 changed files with 44 additions and 34 deletions
|
|
@ -384,11 +384,7 @@ func (self *Api) ResourceLookup(name string, period uint32, version uint32) (sto
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, err
|
return nil, nil, err
|
||||||
}
|
}
|
||||||
key, data, err := self.resource.GetContent(name)
|
return self.resource.GetContent(name)
|
||||||
if err != nil {
|
|
||||||
return nil, nil, err
|
|
||||||
}
|
|
||||||
return key, data, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *Api) ResourceCreate(name string, frequency uint64) (err error) {
|
func (self *Api) ResourceCreate(name string, frequency uint64) (err error) {
|
||||||
|
|
|
||||||
|
|
@ -378,19 +378,19 @@ func (s *Server) handleGetResource(w http.ResponseWriter, r *Request, name strin
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version))
|
period, err = strconv.ParseUint(params[0], 10, 32)
|
||||||
case 1:
|
|
||||||
version, err = strconv.ParseUint(params[1], 10, 32)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version))
|
||||||
|
case 1:
|
||||||
period, err = strconv.ParseUint(params[0], 10, 32)
|
period, err = strconv.ParseUint(params[0], 10, 32)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version))
|
updateKey, data, err = s.api.ResourceLookup(name, uint32(period), uint32(version))
|
||||||
default:
|
default:
|
||||||
s.BadRequest(w, r, fmt.Sprintf("Invalid mutable resource request"))
|
s.BadRequest(w, r, "Invalid mutable resource request")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
@ -463,16 +463,20 @@ func (s *Server) HandleGet(w http.ResponseWriter, r *Request) {
|
||||||
switch {
|
switch {
|
||||||
case r.uri.Raw():
|
case r.uri.Raw():
|
||||||
m := &api.Manifest{}
|
m := &api.Manifest{}
|
||||||
sz, _ := reader.Size(nil)
|
sz, err := reader.Size(nil)
|
||||||
|
if err == nil {
|
||||||
b := make([]byte, sz)
|
b := make([]byte, sz)
|
||||||
reader.Read(b)
|
reader.Read(b)
|
||||||
err = json.Unmarshal(b, m)
|
err = json.Unmarshal(b, m)
|
||||||
|
if err == nil {
|
||||||
if len(m.Entries) > 0 {
|
if len(m.Entries) > 0 {
|
||||||
if m.Entries[0].ContentType == api.ResourceContentType {
|
if m.Entries[0].ContentType == api.ResourceContentType {
|
||||||
s.handleGetResource(w, r, m.Entries[0].Path)
|
s.handleGetResource(w, r, m.Entries[0].Path)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
// allow the request to overwrite the content type using a query
|
// allow the request to overwrite the content type using a query
|
||||||
// parameter
|
// parameter
|
||||||
contentType := "application/octet-stream"
|
contentType := "application/octet-stream"
|
||||||
|
|
|
||||||
|
|
@ -55,14 +55,14 @@ func TestBzzResource(t *testing.T) {
|
||||||
resp, err := http.Post(url, "application/octet-stream", bytes.NewReader(databytes))
|
resp, err := http.Post(url, "application/octet-stream", bytes.NewReader(databytes))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
} else if resp.StatusCode != http.StatusOK {
|
||||||
|
t.Fatalf("err %s", resp.Status)
|
||||||
}
|
}
|
||||||
manifesthash, err := ioutil.ReadAll(resp.Body)
|
manifesthash, err := ioutil.ReadAll(resp.Body)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
if resp.StatusCode != http.StatusOK {
|
resp.Body.Close()
|
||||||
t.Fatalf("err %s", resp.Status)
|
|
||||||
}
|
|
||||||
|
|
||||||
// update 2
|
// update 2
|
||||||
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
|
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
|
||||||
|
|
@ -79,6 +79,8 @@ func TestBzzResource(t *testing.T) {
|
||||||
resp, err = http.Get(url)
|
resp, err = http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
} 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 {
|
if err != nil {
|
||||||
|
|
@ -86,12 +88,15 @@ func TestBzzResource(t *testing.T) {
|
||||||
} else if !bytes.Equal(data, b) {
|
} else if !bytes.Equal(data, b) {
|
||||||
t.Fatalf("Expected body '%x', got '%x'", data, b)
|
t.Fatalf("Expected body '%x', got '%x'", data, b)
|
||||||
}
|
}
|
||||||
|
resp.Body.Close()
|
||||||
|
|
||||||
// get latest update (1.2) through resource directly
|
// get latest update (1.2) through resource directly
|
||||||
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
|
url = fmt.Sprintf("%s/bzz-resource:/%x", srv.URL, keybytes)
|
||||||
resp, err = http.Get(url)
|
resp, err = http.Get(url)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
|
} 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 {
|
if err != nil {
|
||||||
|
|
@ -99,7 +104,7 @@ func TestBzzResource(t *testing.T) {
|
||||||
} else if !bytes.Equal(data, b) {
|
} else if !bytes.Equal(data, b) {
|
||||||
t.Fatalf("Expected body '%x', got '%x'", data, b)
|
t.Fatalf("Expected body '%x', got '%x'", data, b)
|
||||||
}
|
}
|
||||||
|
resp.Body.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestBzzGetPath(t *testing.T) {
|
func TestBzzGetPath(t *testing.T) {
|
||||||
|
|
|
||||||
|
|
@ -13,6 +13,7 @@ import (
|
||||||
"golang.org/x/net/idna"
|
"golang.org/x/net/idna"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"github.com/ethereum/go-ethereum/common"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
)
|
)
|
||||||
|
|
@ -60,7 +61,7 @@ type ResourceValidator interface {
|
||||||
}
|
}
|
||||||
|
|
||||||
type ethApi 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
|
// 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
|
// TODO: Include modtime in chunk data + signature
|
||||||
type ResourceHandler struct {
|
type ResourceHandler struct {
|
||||||
ChunkStore
|
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()
|
cancelFunc func()
|
||||||
validator ResourceValidator
|
validator ResourceValidator
|
||||||
ethClient ethApi
|
ethClient ethApi
|
||||||
|
|
@ -609,11 +610,13 @@ func (self *ResourceHandler) Close() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *ResourceHandler) GetBlock() (uint64, error) {
|
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 {
|
if err != nil {
|
||||||
return 0, err
|
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
|
// 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) {
|
func ToSafeName(name string) (string, error) {
|
||||||
validname, err := idna.ToASCII(name)
|
return idna.ToASCII(name)
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
return validname, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// check that name identifiers contain valid bytes
|
// check that name identifiers contain valid bytes
|
||||||
|
|
|
||||||
|
|
@ -20,6 +20,7 @@ import (
|
||||||
"github.com/ethereum/go-ethereum/contracts/ens"
|
"github.com/ethereum/go-ethereum/contracts/ens"
|
||||||
"github.com/ethereum/go-ethereum/contracts/ens/contract"
|
"github.com/ethereum/go-ethereum/contracts/ens/contract"
|
||||||
"github.com/ethereum/go-ethereum/core"
|
"github.com/ethereum/go-ethereum/core"
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/crypto"
|
"github.com/ethereum/go-ethereum/crypto"
|
||||||
"github.com/ethereum/go-ethereum/log"
|
"github.com/ethereum/go-ethereum/log"
|
||||||
)
|
)
|
||||||
|
|
@ -57,10 +58,12 @@ func (f *fakeBackend) Commit() {
|
||||||
f.blocknumber++
|
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++
|
f.blocknumber++
|
||||||
biggie := big.NewInt(f.blocknumber)
|
biggie := big.NewInt(f.blocknumber)
|
||||||
return *biggie, nil
|
return &types.Header{
|
||||||
|
Number: biggie,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// check that signature address matches update signer address
|
// check that signature address matches update signer address
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,7 @@ import (
|
||||||
"strconv"
|
"strconv"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ethereum/go-ethereum/core/types"
|
||||||
"github.com/ethereum/go-ethereum/swarm/api"
|
"github.com/ethereum/go-ethereum/swarm/api"
|
||||||
httpapi "github.com/ethereum/go-ethereum/swarm/api/http"
|
httpapi "github.com/ethereum/go-ethereum/swarm/api/http"
|
||||||
"github.com/ethereum/go-ethereum/swarm/storage"
|
"github.com/ethereum/go-ethereum/swarm/storage"
|
||||||
|
|
@ -34,10 +35,12 @@ type fakeBackend struct {
|
||||||
blocknumber int64
|
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++
|
f.blocknumber++
|
||||||
biggie := big.NewInt(f.blocknumber)
|
biggie := big.NewInt(f.blocknumber)
|
||||||
return *biggie, nil
|
return &types.Header{
|
||||||
|
Number: biggie,
|
||||||
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewTestSwarmServer(t *testing.T) *TestSwarmServer {
|
func NewTestSwarmServer(t *testing.T) *TestSwarmServer {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue