@@ -11,12 +11,9 @@ import (
1111 "github.com/dustin/go-humanize"
1212 cid "github.com/ipfs/go-cid"
1313 files "github.com/ipfs/go-ipfs-files"
14- format "github.com/ipfs/go-ipld-format"
15- merkledag "github.com/ipfs/go-merkledag"
1614 path "github.com/ipfs/go-path"
1715 "github.com/ipfs/go-path/resolver"
18- "github.com/ipfs/go-unixfs"
19- "github.com/ipfs/go-unixfs/hamt"
16+ options "github.com/ipfs/interface-go-ipfs-core/options"
2017 ipath "github.com/ipfs/interface-go-ipfs-core/path"
2118 "github.com/ipfs/kubo/assets"
2219 "github.com/ipfs/kubo/tracing"
@@ -108,17 +105,26 @@ func (i *gatewayHandler) serveDirectory(ctx context.Context, w http.ResponseWrit
108105 return
109106 }
110107
111- // Optimization: use Dag.Get to fetch the children links of this directory
112- // instead of UnixFS.LS. Dag.Get is faster and also provides a Size field
113- // that is good enough for a directory listing.
114- links , err := i .getUnixFsLinks (ctx , resolvedPath .Cid ())
108+ // Optimization: use Unixfs.Ls without resolving children, but using the
109+ // cumulative DAG size as the file size. This allows for a fast listing
110+ // while keeping a good enough Size field.
111+ results , err := i .api .Unixfs ().Ls (ctx ,
112+ resolvedPath ,
113+ options .Unixfs .ResolveChildren (false ),
114+ options .Unixfs .UseCumulativeSize (true ),
115+ )
115116 if err != nil {
116117 internalWebError (w , err )
117118 return
118119 }
119120
120- dirListing := make ([]directoryItem , 0 , len (links ))
121- for _ , link := range links {
121+ dirListing := make ([]directoryItem , 0 , len (results ))
122+ for link := range results {
123+ if link .Err != nil {
124+ internalWebError (w , err )
125+ return
126+ }
127+
122128 hash := link .Cid .String ()
123129 di := directoryItem {
124130 Size : humanize .Bytes (uint64 (link .Size )),
@@ -202,36 +208,3 @@ func (i *gatewayHandler) serveDirectory(ctx context.Context, w http.ResponseWrit
202208func getDirListingEtag (dirCid cid.Cid ) string {
203209 return `"DirIndex-` + assets .AssetHash + `_CID-` + dirCid .String () + `"`
204210}
205-
206- func (i * gatewayHandler ) getUnixFsLinks (ctx context.Context , cid cid.Cid ) ([]* format.Link , error ) {
207- obj , err := i .api .Dag ().Get (ctx , cid )
208- if err != nil {
209- return nil , err
210- }
211-
212- protoNode , ok := obj .(* merkledag.ProtoNode )
213- if ! ok {
214- return obj .Links (), nil
215- }
216-
217- fsNode , err := unixfs .FSNodeFromBytes (protoNode .Data ())
218- if err != nil {
219- return nil , err
220- }
221-
222- if fsNode .Type () == unixfs .THAMTShard {
223- shard , err := hamt .NewHamtFromDag (i .api .Dag (), obj )
224- if err != nil {
225- return nil , err
226- }
227-
228- links , err := shard .EnumLinks (ctx )
229- if err != nil {
230- return nil , err
231- }
232-
233- return links , nil
234- } else {
235- return obj .Links (), nil
236- }
237- }
0 commit comments