From 52693520cc77305cd05af5c7efa1ade24bd23de7 Mon Sep 17 00:00:00 2001 From: Janos Guljas Date: Wed, 13 Dec 2017 13:28:39 +0100 Subject: [PATCH] swarm: replaace bzzr and bzzi schemes with bzz-raw and bzz-immutable New URI Shemes are added and old ones are deprecated, but not removed. Old Schemes bzzr and bzzi are functional for backward compatibility. --- swarm/api/api.go | 2 +- swarm/api/api_test.go | 2 +- swarm/api/client/client.go | 4 +- swarm/api/http/roundtripper.go | 4 +- swarm/api/http/server.go | 12 +++--- swarm/api/http/server_test.go | 8 ++-- swarm/api/uri.go | 26 ++++++++++--- swarm/api/uri_test.go | 60 +++++++++++++++++++++-------- swarm/dev/scripts/random-uploads.sh | 2 +- 9 files changed, 81 insertions(+), 39 deletions(-) diff --git a/swarm/api/api.go b/swarm/api/api.go index 79de29a1cf..8c4bca2ec0 100644 --- a/swarm/api/api.go +++ b/swarm/api/api.go @@ -83,7 +83,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 f9caed27f5..e673f76c42 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 1a6327cb51..8165d52d7e 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 diff --git a/swarm/api/http/roundtripper.go b/swarm/api/http/roundtripper.go index 328177a218..0194317716 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 e5fefc6eec..3872cbc4f0 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,7 +290,7 @@ func (s *Server) HandleDelete(w http.ResponseWriter, r *Request) { fmt.Fprint(w, newKey) } -// HandleGetRaw handles a GET request to bzzr:// and responds with +// HandleGetRaw handles a GET request to bzz-raw:// and responds with // the raw content stored at the given storage key func (s *Server) HandleGetRaw(w http.ResponseWriter, r *Request) { key, err := s.api.Resolve(r.uri) @@ -592,7 +592,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) @@ -604,7 +604,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 { @@ -612,14 +612,14 @@ 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() { + if uri.Raw() || uri.DeprecatedRaw() { s.HandleGetRaw(w, req) return } diff --git a/swarm/api/http/server_test.go b/swarm/api/http/server_test.go index 62626586bb..dbbfa3b071 100644 --- a/swarm/api/http/server_test.go +++ b/swarm/api/http/server_test.go @@ -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" } @@ -194,8 +194,8 @@ func TestBzzrGetPath(t *testing.T) { 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", } diff --git a/swarm/api/uri.go b/swarm/api/uri.go index 79196c7327..af1dc74453 100644 --- a/swarm/api/uri.go +++ b/swarm/api/uri.go @@ -26,11 +26,16 @@ 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-list - list of all files contained in a swarm manifest Scheme string // Addr is either a hexadecimal storage key or it an address which @@ -51,7 +56,8 @@ type URI struct { // * :// // * :/// // -// with scheme one of bzz, bzzr, bzzi or bzz-list +// with scheme one of bzz, bzz-raw, bzz-immutable or bzz-list +// or deprecated ones bzzr and bzzi func Parse(rawuri string) (*URI, error) { u, err := url.Parse(rawuri) if err != nil { @@ -61,7 +67,7 @@ func Parse(rawuri string) (*URI, error) { // check the scheme is valid switch uri.Scheme { - case "bzz", "bzzi", "bzzr", "bzz-list": + case "bzz", "bzz-raw", "bzz-immutable", "bzz-list", "bzzr", "bzzi": default: return nil, fmt.Errorf("unknown scheme %q", u.Scheme) } @@ -85,17 +91,25 @@ 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 == "bzzi" + 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) String() string { return u.Scheme + ":/" + u.Addr + "/" + u.Path } diff --git a/swarm/api/uri_test.go b/swarm/api/uri_test.go index aa150cf3d7..babb2834e9 100644 --- a/swarm/api/uri_test.go +++ b/swarm/api/uri_test.go @@ -23,12 +23,14 @@ import ( func TestParseURI(t *testing.T) { type test struct { - uri string - expectURI *URI - expectErr bool - expectRaw bool - expectImmutable bool - expectList bool + uri string + expectURI *URI + expectErr bool + expectRaw bool + expectImmutable bool + expectList bool + expectDeprecatedRaw bool + expectDeprecatedImmutable bool } tests := []test{ { @@ -48,13 +50,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, }, { @@ -70,18 +72,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, }, { @@ -106,6 +108,26 @@ func TestParseURI(t *testing.T) { 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) @@ -130,5 +152,11 @@ func TestParseURI(t *testing.T) { if actual.List() != x.expectList { t.Fatalf("expected %s list to be %t, got %t", x.uri, x.expectList, actual.List()) } + 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 db7887e3c0..563a51befc 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() {