diff --git a/fixtures/path_gateway_unixfs/README.md b/fixtures/path_gateway_unixfs/README.md index 6f13750a7..9fa94a574 100644 --- a/fixtures/path_gateway_unixfs/README.md +++ b/fixtures/path_gateway_unixfs/README.md @@ -39,3 +39,16 @@ ipfs files ls -l # Manually CID of "dir-with-files" and then... ipfs dag export $CID ``` + +### [dir-with-percent-encoded-filename.car](./dir-with-percent-encoded-name-file.car) + +```sh +ipfs version +# ipfs version 0.22.0 +CID=$(echo "hello from a percent encoded filename" | ipfs add --cid-version=1 -q) +ipfs files mkdir -p --cid-version 1 /dir-with-percent-encoded-filename +ipfs files cp /ipfs/$CID "/dir-with-percent-encoded-filename/Portugal%2C+España=Peninsula Ibérica.txt" +ipfs files ls -l +# Manually CID of "dir-with-percent-encoded-filename" and then... +ipfs dag export $CID +``` \ No newline at end of file diff --git a/fixtures/path_gateway_unixfs/dir-with-percent-encoded-filename.car b/fixtures/path_gateway_unixfs/dir-with-percent-encoded-filename.car new file mode 100644 index 000000000..559f4d338 Binary files /dev/null and b/fixtures/path_gateway_unixfs/dir-with-percent-encoded-filename.car differ diff --git a/fixtures/redirects_file/README.md b/fixtures/redirects_file/README.md index 9d56fb5cf..fb1613739 100644 --- a/fixtures/redirects_file/README.md +++ b/fixtures/redirects_file/README.md @@ -9,4 +9,24 @@ See comments in the yml file. ### [redirects.car](./redirects.car) -Fixtures based on [specs.ipfs.tech/http-gateways/web-redirects-file/#test-fixtures](https://specs.ipfs.tech/http-gateways/web-redirects-file/#test-fixtures) and [IPIP-0002](https://specs.ipfs.tech/ipips/ipip-0002/) \ No newline at end of file +Fixtures based on [specs.ipfs.tech/http-gateways/web-redirects-file/#test-fixtures](https://specs.ipfs.tech/http-gateways/web-redirects-file/#test-fixtures) and [IPIP-0002](https://specs.ipfs.tech/ipips/ipip-0002/) + +### [redirects-spa.car](./redirects-spa.car) + +```sh +ipfs version +# ipfs version 0.22.0 +REDIRECTS=$(cat <<-EOF +# Map SPA routes to the main index HTML file. +/* /index.html 200 +EOF +) +REDIRECTS_CID=$(echo $REDIRECTS | ipfs add --cid-version=1 -q) +HELLO_CID=$(echo "hello world" | ipfs add --cid-version=1 -q) +ipfs files mkdir -p --cid-version 1 /redirects-spa +ipfs files cp /ipfs/$REDIRECTS_CID "/redirects-spa/_redirects" +ipfs files cp /ipfs/$HELLO_CID "/redirects-spa/index.html" +ipfs files ls -l +# Manually CID of "redirects-spa" and then... +ipfs dag export $CID +``` diff --git a/fixtures/redirects_file/dnslink.yml b/fixtures/redirects_file/dnslink.yml index 15be77219..f5fb2cde9 100644 --- a/fixtures/redirects_file/dnslink.yml +++ b/fixtures/redirects_file/dnslink.yml @@ -2,6 +2,9 @@ dnslinks: custom-dnslink: subdomain: dnslink-enabled-on-fqdn - # this is the cid of the folder - # ./redirects.car:/examples/ - path: /ipfs/QmYBhLYDwVFvxos9h8CGU2ibaY66QNgv8hpfewxaQrPiZj \ No newline at end of file + # cid of ./redirects.car:/examples/ + path: /ipfs/QmYBhLYDwVFvxos9h8CGU2ibaY66QNgv8hpfewxaQrPiZj + dnslink-spa: + subdomain: dnslink-enabled-with-spa + # cid of ./redirects-spa.car + path: /ipfs/bafybeib5lboymwd6p2eo4qb2lkueaine577flvsjjeuevmp2nlio72xv5q diff --git a/fixtures/redirects_file/redirects-spa.car b/fixtures/redirects_file/redirects-spa.car new file mode 100644 index 000000000..b92b25399 Binary files /dev/null and b/fixtures/redirects_file/redirects-spa.car differ diff --git a/fixtures/t0400-api-no-gateway.car b/fixtures/t0400-api-no-gateway.car deleted file mode 100644 index 1e090db6d..000000000 Binary files a/fixtures/t0400-api-no-gateway.car and /dev/null differ diff --git a/tests/path_gateway_unixfs_test.go b/tests/path_gateway_unixfs_test.go index ae3705d82..1af34c203 100644 --- a/tests/path_gateway_unixfs_test.go +++ b/tests/path_gateway_unixfs_test.go @@ -577,3 +577,20 @@ func TestGatewayUnixFSFileRanges(t *testing.T) { RunWithSpecs(t, tests, specs.PathGatewayUnixFS) } + +func TestPathGatewayMiscellaneous(t *testing.T) { + fixture := car.MustOpenUnixfsCar("path_gateway_unixfs/dir-with-percent-encoded-filename.car") + rootDirCID := fixture.MustGetCid() + + tests := SugarTests{ + { + Name: "GET for /ipfs/ file whose filename contains percentage-encoded characters works", + Request: Request(). + Path("/ipfs/{{CID}}/Portugal%252C+España=Peninsula%20Ibérica.txt", rootDirCID), + Response: Expect(). + Body(fixture.MustGetRawData("Portugal%2C+España=Peninsula Ibérica.txt")), + }, + } + + RunWithSpecs(t, tests, specs.PathGatewayUnixFS) +} diff --git a/tests/redirects_file_test.go b/tests/redirects_file_test.go index 64e46d246..c9f7eca3e 100644 --- a/tests/redirects_file_test.go +++ b/tests/redirects_file_test.go @@ -283,3 +283,55 @@ func TestRedirectsFileSupportWithDNSLink(t *testing.T) { RunWithSpecs(t, helpers.UnwrapSubdomainTests(t, tests), specs.DNSLinkGateway, specs.RedirectsFile) } + +func TestRedirectsFileWithIfNoneMatchHeader(t *testing.T) { + fixture := car.MustOpenUnixfsCar("redirects_file/redirects-spa.car") + + dnsLinks := dnslink.MustOpenDNSLink("redirects_file/dnslink.yml") + dnsLink := dnsLinks.MustGet("dnslink-spa") + + gatewayURL := SubdomainGatewayURL + u, err := url.Parse(gatewayURL) + if err != nil { + t.Fatal(err) + } + + pageURL := Fmt("{{scheme}}://{{dnslink}}.{{host}}/missing-page", u.Scheme, dnsLink, u.Host) + + var etag string + + RunWithSpecs(t, helpers.UnwrapSubdomainTests(t, SugarTests{ + { + Name: "request for $DNSLINK_FQDN/missing-page returns body of index.html as per _redirects", + Request: Request(). + URL(pageURL). + Headers( + Header("Accept", "text/html"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Etag"). + Checks(func(v string) bool { + etag = v + return v != "" + }), + ). + Body(fixture.MustGetRawData("index.html")), + }, + }), specs.DNSLinkGateway, specs.RedirectsFile) + + RunWithSpecs(t, helpers.UnwrapSubdomainTests(t, SugarTests{ + { + Name: "request for $DNSLINK_FQDN/missing-page with If-None-Match returns 301", + Request: Request(). + URL(pageURL). + Headers( + Header("Accept", "text/html"), + Header("If-None-Match", etag), + ), + Response: Expect(). + Status(304), + }, + }), specs.DNSLinkGateway, specs.RedirectsFile) +} diff --git a/tests/subdomain_gateway_ipfs_test.go b/tests/subdomain_gateway_ipfs_test.go index 8fd11a682..c3304566a 100644 --- a/tests/subdomain_gateway_ipfs_test.go +++ b/tests/subdomain_gateway_ipfs_test.go @@ -120,6 +120,9 @@ func TestGatewaySubdomains(t *testing.T) { CIDv1_TOO_LONG := fixture.MustGetCid("hello-CIDv1_TOO_LONG") CIDWikipedia := "QmXoypizjW3WknFiJnKLwHCnL72vedxjQkDDP1mXWo6uco" + dirWithPercentEncodedFilename := car.MustOpenUnixfsCar("path_gateway_unixfs/dir-with-percent-encoded-filename.car") + dirWithPercentEncodedFilenameCID := dirWithPercentEncodedFilename.MustGetCid() + tests := SugarTests{} // We're going to run the same test against multiple gateways (localhost, and a subdomain gateway) @@ -150,6 +153,15 @@ func TestGatewaySubdomains(t *testing.T) { Contains("{{scheme}}://{{cid}}.ipfs.{{host}}/", u.Scheme, CIDv1, u.Host), ), }, + { + Name: "request for example.com/ipfs/{CIDv1}/{filename with percent encoding} redirects to subdomain", + Request: Request().URL("{{url}}/ipfs/{{cid}}/Portugal%252C+España=Peninsula%20Ibérica.txt", gatewayURL, dirWithPercentEncodedFilenameCID), + Response: Expect(). + Status(301). + Headers( + Header("Location").Equals("{{scheme}}://{{cid}}.ipfs.{{host}}/Portugal%252C+Espa%C3%B1a=Peninsula%20Ib%C3%A9rica.txt", u.Scheme, dirWithPercentEncodedFilenameCID, u.Host), + ), + }, { Name: "request for example.com/ipfs/{DirCID} redirects to subdomain", Hint: `