Skip to content

Commit 30abd55

Browse files
authored
fix(routing/http/client): avoid escaping comma query separator (#688)
1 parent ceb514c commit 30abd55

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ The following emojis are used to highlight certain changes:
2222

2323
### Fixed
2424

25+
- `routing/http/client`: optional address and protocol filter parameters from [IPIP-484](https://github.com/ipfs/specs/pull/484) use human-readable `,` instead of `%2C`. [#688](https://github.com/ipfs/boxo/pull/688)
26+
2527
### Security
2628

2729
## [v0.24.0]

routing/http/filters/filters.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,13 @@ func AddFiltersToURL(baseURL string, protocolFilter, addrFilter []string) string
3939
query.Set("filter-addrs", strings.Join(addrFilter, ","))
4040
}
4141

42-
parsedURL.RawQuery = query.Encode()
42+
// The comma is in the "sub-delims" set of characters that don't need to be
43+
// encoded in most parts of a URL, including query parameters. Golang
44+
// standard library percent-escapes it for consistency, but we prefer
45+
// human-readable /routing/v1 URLs, and real comma is restored here to
46+
// ensure human and machine requests hit the same HTTP cache keys.
47+
parsedURL.RawQuery = strings.ReplaceAll(query.Encode(), "%2C", ",")
48+
4349
return parsedURL.String()
4450
}
4551

routing/http/filters/filters_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,21 +30,21 @@ func TestAddFiltersToURL(t *testing.T) {
3030
baseURL: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3131
protocolFilter: []string{"transport-bitswap", "transport-ipfs-gateway-http"},
3232
addrFilter: nil,
33-
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-protocols=transport-bitswap%2Ctransport-ipfs-gateway-http",
33+
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-protocols=transport-bitswap,transport-ipfs-gateway-http",
3434
},
3535
{
3636
name: "Only addr filter",
3737
baseURL: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
3838
protocolFilter: nil,
3939
addrFilter: []string{"ip4", "ip6"},
40-
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-addrs=ip4%2Cip6",
40+
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-addrs=ip4,ip6",
4141
},
4242
{
4343
name: "Both filters",
4444
baseURL: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi",
4545
protocolFilter: []string{"transport-bitswap", "transport-graphsync-filecoinv1"},
4646
addrFilter: []string{"ip4", "ip6"},
47-
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-addrs=ip4%2Cip6&filter-protocols=transport-bitswap%2Ctransport-graphsync-filecoinv1",
47+
expected: "https://example.com/routing/v1/providers/bafybeigdyrzt5sfp7udm7hu76uh7y26nf3efuylqabf3oclgtqy55fbzdi?filter-addrs=ip4,ip6&filter-protocols=transport-bitswap,transport-graphsync-filecoinv1",
4848
},
4949
{
5050
name: "URL with existing query parameters",

0 commit comments

Comments
 (0)