From df671dd024a79f47c23caf56510e3d6b20013c3a Mon Sep 17 00:00:00 2001 From: achingbrain Date: Wed, 26 Nov 2025 18:22:57 +0200 Subject: [PATCH 1/6] test: prefer format query param over accept header When both are present, allow the query param to override the accept header --- tests/path_gateway_dag_test.go | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/path_gateway_dag_test.go b/tests/path_gateway_dag_test.go index d5314cdd5..a6127df50 100644 --- a/tests/path_gateway_dag_test.go +++ b/tests/path_gateway_dag_test.go @@ -63,6 +63,26 @@ func TestGatewayJsonCbor(t *testing.T) { ). Body(fileJSONData), }, + { + Name: "GET raw block with JSON bytes prefers format over accept header", + Spec: "https://specs.ipfs.tech/http-gateways/path-gateway/#format-request-query-parameter", + Hint: ` + ## The format search query parameter should be preferred over the Accept + ## header when both are present + `, + Request: Request(). + Path("/ipfs/{{cid}}?format=json", fileJSONCID). + Headers( + Header("Accept", "application/vnd.ipld.raw"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Content-Type"). + Equals("application/json"), + ). + Body(fileJSONData), + }, } RunWithSpecs(t, tests, specs.PathGatewayDAG) From c55a3c8a992ac68ae82a008132427128cb0ac6a3 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Mon, 1 Dec 2025 23:33:30 +0100 Subject: [PATCH 2/6] test!: add format and CAR param precedence tests for IPIP-0523 BREAKING CHANGE: these tests expect URL query parameters to take precedence over Accept header, which reverses the previous behavior. adds tests verifying URL query parameters take precedence over Accept header: - TestTrustlessCarFormatPrecedence: format=car/raw overrides Accept header - TestTrustlessCarParamPrecedence: car-order and car-dups override Accept params - moves "format=car respects Accept header CAR params" test to param precedence - updates hint in existing JSON format precedence test --- tests/path_gateway_dag_test.go | 7 +- tests/trustless_gateway_car_test.go | 123 ++++++++++++++++++++++++++-- 2 files changed, 119 insertions(+), 11 deletions(-) diff --git a/tests/path_gateway_dag_test.go b/tests/path_gateway_dag_test.go index a6127df50..609eac64b 100644 --- a/tests/path_gateway_dag_test.go +++ b/tests/path_gateway_dag_test.go @@ -64,11 +64,12 @@ func TestGatewayJsonCbor(t *testing.T) { Body(fileJSONData), }, { - Name: "GET raw block with JSON bytes prefers format over accept header", + Name: "GET raw block with JSON bytes prefers format over Accept header", Spec: "https://specs.ipfs.tech/http-gateways/path-gateway/#format-request-query-parameter", Hint: ` - ## The format search query parameter should be preferred over the Accept - ## header when both are present + Per IPIP-0523, the format query parameter should be preferred over the + Accept header when both are present. This test verifies that format=json + overrides Accept: application/vnd.ipld.raw. `, Request: Request(). Path("/ipfs/{{cid}}?format=json", fileJSONCID). diff --git a/tests/trustless_gateway_car_test.go b/tests/trustless_gateway_car_test.go index 90adef01f..79aad990c 100644 --- a/tests/trustless_gateway_car_test.go +++ b/tests/trustless_gateway_car_test.go @@ -850,16 +850,85 @@ func TestTrustlessCarOrderAndDuplicates(t *testing.T) { InThatOrder(), ), }, + } + + RunWithSpecs(t, tests, specs.TrustlessGatewayCAROptional) +} + +func TestTrustlessCarFormatPrecedence(t *testing.T) { + tooling.LogTestGroup(t, GroupBlockCar) + + fixture := car.MustOpenUnixfsCar("gateway-raw-block.car") + + tests := SugarTests{ { - Name: "GET CAR with Accept and ?format, specific Accept header is prioritized", + Name: "GET with format=car query parameter takes precedence over Accept header", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", Hint: ` - The response MUST contain all the blocks found during traversal even if they - are duplicate. In this test, a directory that contains duplicate files is - requested. The blocks corresponding to the duplicate files must be returned. + Per IPIP-0523, the format query parameter should be preferred over the + Accept header when both are present. This test verifies that format=car + overrides Accept: application/vnd.ipld.raw. `, Request: Request(). - Path("/ipfs/{{cid}}", dirWithDuplicateFiles.MustGetCid()). - Query("format", "car"). + Path("/ipfs/{{cid}}?format=car", fixture.MustGetCid("dir")). + Headers( + Header("Accept", "application/vnd.ipld.raw"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Content-Type"). + Contains("application/vnd.ipld.car"), + ), + }, + { + Name: "GET with format=raw query parameter takes precedence over Accept header", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", + Hint: ` + Per IPIP-0523, the format query parameter should be preferred over the + Accept header when both are present. This test verifies that format=raw + overrides Accept: application/vnd.ipld.car. + `, + Request: Request(). + Path("/ipfs/{{cid}}?format=raw", fixture.MustGetCid("dir")). + Headers( + Header("Accept", "application/vnd.ipld.car"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Content-Type"). + Equals("application/vnd.ipld.raw"), + ), + }, + } + + RunWithSpecs(t, tests, specs.TrustlessGatewayCAR) +} + +func TestTrustlessCarParamPrecedence(t *testing.T) { + tooling.LogTestGroup(t, GroupBlockCar) + + fixture := car.MustOpenUnixfsCar("gateway-raw-block.car") + dirWithDuplicateFiles := car.MustOpenUnixfsCar("trustless_gateway_car/dir-with-duplicate-files.car") + multiblockCIDs := []string{ + "bafkreie5noke3mb7hqxukzcy73nl23k6lxszxi5w3dtmuwz62wnvkpsscm", + "bafkreih4ephajybraj6wnxsbwjwa77fukurtpl7oj7t7pfq545duhot7cq", + "bafkreigu7buvm3cfunb35766dn7tmqyh2um62zcio63en2btvxuybgcpue", + "bafkreicll3huefkc3qnrzeony7zcfo7cr3nbx64hnxrqzsixpceg332fhe", + "bafkreifst3pqztuvj57lycamoi7z34b4emf7gawxs74nwrc2c7jncmpaqm", + } + + tests := SugarTests{ + { + Name: "GET CAR with format=car respects Accept header CAR content type parameters", + Hint: ` + When format=car is used, the Accept header can still provide CAR-specific + parameters like order and dups. The response MUST contain all the blocks + found during traversal even if they are duplicate. + `, + Request: Request(). + Path("/ipfs/{{cid}}?format=car", dirWithDuplicateFiles.MustGetCid()). Header("Accept", "application/vnd.ipld.car; version=1; order=dfs; dups=y"), Response: Expect(). Status(200). @@ -872,7 +941,7 @@ func TestTrustlessCarOrderAndDuplicates(t *testing.T) { IsCar(). IgnoreRoots(). HasBlock(dirWithDuplicateFiles.MustGetCid()). - HasBlock(dirWithDuplicateFiles.MustGetCid("ascii.txt")). // ascii.txt = ascii-copy.txt + HasBlock(dirWithDuplicateFiles.MustGetCid("ascii.txt")). HasBlock(dirWithDuplicateFiles.MustGetCid("ascii-copy.txt")). HasBlock(dirWithDuplicateFiles.MustGetCid("hello.txt")). HasBlock(dirWithDuplicateFiles.MustGetCid("multiblock.txt")). @@ -881,9 +950,47 @@ func TestTrustlessCarOrderAndDuplicates(t *testing.T) { InThatOrder(), ), }, + { + Name: "GET CAR with car-order=dfs in URL takes precedence over order=unk in Accept", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-order-request-query-parameter", + Hint: ` + Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. + When car-order=dfs is in URL and order=unk is in Accept, response should have order=dfs. + `, + Request: Request(). + Path("/ipfs/{{cid}}?format=car&car-order=dfs", fixture.MustGetCid("dir")). + Headers( + Header("Accept", "application/vnd.ipld.car; order=unk"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Content-Type").Contains("application/vnd.ipld.car"), + Header("Content-Type").Contains("order=dfs"), + ), + }, + { + Name: "GET CAR with car-dups=y in URL takes precedence over dups=n in Accept", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-dups-request-query-parameter", + Hint: ` + Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. + When car-dups=y is in URL and dups=n is in Accept, response should have dups=y. + `, + Request: Request(). + Path("/ipfs/{{cid}}?format=car&car-dups=y", fixture.MustGetCid("dir")). + Headers( + Header("Accept", "application/vnd.ipld.car; dups=n"), + ), + Response: Expect(). + Status(200). + Headers( + Header("Content-Type").Contains("application/vnd.ipld.car"), + Header("Content-Type").Contains("dups=y"), + ), + }, } - RunWithSpecs(t, tests, specs.TrustlessGatewayCAROptional) + RunWithSpecs(t, tests, specs.TrustlessGatewayCAR) } // TODO: this feels like it could be an internal detail of HasBlocks From bb1ae33062c896baae7c05378fc54e666cd5452e Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Tue, 2 Dec 2025 00:01:02 +0100 Subject: [PATCH 3/6] docs(ci): add merge requirements note for failing tests When testing against Kubo master, display a note in job summary and PR comment explaining that failing tests require a companion Kubo PR that uses tests from this branch and passes CI. --- .github/workflows/test-kubo-e2e.yml | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/.github/workflows/test-kubo-e2e.yml b/.github/workflows/test-kubo-e2e.yml index 0aea705cb..4321fa816 100644 --- a/.github/workflows/test-kubo-e2e.yml +++ b/.github/workflows/test-kubo-e2e.yml @@ -68,14 +68,25 @@ jobs: markdown: output.md accept-test-failure: true - name: Set summary - run: cat ./output.md >> $GITHUB_STEP_SUMMARY + run: | + if [[ "${{ matrix.target }}" == "master" ]] && grep -q '"Action":"fail"' output.json; then + echo "> [!IMPORTANT]" >> $GITHUB_STEP_SUMMARY + echo "> This PR cannot be merged until there is a Kubo PR that uses tests from this branch and passes CI. Link related PRs (boxo, kubo) in the PR description." >> $GITHUB_STEP_SUMMARY + echo "" >> $GITHUB_STEP_SUMMARY + fi + cat ./output.md >> $GITHUB_STEP_SUMMARY - name: Prepare Comment if: github.event.pull_request env: TARGET: ${{ matrix.target }} run: | echo "Results against Kubo ${{ matrix.target }}:" > comment.md - echo "(check the action's summary for the full results)" >> comment.md + if [[ "${{ matrix.target }}" == "master" ]] && grep -q '"Action":"fail"' output.json; then + echo "" >> comment.md + echo "> [!IMPORTANT]" >> comment.md + echo "> See the [action summary](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for full results. This PR cannot be merged until there is a Kubo PR that uses tests from this branch and passes CI. Link related PRs (boxo, kubo) in the PR description." >> comment.md + fi + echo "" >> comment.md # Strip everything after the results table cat output.md | sed '/Failures\/Errors/,$d' >> comment.md From c82a2a9bc79303e0f07216a80cf454ef2a1e042c Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Thu, 11 Dec 2025 02:55:02 +0100 Subject: [PATCH 4/6] fix(test): use TrustlessGatewayCAROptional for car-order/car-dups tests `car-order` and `car-dups` URL params depend on optional `order`/`dups` support from IPIP-412, matching `TestTrustlessCarOrderAndDuplicates`. Merged tests into `TestTrustlessCarOrderAndDuplicates` to keep all optional order/dups tests together. --- tests/trustless_gateway_car_test.go | 152 ++++++++++++---------------- 1 file changed, 65 insertions(+), 87 deletions(-) diff --git a/tests/trustless_gateway_car_test.go b/tests/trustless_gateway_car_test.go index 79aad990c..7b61387b0 100644 --- a/tests/trustless_gateway_car_test.go +++ b/tests/trustless_gateway_car_test.go @@ -850,142 +850,120 @@ func TestTrustlessCarOrderAndDuplicates(t *testing.T) { InThatOrder(), ), }, - } - - RunWithSpecs(t, tests, specs.TrustlessGatewayCAROptional) -} - -func TestTrustlessCarFormatPrecedence(t *testing.T) { - tooling.LogTestGroup(t, GroupBlockCar) - - fixture := car.MustOpenUnixfsCar("gateway-raw-block.car") - - tests := SugarTests{ + // Tests for car-order and car-dups URL query parameters (IPIP-0523) { - Name: "GET with format=car query parameter takes precedence over Accept header", - Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", + Name: "GET CAR with ?format=car respects Accept header order and dups params", Hint: ` - Per IPIP-0523, the format query parameter should be preferred over the - Accept header when both are present. This test verifies that format=car - overrides Accept: application/vnd.ipld.raw. + When format=car is used, the Accept header can still provide CAR-specific + parameters like order and dups. The response MUST contain all the blocks + found during traversal even if they are duplicate. `, Request: Request(). - Path("/ipfs/{{cid}}?format=car", fixture.MustGetCid("dir")). - Headers( - Header("Accept", "application/vnd.ipld.raw"), - ), + Path("/ipfs/{{cid}}?format=car", dirWithDuplicateFiles.MustGetCid()). + Header("Accept", "application/vnd.ipld.car; version=1; order=dfs; dups=y"), Response: Expect(). Status(200). Headers( - Header("Content-Type"). - Contains("application/vnd.ipld.car"), + Header("Content-Type").Contains("application/vnd.ipld.car"), + Header("Content-Type").Contains("order=dfs"), + Header("Content-Type").Contains("dups=y"), + ). + Body( + IsCar(). + IgnoreRoots(). + HasBlock(dirWithDuplicateFiles.MustGetCid()). + HasBlock(dirWithDuplicateFiles.MustGetCid("ascii.txt")). + HasBlock(dirWithDuplicateFiles.MustGetCid("ascii-copy.txt")). + HasBlock(dirWithDuplicateFiles.MustGetCid("hello.txt")). + HasBlock(dirWithDuplicateFiles.MustGetCid("multiblock.txt")). + HasBlocks(multiblockCIDs...). + Exactly(). + InThatOrder(), ), }, { - Name: "GET with format=raw query parameter takes precedence over Accept header", - Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", + Name: "GET CAR with ?car-order=dfs takes precedence over order=unk in Accept", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-order-request-query-parameter", Hint: ` - Per IPIP-0523, the format query parameter should be preferred over the - Accept header when both are present. This test verifies that format=raw - overrides Accept: application/vnd.ipld.car. + Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. + When car-order=dfs is in URL and order=unk is in Accept, response should have order=dfs. `, Request: Request(). - Path("/ipfs/{{cid}}?format=raw", fixture.MustGetCid("dir")). - Headers( - Header("Accept", "application/vnd.ipld.car"), - ), + Path("/ipfs/{{cid}}?format=car&car-order=dfs", dirWithDuplicateFiles.MustGetCid()). + Header("Accept", "application/vnd.ipld.car; order=unk"), Response: Expect(). Status(200). Headers( - Header("Content-Type"). - Equals("application/vnd.ipld.raw"), + Header("Content-Type").Contains("application/vnd.ipld.car"), + Header("Content-Type").Contains("order=dfs"), ), }, - } - - RunWithSpecs(t, tests, specs.TrustlessGatewayCAR) -} - -func TestTrustlessCarParamPrecedence(t *testing.T) { - tooling.LogTestGroup(t, GroupBlockCar) - - fixture := car.MustOpenUnixfsCar("gateway-raw-block.car") - dirWithDuplicateFiles := car.MustOpenUnixfsCar("trustless_gateway_car/dir-with-duplicate-files.car") - multiblockCIDs := []string{ - "bafkreie5noke3mb7hqxukzcy73nl23k6lxszxi5w3dtmuwz62wnvkpsscm", - "bafkreih4ephajybraj6wnxsbwjwa77fukurtpl7oj7t7pfq545duhot7cq", - "bafkreigu7buvm3cfunb35766dn7tmqyh2um62zcio63en2btvxuybgcpue", - "bafkreicll3huefkc3qnrzeony7zcfo7cr3nbx64hnxrqzsixpceg332fhe", - "bafkreifst3pqztuvj57lycamoi7z34b4emf7gawxs74nwrc2c7jncmpaqm", - } - - tests := SugarTests{ { - Name: "GET CAR with format=car respects Accept header CAR content type parameters", + Name: "GET CAR with ?car-dups=y takes precedence over dups=n in Accept", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-dups-request-query-parameter", Hint: ` - When format=car is used, the Accept header can still provide CAR-specific - parameters like order and dups. The response MUST contain all the blocks - found during traversal even if they are duplicate. + Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. + When car-dups=y is in URL and dups=n is in Accept, response should have dups=y. `, Request: Request(). - Path("/ipfs/{{cid}}?format=car", dirWithDuplicateFiles.MustGetCid()). - Header("Accept", "application/vnd.ipld.car; version=1; order=dfs; dups=y"), + Path("/ipfs/{{cid}}?format=car&car-dups=y", dirWithDuplicateFiles.MustGetCid()). + Header("Accept", "application/vnd.ipld.car; dups=n"), Response: Expect(). Status(200). Headers( Header("Content-Type").Contains("application/vnd.ipld.car"), - Header("Content-Type").Contains("order=dfs"), Header("Content-Type").Contains("dups=y"), - ). - Body( - IsCar(). - IgnoreRoots(). - HasBlock(dirWithDuplicateFiles.MustGetCid()). - HasBlock(dirWithDuplicateFiles.MustGetCid("ascii.txt")). - HasBlock(dirWithDuplicateFiles.MustGetCid("ascii-copy.txt")). - HasBlock(dirWithDuplicateFiles.MustGetCid("hello.txt")). - HasBlock(dirWithDuplicateFiles.MustGetCid("multiblock.txt")). - HasBlocks(multiblockCIDs...). - Exactly(). - InThatOrder(), ), }, + } + + RunWithSpecs(t, tests, specs.TrustlessGatewayCAROptional) +} + +func TestTrustlessCarFormatPrecedence(t *testing.T) { + tooling.LogTestGroup(t, GroupBlockCar) + + fixture := car.MustOpenUnixfsCar("gateway-raw-block.car") + + tests := SugarTests{ { - Name: "GET CAR with car-order=dfs in URL takes precedence over order=unk in Accept", - Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-order-request-query-parameter", + Name: "GET with format=car query parameter takes precedence over Accept header", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", Hint: ` - Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. - When car-order=dfs is in URL and order=unk is in Accept, response should have order=dfs. + Per IPIP-0523, the format query parameter should be preferred over the + Accept header when both are present. This test verifies that format=car + overrides Accept: application/vnd.ipld.raw. `, Request: Request(). - Path("/ipfs/{{cid}}?format=car&car-order=dfs", fixture.MustGetCid("dir")). + Path("/ipfs/{{cid}}?format=car", fixture.MustGetCid("dir")). Headers( - Header("Accept", "application/vnd.ipld.car; order=unk"), + Header("Accept", "application/vnd.ipld.raw"), ), Response: Expect(). Status(200). Headers( - Header("Content-Type").Contains("application/vnd.ipld.car"), - Header("Content-Type").Contains("order=dfs"), + Header("Content-Type"). + Contains("application/vnd.ipld.car"), ), }, { - Name: "GET CAR with car-dups=y in URL takes precedence over dups=n in Accept", - Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#car-dups-request-query-parameter", + Name: "GET with format=raw query parameter takes precedence over Accept header", + Spec: "https://specs.ipfs.tech/http-gateways/trustless-gateway/#format-request-query-parameter", Hint: ` - Per IPIP-0523, URL query parameters should take precedence over Accept header parameters. - When car-dups=y is in URL and dups=n is in Accept, response should have dups=y. + Per IPIP-0523, the format query parameter should be preferred over the + Accept header when both are present. This test verifies that format=raw + overrides Accept: application/vnd.ipld.car. `, Request: Request(). - Path("/ipfs/{{cid}}?format=car&car-dups=y", fixture.MustGetCid("dir")). + Path("/ipfs/{{cid}}?format=raw", fixture.MustGetCid("dir")). Headers( - Header("Accept", "application/vnd.ipld.car; dups=n"), + Header("Accept", "application/vnd.ipld.car"), ), Response: Expect(). Status(200). Headers( - Header("Content-Type").Contains("application/vnd.ipld.car"), - Header("Content-Type").Contains("dups=y"), + Header("Content-Type"). + Equals("application/vnd.ipld.raw"), ), }, } From 22452a4ec6f2bd2ed5af9131b5d706f509e8aa38 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 4 Feb 2026 01:08:43 +0100 Subject: [PATCH 5/6] docs: add changelog for v0.9.0 --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 947d9f706..7d7c0e41c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,10 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.9.0] - YYYY-MM-DD +### Changed +- [IPIP-523](https://github.com/ipfs/specs/pull/523): `?format=` URL query parameter now takes precedence over `Accept` HTTP header. URL query parameters for CAR options (`car-version`, `car-order`, `car-dups`) also take precedence over parameters in the `Accept` header. [#252](https://github.com/ipfs/gateway-conformance/pull/252) + ## [0.8.4] - 2025-12-12 ### Fixed - Prevent panic in report template when dump fails, allowing test reports to render gracefully on timeouts. [#253](https://github.com/ipfs/gateway-conformance/pull/253) From cd68d0026333dfedec6ff5f7fd14608387bdef13 Mon Sep 17 00:00:00 2001 From: Marcin Rataj Date: Wed, 4 Feb 2026 01:25:06 +0100 Subject: [PATCH 6/6] fix(ci): clone+build kubo instead of go install --- .github/workflows/test-kubo-e2e.yml | 16 ++++++++++++---- CHANGELOG.md | 2 +- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/.github/workflows/test-kubo-e2e.yml b/.github/workflows/test-kubo-e2e.yml index 270f1022f..e7b7a5b6a 100644 --- a/.github/workflows/test-kubo-e2e.yml +++ b/.github/workflows/test-kubo-e2e.yml @@ -31,10 +31,18 @@ jobs: uses: ./gateway-conformance/.github/actions/extract-fixtures with: output: fixtures - - run: go install github.com/ipfs/kubo/cmd/ipfs@${{ matrix.target }} - shell: bash - env: - GOPROXY: direct + - name: Build and install Kubo + run: | + # clone+build instead of go install to avoid issues with exclude directives in go.mod + git clone --depth 1 https://github.com/ipfs/kubo.git "$RUNNER_TEMP/kubo" + cd "$RUNNER_TEMP/kubo" + if [[ "${{ matrix.target }}" == "latest" ]]; then + LATEST_TAG=$(curl -s https://api.github.com/repos/ipfs/kubo/releases/latest | jq -r '.tag_name') + git fetch --depth 1 origin tag "$LATEST_TAG" + git checkout "$LATEST_TAG" + fi + make build + make install - name: Configure Kubo Gateway run: | ipfs init; diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d7c0e41c..a305254eb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [0.9.0] - YYYY-MM-DD +## [0.9.0] - 2026-02-04 ### Changed - [IPIP-523](https://github.com/ipfs/specs/pull/523): `?format=` URL query parameter now takes precedence over `Accept` HTTP header. URL query parameters for CAR options (`car-version`, `car-order`, `car-dups`) also take precedence over parameters in the `Accept` header. [#252](https://github.com/ipfs/gateway-conformance/pull/252)