Skip to content

Commit 9ad1559

Browse files
committed
chore: go-trustless-utils@0.2
1 parent c10d797 commit 9ad1559

File tree

7 files changed

+110
-29
lines changed

7 files changed

+110
-29
lines changed

go.mod

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,11 @@ require (
2222
github.com/ipfs/go-ipld-format v0.6.0
2323
github.com/ipfs/go-log/v2 v2.5.1
2424
github.com/ipfs/go-unixfsnode v1.8.0
25-
github.com/ipld/go-car/v2 v2.11.0
25+
github.com/ipld/go-car/v2 v2.13.1
2626
github.com/ipld/go-codec-dagpb v1.6.0
2727
github.com/ipld/go-ipld-prime v0.21.0
28-
github.com/ipld/go-trustless-utils v0.0.0
29-
github.com/ipld/ipld/specs v0.0.0-20230826120441-91918996e8eb
28+
github.com/ipld/go-trustless-utils v0.2.0
29+
github.com/ipld/ipld/specs v0.0.0-20230907004443-0e4ff95ff474
3030
github.com/ipni/go-libipni v0.0.8-0.20230425184153-86a1fcb7f7ff
3131
github.com/libp2p/go-libp2p v0.30.0
3232
github.com/libp2p/go-libp2p-routing-helpers v0.7.0
@@ -90,7 +90,7 @@ require (
9090
github.com/ipfs/go-ipfs-ds-help v1.1.0 // indirect
9191
github.com/ipfs/go-ipfs-pq v0.0.3 // indirect
9292
github.com/ipfs/go-ipfs-util v0.0.2 // indirect
93-
github.com/ipfs/go-ipld-cbor v0.0.6 // indirect
93+
github.com/ipfs/go-ipld-cbor v0.1.0 // indirect
9494
github.com/ipfs/go-log v1.0.5 // indirect
9595
github.com/ipfs/go-metrics-interface v0.0.1 // indirect
9696
github.com/ipfs/go-peertaskqueue v0.8.1 // indirect
@@ -149,7 +149,7 @@ require (
149149
github.com/spaolacci/murmur3 v1.1.0 // indirect
150150
github.com/warpfork/go-testmark v0.12.1 // indirect
151151
github.com/whyrusleeping/cbor v0.0.0-20171005072247-63513f603b11 // indirect
152-
github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa // indirect
152+
github.com/whyrusleeping/cbor-gen v0.0.0-20230818171029-f91ae536ca25 // indirect
153153
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f // indirect
154154
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 // indirect
155155
go.opentelemetry.io/otel/sdk v1.14.0 // indirect

go.sum

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -288,8 +288,9 @@ github.com/ipfs/go-ipld-cbor v0.0.3/go.mod h1:wTBtrQZA3SoFKMVkp6cn6HMRteIB1VsmHA
288288
github.com/ipfs/go-ipld-cbor v0.0.4/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
289289
github.com/ipfs/go-ipld-cbor v0.0.5/go.mod h1:BkCduEx3XBCO6t2Sfo5BaHzuok7hbhdMm9Oh8B2Ftq4=
290290
github.com/ipfs/go-ipld-cbor v0.0.6-0.20211211231443-5d9b9e1f6fa8/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA=
291-
github.com/ipfs/go-ipld-cbor v0.0.6 h1:pYuWHyvSpIsOOLw4Jy7NbBkCyzLDcl64Bf/LZW7eBQ0=
292291
github.com/ipfs/go-ipld-cbor v0.0.6/go.mod h1:ssdxxaLJPXH7OjF5V4NSjBbcfh+evoR4ukuru0oPXMA=
292+
github.com/ipfs/go-ipld-cbor v0.1.0 h1:dx0nS0kILVivGhfWuB6dUpMa/LAwElHPw1yOGYopoYs=
293+
github.com/ipfs/go-ipld-cbor v0.1.0/go.mod h1:U2aYlmVrJr2wsUBU67K4KgepApSZddGRDWBYR0H4sCk=
293294
github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dCDnkOJhcZkms=
294295
github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k=
295296
github.com/ipfs/go-ipld-format v0.6.0 h1:VEJlA2kQ3LqFSIm5Vu6eIlSxD/Ze90xtc4Meten1F5U=
@@ -317,17 +318,17 @@ github.com/ipfs/go-unixfs v0.4.5 h1:wj8JhxvV1G6CD7swACwSKYa+NgtdWC1RUit+gFnymDU=
317318
github.com/ipfs/go-unixfsnode v1.8.0 h1:yCkakzuE365glu+YkgzZt6p38CSVEBPgngL9ZkfnyQU=
318319
github.com/ipfs/go-unixfsnode v1.8.0/go.mod h1:HxRu9HYHOjK6HUqFBAi++7DVoWAHn0o4v/nZ/VA+0g8=
319320
github.com/ipfs/go-verifcid v0.0.2 h1:XPnUv0XmdH+ZIhLGKg6U2vaPaRDXb9urMyNVCE7uvTs=
320-
github.com/ipld/go-car/v2 v2.11.0 h1:lkAPwbbTFqbdfawgm+bfmFc8PjGC7D12VcaLXPCLNfM=
321-
github.com/ipld/go-car/v2 v2.11.0/go.mod h1:aDszqev0zjtU8l96g4lwXHaU9bzArj56Y7eEN0q/xqA=
321+
github.com/ipld/go-car/v2 v2.13.1 h1:KnlrKvEPEzr5IZHKTXLAEub+tPrzeAFQVRlSQvuxBO4=
322+
github.com/ipld/go-car/v2 v2.13.1/go.mod h1:QkdjjFNGit2GIkpQ953KBwowuoukoM75nP/JI1iDJdo=
322323
github.com/ipld/go-codec-dagpb v1.6.0 h1:9nYazfyu9B1p3NAgfVdpRco3Fs2nFC72DqVsMj6rOcc=
323324
github.com/ipld/go-codec-dagpb v1.6.0/go.mod h1:ANzFhfP2uMJxRBr8CE+WQWs5UsNa0pYtmKZ+agnUw9s=
324325
github.com/ipld/go-ipld-prime v0.21.0 h1:n4JmcpOlPDIxBcY037SVfpd1G+Sj1nKZah0m6QH9C2E=
325326
github.com/ipld/go-ipld-prime v0.21.0/go.mod h1:3RLqy//ERg/y5oShXXdx5YIp50cFGOanyMctpPjsvxQ=
326327
github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20230102063945-1a409dc236dd h1:gMlw/MhNr2Wtp5RwGdsW23cs+yCuj9k2ON7i9MiJlRo=
327-
github.com/ipld/go-trustless-utils v0.0.0 h1:X+hY7lWZSd6kdBGfmGtEIjCUeqETaeahMKjont7+OGo=
328-
github.com/ipld/go-trustless-utils v0.0.0/go.mod h1:rqvDGdgk2acsKiGyV5mzCZZRK8JtnEZqvUBxLuYxR6A=
329-
github.com/ipld/ipld/specs v0.0.0-20230826120441-91918996e8eb h1:5ARxkQ9NqZq33RM7i/Eq3bvBj2RBxx2xE63hqfa+9KY=
330-
github.com/ipld/ipld/specs v0.0.0-20230826120441-91918996e8eb/go.mod h1:AfGlAr20WOjV5PyCowEnGY3pAm5x5i+o0R8IUeir6cs=
328+
github.com/ipld/go-trustless-utils v0.2.0 h1:XPP2gJJ2snhWiwP8m5Gw66pmTSMHAERxo/DMV1NVOkU=
329+
github.com/ipld/go-trustless-utils v0.2.0/go.mod h1:nbUA6YuKZqNHYd3mYKALxOQa5aC8fnr2w+OxirSSOqc=
330+
github.com/ipld/ipld/specs v0.0.0-20230907004443-0e4ff95ff474 h1:CiDtcUFyzRwhKyiS4Gn+fzdraMoNVtPHd+wVIekExPc=
331+
github.com/ipld/ipld/specs v0.0.0-20230907004443-0e4ff95ff474/go.mod h1:WcT0DfRe+e2QFY0kcbsOnuT6jL5Q0JNZ83I5DHIdStg=
331332
github.com/ipni/go-libipni v0.0.8-0.20230425184153-86a1fcb7f7ff h1:xbKrIvnpQkbF8iHPk/HGcegsypCDpcXWHhzBCLyCWf8=
332333
github.com/ipni/go-libipni v0.0.8-0.20230425184153-86a1fcb7f7ff/go.mod h1:paYP9U4N3/vOzGCuN9kU972vtvw9JUcQjOKyiCFGwRk=
333334
github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c=
@@ -608,8 +609,8 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200812213548-958ddffe352c/go.mod h1:f
608609
github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
609610
github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
610611
github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
611-
github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa h1:EyA027ZAkuaCLoxVX4r1TZMPy1d31fM6hbfQ4OU4I5o=
612-
github.com/whyrusleeping/cbor-gen v0.0.0-20230126041949-52956bd4c9aa/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
612+
github.com/whyrusleeping/cbor-gen v0.0.0-20230818171029-f91ae536ca25 h1:yVYDLoN2gmB3OdBXFW8e1UwgVbmCvNlnAKhvHPaNARI=
613+
github.com/whyrusleeping/cbor-gen v0.0.0-20230818171029-f91ae536ca25/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ=
613614
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E=
614615
github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8=
615616
github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM=

pkg/internal/itest/http_fetch_test.go

Lines changed: 84 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import (
3434
cidlink "github.com/ipld/go-ipld-prime/linking/cid"
3535
"github.com/ipld/go-ipld-prime/storage/memstore"
3636
selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse"
37+
trustlesshttp "github.com/ipld/go-trustless-utils/http"
3738
"github.com/ipld/go-trustless-utils/traversal"
3839
"github.com/libp2p/go-libp2p/core/peer"
3940
"github.com/multiformats/go-multicodec"
@@ -79,6 +80,7 @@ func TestHttpFetch(t *testing.T) {
7980
modifyQueries []queryModifier
8081
validateBodies []bodyValidator
8182
lassieOpts lassieOptsGen
83+
expectNoDups bool
8284
}{
8385
{
8486
name: "graphsync large sharded file",
@@ -904,9 +906,57 @@ func TestHttpFetch(t *testing.T) {
904906
}},
905907
},
906908
{
907-
name: "http large sharded file with dups, no dups response requested",
909+
name: "http large sharded file with dups, no dups response requested",
910+
httpRemotes: 1,
911+
setHeader: noDups,
912+
expectNoDups: true,
913+
generate: func(t *testing.T, rndReader io.Reader, remotes []testpeer.TestPeer) []unixfs.DirEntry {
914+
return []unixfs.DirEntry{unixfs.GenerateFile(t, remotes[0].LinkSystem, testutil.ZeroReader{}, 4<<20)}
915+
},
916+
validateBodies: []bodyValidator{func(t *testing.T, srcData unixfs.DirEntry, body []byte) {
917+
wantCids := []cid.Cid{
918+
srcData.Root, // "/""
919+
srcData.SelfCids[1],
920+
srcData.SelfCids[len(srcData.SelfCids)-1],
921+
}
922+
validateCarBody(t, body, srcData.Root, wantCids, true)
923+
}},
924+
},
925+
{
926+
name: "http large sharded file with dups, */* gives dups",
908927
httpRemotes: 1,
909-
setHeader: noDups,
928+
setHeader: func(h http.Header) { h.Set("Accept", "*/*") },
929+
generate: func(t *testing.T, rndReader io.Reader, remotes []testpeer.TestPeer) []unixfs.DirEntry {
930+
return []unixfs.DirEntry{unixfs.GenerateFile(t, remotes[0].LinkSystem, testutil.ZeroReader{}, 4<<20)}
931+
},
932+
validateBodies: []bodyValidator{func(t *testing.T, srcData unixfs.DirEntry, body []byte) {
933+
store := &testutil.CorrectedMemStore{ParentStore: &memstore.Store{
934+
Bag: make(map[string][]byte),
935+
}}
936+
lsys := cidlink.DefaultLinkSystem()
937+
lsys.SetReadStorage(store)
938+
lsys.SetWriteStorage(store)
939+
_, err := traversal.Config{
940+
Root: srcData.Root,
941+
Selector: selectorparse.CommonSelector_ExploreAllRecursively,
942+
ExpectDuplicatesIn: true,
943+
}.VerifyCar(context.Background(), bytes.NewReader(body), lsys)
944+
require.NoError(t, err)
945+
}},
946+
}, {
947+
name: "http large sharded file with dups, multiple accept, priority to no dups",
948+
httpRemotes: 1,
949+
expectNoDups: true,
950+
setHeader: func(h http.Header) {
951+
h.Set("Accept",
952+
strings.Join([]string{
953+
"text/html",
954+
trustlesshttp.DefaultContentType().WithDuplicates(true).WithQuality(0.7).String(),
955+
trustlesshttp.DefaultContentType().WithDuplicates(false).WithQuality(0.8).String(),
956+
"*/*;q=0.1",
957+
}, ", "),
958+
)
959+
},
910960
generate: func(t *testing.T, rndReader io.Reader, remotes []testpeer.TestPeer) []unixfs.DirEntry {
911961
return []unixfs.DirEntry{unixfs.GenerateFile(t, remotes[0].LinkSystem, testutil.ZeroReader{}, 4<<20)}
912962
},
@@ -919,6 +969,37 @@ func TestHttpFetch(t *testing.T) {
919969
validateCarBody(t, body, srcData.Root, wantCids, true)
920970
}},
921971
},
972+
{
973+
name: "http large sharded file with dups, multiple accept, priority to dups",
974+
httpRemotes: 1,
975+
setHeader: func(h http.Header) {
976+
h.Set("Accept",
977+
strings.Join([]string{
978+
"text/html",
979+
trustlesshttp.DefaultContentType().WithDuplicates(true).WithQuality(0.8).String(),
980+
trustlesshttp.DefaultContentType().WithDuplicates(false).WithQuality(0.7).String(),
981+
"*/*;q=0.1",
982+
}, ", "),
983+
)
984+
},
985+
generate: func(t *testing.T, rndReader io.Reader, remotes []testpeer.TestPeer) []unixfs.DirEntry {
986+
return []unixfs.DirEntry{unixfs.GenerateFile(t, remotes[0].LinkSystem, testutil.ZeroReader{}, 4<<20)}
987+
},
988+
validateBodies: []bodyValidator{func(t *testing.T, srcData unixfs.DirEntry, body []byte) {
989+
store := &testutil.CorrectedMemStore{ParentStore: &memstore.Store{
990+
Bag: make(map[string][]byte),
991+
}}
992+
lsys := cidlink.DefaultLinkSystem()
993+
lsys.SetReadStorage(store)
994+
lsys.SetWriteStorage(store)
995+
_, err := traversal.Config{
996+
Root: srcData.Root,
997+
Selector: selectorparse.CommonSelector_ExploreAllRecursively,
998+
ExpectDuplicatesIn: true,
999+
}.VerifyCar(context.Background(), bytes.NewReader(body), lsys)
1000+
require.NoError(t, err)
1001+
}},
1002+
},
9221003
{
9231004
name: "bitswap nested file, path with special characters",
9241005
bitswapRemotes: 1,
@@ -1141,9 +1222,7 @@ func TestHttpFetch(t *testing.T) {
11411222
req.Equal(fmt.Sprintf(`attachment; filename="%s.car"`, srcData[i].Root.String()), resp.Header.Get("Content-Disposition"))
11421223
req.Equal("none", resp.Header.Get("Accept-Ranges"))
11431224
req.Equal("public, max-age=29030400, immutable", resp.Header.Get("Cache-Control"))
1144-
ct := resp.Header.Get("Content-Type")
1145-
// TODO: check the noDups() case and assert accordingly
1146-
req.Equal("application/vnd.ipld.car; version=1; order=dfs; dups=", ct[:len(ct)-1]) // strip off y|n from the end
1225+
req.Equal(trustlesshttp.DefaultContentType().WithDuplicates(!testCase.expectNoDups).String(), resp.Header.Get("Content-Type"))
11471226
req.Equal("nosniff", resp.Header.Get("X-Content-Type-Options"))
11481227
etagStart := fmt.Sprintf(`"%s.car.`, srcData[i].Root.String())
11491228
etagGot := resp.Header.Get("ETag")

pkg/internal/itest/trustless_fetch_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import (
2727
func TestTrustlessUnixfsFetch(t *testing.T) {
2828
req := require.New(t)
2929

30-
testCases, err := trustlesspathing.Unixfs20mVarietyCases()
30+
testCases, _, err := trustlesspathing.Unixfs20mVarietyCases()
3131
req.NoError(err)
3232
storage, closer, err := trustlesspathing.Unixfs20mVarietyReadableStorage()
3333
req.NoError(err)
@@ -112,7 +112,7 @@ func TestTrustlessUnixfsFetch(t *testing.T) {
112112
req.Equal(fmt.Sprintf(`attachment; filename="%s.car"`, tc.Root.String()), resp.Header.Get("Content-Disposition"))
113113
req.Equal("none", resp.Header.Get("Accept-Ranges"))
114114
req.Equal("public, max-age=29030400, immutable", resp.Header.Get("Cache-Control"))
115-
req.Equal("application/vnd.ipld.car; version=1; order=dfs; dups=y", resp.Header.Get("Content-Type"))
115+
req.Equal("application/vnd.ipld.car;version=1;order=dfs;dups=y", resp.Header.Get("Content-Type"))
116116
req.Equal("nosniff", resp.Header.Get("X-Content-Type-Options"))
117117
etagStart := fmt.Sprintf(`"%s.car.`, tc.Root.String())
118118
etagGot := resp.Header.Get("ETag")

pkg/internal/testutil/mockroundtripper.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ func (mrt *MockRoundTripper) RoundTrip(req *http.Request) (*http.Response, error
109109
expectedScope = scope
110110
}
111111
require.Equal(mrt.t, req.URL.RawQuery, fmt.Sprintf("dag-scope=%s", expectedScope))
112-
require.Equal(mrt.t, []string{"application/vnd.ipld.car; version=1; order=dfs; dups=y"}, req.Header["Accept"])
112+
require.Equal(mrt.t, []string{"application/vnd.ipld.car;version=1;order=dfs;dups=y"}, req.Header["Accept"])
113113
reqId := req.Header["X-Request-Id"]
114114
require.Len(mrt.t, reqId, 1)
115115
_, err = uuid.Parse(reqId[0])

pkg/retriever/httpretriever.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,10 @@ func (ph *ProtocolHttp) Retrieve(
118118
return nil, ErrHttpRequestFailure{Code: resp.StatusCode}
119119
}
120120

121-
// if Content-Type is not valid, it will default to
122-
// trustlesshttp.DefaultIncludeDupes (true)
123-
_, expectDuplicates := trustlesshttp.ParseContentType(resp.Header.Get("Content-Type"))
121+
var expectDuplicates = trustlesshttp.DefaultIncludeDupes
122+
if contentType, valid := trustlesshttp.ParseContentType(resp.Header.Get("Content-Type")); valid {
123+
expectDuplicates = contentType.Duplicates
124+
} // else be permissive and just expect duplicates (DefaultIncludeDupes)
124125

125126
var ttfb time.Duration
126127
rdr := newTimeToFirstByteReader(resp.Body, func() {
@@ -188,7 +189,7 @@ func makeRequest(ctx context.Context, request types.RetrievalRequest, candidate
188189
logger.Warnf("Couldn't construct a http request %s: %v", candidate.MinerPeer.ID, err)
189190
return nil, fmt.Errorf("%w for peer %s: %v", ErrBadPathForRequest, candidate.MinerPeer.ID, err)
190191
}
191-
req.Header.Add("Accept", trustlesshttp.RequestAcceptHeader(true)) // prefer duplicates
192+
req.Header.Add("Accept", trustlesshttp.DefaultContentType().String()) // prefer duplicates
192193
req.Header.Add("X-Request-Id", request.RetrievalID.String())
193194
req.Header.Add("User-Agent", build.UserAgent)
194195

pkg/server/http/ipfs.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ func IpfsHandler(fetcher types.Fetcher, cfg HttpServerConfig) func(http.Response
8282
res.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%q", fileName))
8383
res.Header().Set("Accept-Ranges", "none")
8484
res.Header().Set("Cache-Control", trustlesshttp.ResponseCacheControlHeader)
85-
res.Header().Set("Content-Type", trustlesshttp.ResponseContentTypeHeader(request.Duplicates))
85+
res.Header().Set("Content-Type", trustlesshttp.DefaultContentType().WithDuplicates(request.Duplicates).String())
8686
res.Header().Set("Etag", request.Etag())
8787
res.Header().Set("X-Content-Type-Options", "nosniff")
8888
res.Header().Set("X-Ipfs-Path", trustlessutils.PathEscape(req.URL.Path))
@@ -163,7 +163,7 @@ func decodeRequest(res http.ResponseWriter, req *http.Request, statusLogger *sta
163163
return false, trustlessutils.Request{}
164164
}
165165

166-
includeDupes, err := trustlesshttp.CheckFormat(req)
166+
accept, err := trustlesshttp.CheckFormat(req)
167167
if err != nil {
168168
errorResponse(res, statusLogger, http.StatusBadRequest, err)
169169
return false, trustlessutils.Request{}
@@ -186,7 +186,7 @@ func decodeRequest(res http.ResponseWriter, req *http.Request, statusLogger *sta
186186
Path: path.String(),
187187
Scope: dagScope,
188188
Bytes: byteRange,
189-
Duplicates: includeDupes,
189+
Duplicates: accept.Duplicates,
190190
}
191191
}
192192

0 commit comments

Comments
 (0)