aboutsummaryrefslogtreecommitdiffstats
path: root/swarm
diff options
context:
space:
mode:
authorJanos Guljas <janos@resenje.org>2018-02-09 19:23:30 +0800
committerJanos Guljas <janos@resenje.org>2018-02-22 21:23:17 +0800
commita3a07350dcef0ba39829a20d8ddba4bd3463d293 (patch)
tree100f2515cadd92105537a12e6981fab2193435ee /swarm
parent820cf09c98706f71d4b02b6c25e62db15830f3fb (diff)
parent1a4e68721a901e86322631fed1191025a6d14c52 (diff)
downloadgo-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.gz
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.bz2
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.lz
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.xz
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.tar.zst
go-tangerine-a3a07350dcef0ba39829a20d8ddba4bd3463d293.zip
swarm, cmd/swarm: Merge branch 'master' into multiple-ens-endpoints
Diffstat (limited to 'swarm')
-rw-r--r--swarm/api/api.go2
-rw-r--r--swarm/api/api_test.go2
-rw-r--r--swarm/api/client/client.go6
-rw-r--r--swarm/api/http/roundtripper.go4
-rw-r--r--swarm/api/http/server.go67
-rw-r--r--swarm/api/http/server_test.go134
-rw-r--r--swarm/api/http/templates.go2
-rw-r--r--swarm/api/uri.go33
-rw-r--r--swarm/api/uri_test.go86
-rwxr-xr-xswarm/dev/scripts/random-uploads.sh2
-rw-r--r--swarm/storage/chunker_test.go8
-rw-r--r--swarm/storage/pyramid.go2
12 files changed, 283 insertions, 65 deletions
diff --git a/swarm/api/api.go b/swarm/api/api.go
index c143d8a3f..fdf76d390 100644
--- a/swarm/api/api.go
+++ b/swarm/api/api.go
@@ -159,7 +159,7 @@ func (self *Api) Resolve(uri *URI) (storage.Key, error) {
// if the URI is immutable, check if the address is a hash
isHash := hashMatcher.MatchString(uri.Addr)
- if uri.Immutable() {
+ if uri.Immutable() || uri.DeprecatedImmutable() {
if !isHash {
return nil, fmt.Errorf("immutable address not a content hash: %q", uri.Addr)
}
diff --git a/swarm/api/api_test.go b/swarm/api/api_test.go
index dbe7c1dac..4ee26bd8a 100644
--- a/swarm/api/api_test.go
+++ b/swarm/api/api_test.go
@@ -216,7 +216,7 @@ func TestAPIResolve(t *testing.T) {
api := &Api{dns: x.dns}
uri := &URI{Addr: x.addr, Scheme: "bzz"}
if x.immutable {
- uri.Scheme = "bzzi"
+ uri.Scheme = "bzz-immutable"
}
res, err := api.Resolve(uri)
if err == nil {
diff --git a/swarm/api/client/client.go b/swarm/api/client/client.go
index 7952d3fb6..8165d52d7 100644
--- a/swarm/api/client/client.go
+++ b/swarm/api/client/client.go
@@ -57,7 +57,7 @@ func (c *Client) UploadRaw(r io.Reader, size int64) (string, error) {
if size <= 0 {
return "", errors.New("data size must be greater than zero")
}
- req, err := http.NewRequest("POST", c.Gateway+"/bzzr:/", r)
+ req, err := http.NewRequest("POST", c.Gateway+"/bzz-raw:/", r)
if err != nil {
return "", err
}
@@ -79,7 +79,7 @@ func (c *Client) UploadRaw(r io.Reader, size int64) (string, error) {
// DownloadRaw downloads raw data from swarm
func (c *Client) DownloadRaw(hash string) (io.ReadCloser, error) {
- uri := c.Gateway + "/bzzr:/" + hash
+ uri := c.Gateway + "/bzz-raw:/" + hash
res, err := http.DefaultClient.Get(uri)
if err != nil {
return nil, err
@@ -269,7 +269,7 @@ func (c *Client) DownloadManifest(hash string) (*api.Manifest, error) {
//
// where entries ending with "/" are common prefixes.
func (c *Client) List(hash, prefix string) (*api.ManifestList, error) {
- res, err := http.DefaultClient.Get(c.Gateway + "/bzz:/" + hash + "/" + prefix + "?list=true")
+ res, err := http.DefaultClient.Get(c.Gateway + "/bzz-list:/" + hash + "/" + prefix)
if err != nil {
return nil, err
}
diff --git a/swarm/api/http/roundtripper.go b/swarm/api/http/roundtripper.go
index 328177a21..019431771 100644
--- a/swarm/api/http/roundtripper.go
+++ b/swarm/api/http/roundtripper.go
@@ -35,8 +35,8 @@ import (
client := httpclient.New()
// for (private) swarm proxy running locally
client.RegisterScheme("bzz", &http.RoundTripper{Port: port})
-client.RegisterScheme("bzzi", &http.RoundTripper{Port: port})
-client.RegisterScheme("bzzr", &http.RoundTripper{Port: port})
+client.RegisterScheme("bzz-immutable", &http.RoundTripper{Port: port})
+client.RegisterScheme("bzz-raw", &http.RoundTripper{Port: port})
The port you give the Roundtripper is the port the swarm proxy is listening on.
If Host is left empty, localhost is assumed.
diff --git a/swarm/api/http/server.go b/swarm/api/http/server.go
index 65f6afab7..74341899d 100644
--- a/swarm/api/http/server.go
+++ b/swarm/api/http/server.go
@@ -86,7 +86,7 @@ type Request struct {
uri *api.URI
}
-// HandlePostRaw handles a POST request to a raw bzzr:/ URI, stores the request
+// HandlePostRaw handles a POST request to a raw bzz-raw:/ URI, stores the request
// body in swarm and returns the resulting storage key as a text/plain response
func (s *Server) HandlePostRaw(w http.ResponseWriter, r *Request) {
if r.uri.Path != "" {
@@ -290,9 +290,12 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *Request) {
fmt.Fprint(w, newKey)
}
-// HandleGetRaw handles a GET request to bzzr://<key> and responds with
-// the raw content stored at the given storage key
-func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) {
+// HandleGet handles a GET request to
+// - bzz-raw://<key> and responds with the raw content stored at the
+// given storage key
+// - bzz-hash://<key> and responds with the hash of the content stored
+// at the given storage key as a text/plain response
+func (s *Server) HandleGet(w http.ResponseWriter, r *Request) {
key, err := s.api.Resolve(r.uri)
if err != nil {
s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err))
@@ -345,15 +348,22 @@ func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) {
return
}
- // allow the request to overwrite the content type using a query
- // parameter
- contentType := "application/octet-stream"
- if typ := r.URL.Query().Get("content_type"); typ != "" {
- contentType = typ
- }
- w.Header().Set("Content-Type", contentType)
+ switch {
+ case r.uri.Raw():
+ // allow the request to overwrite the content type using a query
+ // parameter
+ contentType := "application/octet-stream"
+ if typ := r.URL.Query().Get("content_type"); typ != "" {
+ contentType = typ
+ }
+ w.Header().Set("Content-Type", contentType)
- http.ServeContent(w, &r.Request, "", time.Now(), reader)
+ http.ServeContent(w, &r.Request, "", time.Now(), reader)
+ case r.uri.Hash():
+ w.Header().Set("Content-Type", "text/plain")
+ w.WriteHeader(http.StatusOK)
+ fmt.Fprint(w, key)
+ }
}
// HandleGetFiles handles a GET request to bzz:/<manifest> with an Accept
@@ -424,14 +434,13 @@ func (s *Server) HandleGetFiles(w http.ResponseWriter, r *Request) {
}
}
-// HandleGetList handles a GET request to bzz:/<manifest>/<path> which has
-// the "list" query parameter set to "true" and returns a list of all files
-// contained in <manifest> under <path> grouped into common prefixes using
-// "/" as a delimiter
+// HandleGetList handles a GET request to bzz-list:/<manifest>/<path> and returns
+// a list of all files contained in <manifest> under <path> grouped into
+// common prefixes using "/" as a delimiter
func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) {
// ensure the root path has a trailing slash so that relative URLs work
if r.uri.Path == "" && !strings.HasSuffix(r.URL.Path, "/") {
- http.Redirect(w, &r.Request, r.URL.Path+"/?list=true", http.StatusMovedPermanently)
+ http.Redirect(w, &r.Request, r.URL.Path+"/", http.StatusMovedPermanently)
return
}
@@ -453,7 +462,11 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) {
if strings.Contains(r.Header.Get("Accept"), "text/html") {
w.Header().Set("Content-Type", "text/html")
err := htmlListTemplate.Execute(w, &htmlListData{
- URI: r.uri,
+ URI: &api.URI{
+ Scheme: "bzz",
+ Addr: r.uri.Addr,
+ Path: r.uri.Path,
+ },
List: &list,
})
if err != nil {
@@ -589,7 +602,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case "POST":
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
s.HandlePostRaw(w, req)
} else {
s.HandlePostFiles(w, req)
@@ -601,7 +614,7 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
// new manifest leaving the existing one intact, so it isn't
// strictly a traditional PUT request which replaces content
// at a URI, and POST is more ubiquitous)
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
ShowError(w, r, fmt.Sprintf("No PUT to %s allowed.", uri), http.StatusBadRequest)
return
} else {
@@ -609,25 +622,25 @@ func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
}
case "DELETE":
- if uri.Raw() {
+ if uri.Raw() || uri.DeprecatedRaw() {
ShowError(w, r, fmt.Sprintf("No DELETE to %s allowed.", uri), http.StatusBadRequest)
return
}
s.HandleDelete(w, req)
case "GET":
- if uri.Raw() {
- s.HandleGetRaw(w, req)
+ if uri.Raw() || uri.Hash() || uri.DeprecatedRaw() {
+ s.HandleGet(w, req)
return
}
- if r.Header.Get("Accept") == "application/x-tar" {
- s.HandleGetFiles(w, req)
+ if uri.List() {
+ s.HandleGetList(w, req)
return
}
- if r.URL.Query().Get("list") == "true" {
- s.HandleGetList(w, req)
+ if r.Header.Get("Accept") == "application/x-tar" {
+ s.HandleGetFiles(w, req)
return
}
diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go
index ffeaf6e0d..305d5cf7d 100644
--- a/swarm/api/http/server_test.go
+++ b/swarm/api/http/server_test.go
@@ -33,7 +33,7 @@ import (
"github.com/ethereum/go-ethereum/swarm/testutil"
)
-func TestBzzrGetPath(t *testing.T) {
+func TestBzzGetPath(t *testing.T) {
var err error
@@ -70,7 +70,7 @@ func TestBzzrGetPath(t *testing.T) {
wg.Wait()
}
- _, err = http.Get(srv.URL + "/bzzr:/" + common.ToHex(key[0])[2:] + "/a")
+ _, err = http.Get(srv.URL + "/bzz-raw:/" + common.ToHex(key[0])[2:] + "/a")
if err != nil {
t.Fatalf("Failed to connect to proxy: %v", err)
}
@@ -79,7 +79,7 @@ func TestBzzrGetPath(t *testing.T) {
var resp *http.Response
var respbody []byte
- url := srv.URL + "/bzzr:/"
+ url := srv.URL + "/bzz-raw:/"
if k[:] != "" {
url += common.ToHex(key[0])[2:] + "/" + k[1:] + "?content_type=text/plain"
}
@@ -104,16 +104,140 @@ func TestBzzrGetPath(t *testing.T) {
}
}
+ for k, v := range testrequests {
+ var resp *http.Response
+ var respbody []byte
+
+ url := srv.URL + "/bzz-hash:/"
+ if k[:] != "" {
+ url += common.ToHex(key[0])[2:] + "/" + k[1:]
+ }
+ resp, err = http.Get(url)
+ if err != nil {
+ t.Fatalf("Request failed: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err = ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read request body: %v", err)
+ }
+
+ if string(respbody) != key[v].String() {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Fatalf("Response body does not match, expected: %v, got %v", key[v], string(respbody))
+ }
+ }
+ }
+
+ for _, c := range []struct {
+ path string
+ json string
+ html string
+ }{
+ {
+ path: "/",
+ json: `{"common_prefixes":["a/"]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\t<tr>\n\t <td><a href=\"a/\">a/</a></td>\n\t <td>DIR</td>\n\t <td>-</td>\n\t</tr>\n \n\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/a/",
+ json: `{"common_prefixes":["a/b/"],"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/a","mod_time":"0001-01-01T00:00:00Z"}]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\t<tr>\n\t <td><a href=\"b/\">b/</a></td>\n\t <td>DIR</td>\n\t <td>-</td>\n\t</tr>\n \n\n \n\t<tr>\n\t <td><a href=\"a\">a</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/a/b/",
+ json: `{"entries":[{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/b","mod_time":"0001-01-01T00:00:00Z"},{"hash":"011b4d03dd8c01f1049143cf9c4c817e4b167f1d1b83e5c6f0f10d89ba1e7bce","path":"a/b/c","mod_time":"0001-01-01T00:00:00Z"}]}`,
+ html: "<!DOCTYPE html>\n<html>\n<head>\n <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n <title>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/b/</title>\n</head>\n\n<body>\n <h1>Swarm index of bzz:/262e5c08c03c2789b6daef487dfa14b4d132f5340d781a3ecb1d5122ab65640c/a/b/</h1>\n <hr>\n <table>\n <thead>\n <tr>\n\t<th>Path</th>\n\t<th>Type</th>\n\t<th>Size</th>\n </tr>\n </thead>\n\n <tbody>\n \n\n \n\t<tr>\n\t <td><a href=\"b\">b</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n\t<tr>\n\t <td><a href=\"c\">c</a></td>\n\t <td></td>\n\t <td>0</td>\n\t</tr>\n \n </table>\n <hr>\n</body>\n",
+ },
+ {
+ path: "/x",
+ },
+ {
+ path: "",
+ },
+ } {
+ k := c.path
+ url := srv.URL + "/bzz-list:/"
+ if k[:] != "" {
+ url += common.ToHex(key[0])[2:] + "/" + k[1:]
+ }
+ t.Run("json list "+c.path, func(t *testing.T) {
+ resp, err := http.Get(url)
+ if err != nil {
+ t.Fatalf("HTTP request: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read response body: %v", err)
+ }
+
+ body := strings.TrimSpace(string(respbody))
+ if body != c.json {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Errorf("Response list body %q does not match, expected: %v, got %v", k, c.json, body)
+ }
+ }
+ })
+ t.Run("html list "+c.path, func(t *testing.T) {
+ req, err := http.NewRequest(http.MethodGet, url, nil)
+ if err != nil {
+ t.Fatalf("New request: %v", err)
+ }
+ req.Header.Set("Accept", "text/html")
+ resp, err := http.DefaultClient.Do(req)
+ if err != nil {
+ t.Fatalf("HTTP request: %v", err)
+ }
+ defer resp.Body.Close()
+ respbody, err := ioutil.ReadAll(resp.Body)
+ if err != nil {
+ t.Fatalf("Read response body: %v", err)
+ }
+
+ if string(respbody) != c.html {
+ isexpectedfailrequest := false
+
+ for _, r := range expectedfailrequests {
+ if k[:] == r {
+ isexpectedfailrequest = true
+ }
+ }
+ if !isexpectedfailrequest {
+ t.Errorf("Response list body %q does not match, expected: %q, got %q", k, c.html, string(respbody))
+ }
+ }
+ })
+ }
+
nonhashtests := []string{
srv.URL + "/bzz:/name",
- srv.URL + "/bzzi:/nonhash",
- srv.URL + "/bzzr:/nonhash",
+ srv.URL + "/bzz-immutable:/nonhash",
+ srv.URL + "/bzz-raw:/nonhash",
+ srv.URL + "/bzz-list:/nonhash",
+ srv.URL + "/bzz-hash:/nonhash",
}
nonhashresponses := []string{
"error resolving name: no DNS to resolve name: &#34;name&#34;",
"error resolving nonhash: immutable address not a content hash: &#34;nonhash&#34;",
"error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
+ "error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
+ "error resolving nonhash: no DNS to resolve name: &#34;nonhash&#34;",
}
for i, url := range nonhashtests {
diff --git a/swarm/api/http/templates.go b/swarm/api/http/templates.go
index 9ae434a7e..53ce7b5a2 100644
--- a/swarm/api/http/templates.go
+++ b/swarm/api/http/templates.go
@@ -52,7 +52,7 @@ var htmlListTemplate = template.Must(template.New("html-list").Funcs(template.Fu
<tbody>
{{ range .List.CommonPrefixes }}
<tr>
- <td><a href="{{ basename . }}/?list=true">{{ basename . }}/</a></td>
+ <td><a href="{{ basename . }}/">{{ basename . }}/</a></td>
<td>DIR</td>
<td>-</td>
</tr>
diff --git a/swarm/api/uri.go b/swarm/api/uri.go
index caed4212d..d8aafedf4 100644
--- a/swarm/api/uri.go
+++ b/swarm/api/uri.go
@@ -26,10 +26,18 @@ import (
type URI struct {
// Scheme has one of the following values:
//
- // * bzz - an entry in a swarm manifest
+ // * bzz - an entry in a swarm manifest
+ // * bzz-raw - raw swarm content
+ // * bzz-immutable - immutable URI of an entry in a swarm manifest
+ // (address is not resolved)
+ // * bzz-list - list of all files contained in a swarm manifest
+ //
+ // Deprecated Schemes:
// * bzzr - raw swarm content
// * bzzi - immutable URI of an entry in a swarm manifest
// (address is not resolved)
+ // * bzz-hash - hash of swarm content
+ //
Scheme string
// Addr is either a hexadecimal storage key or it an address which
@@ -50,7 +58,8 @@ type URI struct {
// * <scheme>://<addr>
// * <scheme>://<addr>/<path>
//
-// with scheme one of bzz, bzzr or bzzi
+// with scheme one of bzz, bzz-raw, bzz-immutable, bzz-list or bzz-hash
+// or deprecated ones bzzr and bzzi
func Parse(rawuri string) (*URI, error) {
u, err := url.Parse(rawuri)
if err != nil {
@@ -60,7 +69,7 @@ func Parse(rawuri string) (*URI, error) {
// check the scheme is valid
switch uri.Scheme {
- case "bzz", "bzzi", "bzzr":
+ case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzz-hash", "bzzr", "bzzi":
default:
return nil, fmt.Errorf("unknown scheme %q", u.Scheme)
}
@@ -84,13 +93,29 @@ func Parse(rawuri string) (*URI, error) {
}
func (u *URI) Raw() bool {
- return u.Scheme == "bzzr"
+ return u.Scheme == "bzz-raw"
}
func (u *URI) Immutable() bool {
+ return u.Scheme == "bzz-immutable"
+}
+
+func (u *URI) List() bool {
+ return u.Scheme == "bzz-list"
+}
+
+func (u *URI) DeprecatedRaw() bool {
+ return u.Scheme == "bzzr"
+}
+
+func (u *URI) DeprecatedImmutable() bool {
return u.Scheme == "bzzi"
}
+func (u *URI) Hash() bool {
+ return u.Scheme == "bzz-hash"
+}
+
func (u *URI) String() string {
return u.Scheme + ":/" + u.Addr + "/" + u.Path
}
diff --git a/swarm/api/uri_test.go b/swarm/api/uri_test.go
index 7d4160601..137b4505d 100644
--- a/swarm/api/uri_test.go
+++ b/swarm/api/uri_test.go
@@ -23,11 +23,15 @@ import (
func TestParseURI(t *testing.T) {
type test struct {
- uri string
- expectURI *URI
- expectErr bool
- expectRaw bool
- expectImmutable bool
+ uri string
+ expectURI *URI
+ expectErr bool
+ expectRaw bool
+ expectImmutable bool
+ expectList bool
+ expectHash bool
+ expectDeprecatedRaw bool
+ expectDeprecatedImmutable bool
}
tests := []test{
{
@@ -47,13 +51,13 @@ func TestParseURI(t *testing.T) {
expectURI: &URI{Scheme: "bzz"},
},
{
- uri: "bzzi:",
- expectURI: &URI{Scheme: "bzzi"},
+ uri: "bzz-immutable:",
+ expectURI: &URI{Scheme: "bzz-immutable"},
expectImmutable: true,
},
{
- uri: "bzzr:",
- expectURI: &URI{Scheme: "bzzr"},
+ uri: "bzz-raw:",
+ expectURI: &URI{Scheme: "bzz-raw"},
expectRaw: true,
},
{
@@ -69,18 +73,18 @@ func TestParseURI(t *testing.T) {
expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"},
},
{
- uri: "bzzr:/",
- expectURI: &URI{Scheme: "bzzr"},
+ uri: "bzz-raw:/",
+ expectURI: &URI{Scheme: "bzz-raw"},
expectRaw: true,
},
{
- uri: "bzzr:/abc123",
- expectURI: &URI{Scheme: "bzzr", Addr: "abc123"},
+ uri: "bzz-raw:/abc123",
+ expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123"},
expectRaw: true,
},
{
- uri: "bzzr:/abc123/path/to/entry",
- expectURI: &URI{Scheme: "bzzr", Addr: "abc123", Path: "path/to/entry"},
+ uri: "bzz-raw:/abc123/path/to/entry",
+ expectURI: &URI{Scheme: "bzz-raw", Addr: "abc123", Path: "path/to/entry"},
expectRaw: true,
},
{
@@ -95,6 +99,46 @@ func TestParseURI(t *testing.T) {
uri: "bzz://abc123/path/to/entry",
expectURI: &URI{Scheme: "bzz", Addr: "abc123", Path: "path/to/entry"},
},
+ {
+ uri: "bzz-hash:",
+ expectURI: &URI{Scheme: "bzz-hash"},
+ expectHash: true,
+ },
+ {
+ uri: "bzz-hash:/",
+ expectURI: &URI{Scheme: "bzz-hash"},
+ expectHash: true,
+ },
+ {
+ uri: "bzz-list:",
+ expectURI: &URI{Scheme: "bzz-list"},
+ expectList: true,
+ },
+ {
+ uri: "bzz-list:/",
+ expectURI: &URI{Scheme: "bzz-list"},
+ expectList: true,
+ },
+ {
+ uri: "bzzr:",
+ expectURI: &URI{Scheme: "bzzr"},
+ expectDeprecatedRaw: true,
+ },
+ {
+ uri: "bzzr:/",
+ expectURI: &URI{Scheme: "bzzr"},
+ expectDeprecatedRaw: true,
+ },
+ {
+ uri: "bzzi:",
+ expectURI: &URI{Scheme: "bzzi"},
+ expectDeprecatedImmutable: true,
+ },
+ {
+ uri: "bzzi:/",
+ expectURI: &URI{Scheme: "bzzi"},
+ expectDeprecatedImmutable: true,
+ },
}
for _, x := range tests {
actual, err := Parse(x.uri)
@@ -116,5 +160,17 @@ func TestParseURI(t *testing.T) {
if actual.Immutable() != x.expectImmutable {
t.Fatalf("expected %s immutable to be %t, got %t", x.uri, x.expectImmutable, actual.Immutable())
}
+ if actual.List() != x.expectList {
+ t.Fatalf("expected %s list to be %t, got %t", x.uri, x.expectList, actual.List())
+ }
+ if actual.Hash() != x.expectHash {
+ t.Fatalf("expected %s hash to be %t, got %t", x.uri, x.expectHash, actual.Hash())
+ }
+ if actual.DeprecatedRaw() != x.expectDeprecatedRaw {
+ t.Fatalf("expected %s deprecated raw to be %t, got %t", x.uri, x.expectDeprecatedRaw, actual.DeprecatedRaw())
+ }
+ if actual.DeprecatedImmutable() != x.expectDeprecatedImmutable {
+ t.Fatalf("expected %s deprecated immutable to be %t, got %t", x.uri, x.expectDeprecatedImmutable, actual.DeprecatedImmutable())
+ }
}
}
diff --git a/swarm/dev/scripts/random-uploads.sh b/swarm/dev/scripts/random-uploads.sh
index db7887e3c..563a51bef 100755
--- a/swarm/dev/scripts/random-uploads.sh
+++ b/swarm/dev/scripts/random-uploads.sh
@@ -46,7 +46,7 @@ main() {
}
do_random_upload() {
- curl -fsSL -X POST --data-binary "$(random_data)" "http://${addr}/bzzr:/"
+ curl -fsSL -X POST --data-binary "$(random_data)" "http://${addr}/bzz-raw:/"
}
random_data() {
diff --git a/swarm/storage/chunker_test.go b/swarm/storage/chunker_test.go
index 6178a7bb1..6b828970b 100644
--- a/swarm/storage/chunker_test.go
+++ b/swarm/storage/chunker_test.go
@@ -60,7 +60,7 @@ func (self *chunkerTester) Split(chunker Splitter, data io.Reader, size int64, c
for {
select {
case <-timeout:
- return errors.New(("Split timeout error"))
+ return errors.New("Split timeout error")
case <-quitC:
return nil
case chunk := <-chunkC:
@@ -97,7 +97,7 @@ func (self *chunkerTester) Append(chunker Splitter, rootKey Key, data io.Reader,
for {
select {
case <-timeout:
- return errors.New(("Append timeout error"))
+ return errors.New("Append timeout error")
case <-quitC:
return nil
case chunk := <-chunkC:
@@ -146,7 +146,7 @@ func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Ch
for {
select {
case <-timeout:
- return errors.New(("Join timeout error"))
+ return errors.New("Join timeout error")
case chunk, ok := <-chunkC:
if !ok {
close(quitC)
@@ -155,7 +155,7 @@ func (self *chunkerTester) Join(chunker Chunker, key Key, c int, chunkC chan *Ch
// this just mocks the behaviour of a chunk store retrieval
stored, success := self.chunks[chunk.Key.String()]
if !success {
- return errors.New(("Not found"))
+ return errors.New("Not found")
}
chunk.SData = stored.SData
chunk.Size = int64(binary.LittleEndian.Uint64(chunk.SData[0:8]))
diff --git a/swarm/storage/pyramid.go b/swarm/storage/pyramid.go
index f2e85cb5b..19d493405 100644
--- a/swarm/storage/pyramid.go
+++ b/swarm/storage/pyramid.go
@@ -338,7 +338,7 @@ func (self *PyramidChunker) loadTree(chunkLevel [][]*TreeEntry, key Key, chunkC
chunkLevel[depth-1] = append(chunkLevel[depth-1], newEntry)
// Add the rest of the tree
- for lvl := (depth - 1); lvl >= 1; lvl-- {
+ for lvl := depth - 1; lvl >= 1; lvl-- {
//TODO(jmozah): instead of loading finished branches and then trim in the end,
//avoid loading them in the first place