swarm/api/http: redirect root manifest requests to include trailing slash (#14806)
This commit is contained in:
parent
3a678a15c9
commit
f4841ff43d
@ -522,6 +522,12 @@ func (s *Server) HandleGetList(w http.ResponseWriter, r *Request) {
|
|||||||
// HandleGetFile handles a GET request to bzz://<manifest>/<path> and responds
|
// HandleGetFile handles a GET request to bzz://<manifest>/<path> and responds
|
||||||
// with the content of the file at <path> from the given <manifest>
|
// with the content of the file at <path> from the given <manifest>
|
||||||
func (s *Server) HandleGetFile(w http.ResponseWriter, r *Request) {
|
func (s *Server) HandleGetFile(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+"/", http.StatusMovedPermanently)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
key, err := s.api.Resolve(r.uri)
|
key, err := s.api.Resolve(r.uri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err))
|
s.Error(w, r, fmt.Errorf("error resolving %s: %s", r.uri.Addr, err))
|
||||||
|
@ -18,12 +18,16 @@ package http_test
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
"sync"
|
"sync"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"github.com/ethereum/go-ethereum/common"
|
"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/storage"
|
||||||
"github.com/ethereum/go-ethereum/swarm/testutil"
|
"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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user