mirror of
https://github.com/ipfs/kubo.git
synced 2025-07-15 07:58:15 +08:00
Merge pull request #4977 from ipfs/fix/4973-1
only resolve dnslinks once in the gateway
This commit is contained in:
@ -4,6 +4,7 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"net/http/httptest"
|
"net/http/httptest"
|
||||||
"strings"
|
"strings"
|
||||||
@ -31,11 +32,25 @@ var emptyDir = "/ipfs/QmUNLLsPACCz1vLxQVkXqqLX5R1X345qqfHbsf67hvA3Nn"
|
|||||||
type mockNamesys map[string]path.Path
|
type mockNamesys map[string]path.Path
|
||||||
|
|
||||||
func (m mockNamesys) Resolve(ctx context.Context, name string, opts ...nsopts.ResolveOpt) (value path.Path, err error) {
|
func (m mockNamesys) Resolve(ctx context.Context, name string, opts ...nsopts.ResolveOpt) (value path.Path, err error) {
|
||||||
p, ok := m[name]
|
cfg := nsopts.DefaultResolveOpts()
|
||||||
if !ok {
|
for _, o := range opts {
|
||||||
return "", namesys.ErrResolveFailed
|
o(cfg)
|
||||||
}
|
}
|
||||||
return p, nil
|
depth := cfg.Depth
|
||||||
|
if depth == nsopts.UnlimitedDepth {
|
||||||
|
depth = math.MaxUint64
|
||||||
|
}
|
||||||
|
for depth > 0 && strings.HasPrefix(name, "/ipns/") {
|
||||||
|
depth--
|
||||||
|
|
||||||
|
var ok bool
|
||||||
|
value, ok = m[name]
|
||||||
|
if !ok {
|
||||||
|
return "", namesys.ErrResolveFailed
|
||||||
|
}
|
||||||
|
name = value.String()
|
||||||
|
}
|
||||||
|
return value, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m mockNamesys) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error {
|
func (m mockNamesys) Publish(ctx context.Context, name ci.PrivKey, value path.Path) error {
|
||||||
@ -130,6 +145,10 @@ func TestGatewayGet(t *testing.T) {
|
|||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
ns["/ipns/example.com"] = path.FromString("/ipfs/" + k)
|
ns["/ipns/example.com"] = path.FromString("/ipfs/" + k)
|
||||||
|
ns["/ipns/working.example.com"] = path.FromString("/ipfs/" + k)
|
||||||
|
ns["/ipns/double.example.com"] = path.FromString("/ipns/working.example.com")
|
||||||
|
ns["/ipns/triple.example.com"] = path.FromString("/ipns/double.example.com")
|
||||||
|
ns["/ipns/broken.example.com"] = path.FromString("/ipns/" + k)
|
||||||
|
|
||||||
t.Log(ts.URL)
|
t.Log(ts.URL)
|
||||||
for _, test := range []struct {
|
for _, test := range []struct {
|
||||||
@ -145,6 +164,13 @@ func TestGatewayGet(t *testing.T) {
|
|||||||
{"localhost:5001", "/ipns/%0D%0A%0D%0Ahello", http.StatusNotFound, "ipfs resolve -r /ipns/%0D%0A%0D%0Ahello: " + namesys.ErrResolveFailed.Error() + "\n"},
|
{"localhost:5001", "/ipns/%0D%0A%0D%0Ahello", http.StatusNotFound, "ipfs resolve -r /ipns/%0D%0A%0D%0Ahello: " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||||
{"localhost:5001", "/ipns/example.com", http.StatusOK, "fnord"},
|
{"localhost:5001", "/ipns/example.com", http.StatusOK, "fnord"},
|
||||||
{"example.com", "/", http.StatusOK, "fnord"},
|
{"example.com", "/", http.StatusOK, "fnord"},
|
||||||
|
|
||||||
|
{"working.example.com", "/", http.StatusOK, "fnord"},
|
||||||
|
{"double.example.com", "/", http.StatusOK, "fnord"},
|
||||||
|
{"triple.example.com", "/", http.StatusOK, "fnord"},
|
||||||
|
{"working.example.com", "/ipfs/" + k, http.StatusNotFound, "ipfs resolve -r /ipns/working.example.com/ipfs/" + k + ": no link named \"ipfs\" under " + k + "\n"},
|
||||||
|
{"broken.example.com", "/", http.StatusNotFound, "ipfs resolve -r /ipns/broken.example.com/: " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||||
|
{"broken.example.com", "/ipfs/" + k, http.StatusNotFound, "ipfs resolve -r /ipns/broken.example.com/ipfs/" + k + ": " + namesys.ErrResolveFailed.Error() + "\n"},
|
||||||
} {
|
} {
|
||||||
var c http.Client
|
var c http.Client
|
||||||
r, err := http.NewRequest("GET", ts.URL+test.path, nil)
|
r, err := http.NewRequest("GET", ts.URL+test.path, nil)
|
||||||
|
@ -6,7 +6,8 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"github.com/ipfs/go-ipfs/core"
|
core "github.com/ipfs/go-ipfs/core"
|
||||||
|
nsopts "github.com/ipfs/go-ipfs/namesys/opts"
|
||||||
|
|
||||||
isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain"
|
isd "gx/ipfs/QmZmmuAXgX73UQmX1jRKjTGmjzq24Jinqkq8vzkBtno4uX/go-is-domain"
|
||||||
)
|
)
|
||||||
@ -24,7 +25,7 @@ func IPNSHostnameOption() ServeOption {
|
|||||||
host := strings.SplitN(r.Host, ":", 2)[0]
|
host := strings.SplitN(r.Host, ":", 2)[0]
|
||||||
if len(host) > 0 && isd.IsDomain(host) {
|
if len(host) > 0 && isd.IsDomain(host) {
|
||||||
name := "/ipns/" + host
|
name := "/ipns/" + host
|
||||||
if _, err := n.Namesys.Resolve(ctx, name); err == nil {
|
if _, err := n.Namesys.Resolve(ctx, name, nsopts.Depth(1)); err == nil {
|
||||||
r.Header["X-Ipns-Original-Path"] = []string{r.URL.Path}
|
r.Header["X-Ipns-Original-Path"] = []string{r.URL.Path}
|
||||||
r.URL.Path = name + r.URL.Path
|
r.URL.Path = name + r.URL.Path
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user