|
|
@@ -18,12 +18,16 @@ package http_test
|
|
|
|
|
|
import (
|
|
|
"bytes"
|
|
|
+ "errors"
|
|
|
+ "fmt"
|
|
|
"io/ioutil"
|
|
|
"net/http"
|
|
|
"sync"
|
|
|
"testing"
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/common"
|
|
|
+ "github.com/ethereum/go-ethereum/swarm/api"
|
|
|
+ swarm "github.com/ethereum/go-ethereum/swarm/api/client"
|
|
|
"github.com/ethereum/go-ethereum/swarm/storage"
|
|
|
"github.com/ethereum/go-ethereum/swarm/testutil"
|
|
|
)
|
|
|
@@ -128,3 +132,61 @@ func TestBzzrGetPath(t *testing.T) {
|
|
|
}
|
|
|
|
|
|
}
|
|
|
+
|
|
|
+// TestBzzRootRedirect tests that getting the root path of a manifest without
|
|
|
+// a trailing slash gets redirected to include the trailing slash so that
|
|
|
+// relative URLs work as expected.
|
|
|
+func TestBzzRootRedirect(t *testing.T) {
|
|
|
+ srv := testutil.NewTestSwarmServer(t)
|
|
|
+ defer srv.Close()
|
|
|
+
|
|
|
+ // create a manifest with some data at the root path
|
|
|
+ client := swarm.NewClient(srv.URL)
|
|
|
+ data := []byte("data")
|
|
|
+ file := &swarm.File{
|
|
|
+ ReadCloser: ioutil.NopCloser(bytes.NewReader(data)),
|
|
|
+ ManifestEntry: api.ManifestEntry{
|
|
|
+ Path: "",
|
|
|
+ ContentType: "text/plain",
|
|
|
+ Size: int64(len(data)),
|
|
|
+ },
|
|
|
+ }
|
|
|
+ hash, err := client.Upload(file, "")
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+
|
|
|
+ // define a CheckRedirect hook which ensures there is only a single
|
|
|
+ // redirect to the correct URL
|
|
|
+ redirected := false
|
|
|
+ httpClient := http.Client{
|
|
|
+ CheckRedirect: func(req *http.Request, via []*http.Request) error {
|
|
|
+ if redirected {
|
|
|
+ return errors.New("too many redirects")
|
|
|
+ }
|
|
|
+ redirected = true
|
|
|
+ expectedPath := "/bzz:/" + hash + "/"
|
|
|
+ if req.URL.Path != expectedPath {
|
|
|
+ return fmt.Errorf("expected redirect to %q, got %q", expectedPath, req.URL.Path)
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+ },
|
|
|
+ }
|
|
|
+
|
|
|
+ // perform the GET request and assert the response
|
|
|
+ res, err := httpClient.Get(srv.URL + "/bzz:/" + hash)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ defer res.Body.Close()
|
|
|
+ if !redirected {
|
|
|
+ t.Fatal("expected GET /bzz:/<hash> to redirect to /bzz:/<hash>/ but it didn't")
|
|
|
+ }
|
|
|
+ gotData, err := ioutil.ReadAll(res.Body)
|
|
|
+ if err != nil {
|
|
|
+ t.Fatal(err)
|
|
|
+ }
|
|
|
+ if !bytes.Equal(gotData, data) {
|
|
|
+ t.Fatalf("expected response to equal %q, got %q", data, gotData)
|
|
|
+ }
|
|
|
+}
|