diff --git a/core/corehttp/gateway_handler.go b/core/corehttp/gateway_handler.go index a1549efddb6f..b9e7f144b9d9 100644 --- a/core/corehttp/gateway_handler.go +++ b/core/corehttp/gateway_handler.go @@ -328,8 +328,20 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request size = humanize.Bytes(uint64(s)) } + hash := "" + if r, err := i.api.ResolvePath(r.Context(), ipath.Join(resolvedPath, dirit.Name())); err == nil { + // Path may not be resolved. Continue anyways. + hash = r.Cid().String() + } + // See comment above where originalUrlPath is declared. - di := directoryItem{size, dirit.Name(), gopath.Join(originalUrlPath, dirit.Name())} + di := directoryItem{ + Size: size, + Name: dirit.Name(), + Path: gopath.Join(originalUrlPath, dirit.Name()), + Hash: hash, + ShortHash: shortHash(hash), + } dirListing = append(dirListing, di) } if dirit.Err() != nil { @@ -359,14 +371,34 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request } } + size := "?" + if s, err := dir.Size(); err == nil { + // Size may not be defined/supported. Continue anyways. + size = humanize.Bytes(uint64(s)) + } + hash := resolvedPath.Cid().String() + // Storage for gateway URL to be used when linking to other rootIDs. This + // will be blank unless subdomain resolution is being used for this request. + var gwURL string + + // Get gateway hostname and build gateway URL. + if h, ok := r.Context().Value("gw-hostname").(string); ok { + gwURL = "//" + h + } else { + gwURL = "" + } + // See comment above where originalUrlPath is declared. tplData := listingTemplateData{ - Listing: dirListing, - Path: urlPath, - BackLink: backLink, - Hash: hash, + GatewayURL: gwURL, + Listing: dirListing, + Size: size, + Path: urlPath, + Breadcrumbs: breadcrumbs(urlPath), + BackLink: backLink, + Hash: hash, } err = listingTemplate.Execute(w, tplData) diff --git a/core/corehttp/gateway_indexPage.go b/core/corehttp/gateway_indexPage.go index 5575baea457a..c9a948708b9f 100644 --- a/core/corehttp/gateway_indexPage.go +++ b/core/corehttp/gateway_indexPage.go @@ -7,22 +7,61 @@ import ( "strings" "github.com/ipfs/go-ipfs/assets" + ipfspath "github.com/ipfs/go-path" ) // structs for directory listing type listingTemplateData struct { - Listing []directoryItem - Path string - BackLink string - Hash string + GatewayURL string + Listing []directoryItem + Size string + Path string + Breadcrumbs []breadcrumb + BackLink string + Hash string } type directoryItem struct { - Size string + Size string + Name string + Path string + Hash string + ShortHash string +} + +type breadcrumb struct { Name string Path string } +func breadcrumbs(urlPath string) []breadcrumb { + var ret []breadcrumb + + p, err := ipfspath.ParsePath(urlPath) + if err != nil { + // No breadcrumbs, fallback to bare Path in template + return ret + } + + segs := p.Segments() + for i, seg := range segs { + if i == 0 { + ret = append(ret, breadcrumb{Name: seg}) + } else { + ret = append(ret, breadcrumb{ + Name: seg, + Path: "/" + strings.Join(segs[0:i+1], "/"), + }) + } + } + + return ret +} + +func shortHash(hash string) string { + return (hash[0:4] + "\u2026" + hash[len(hash)-4:]) +} + var listingTemplate *template.Template func init() { diff --git a/core/corehttp/hostname.go b/core/corehttp/hostname.go index d8656da23ec1..527f99ac15e2 100644 --- a/core/corehttp/hostname.go +++ b/core/corehttp/hostname.go @@ -141,6 +141,10 @@ func HostnameOption() ServeOption { if gw, hostname, ns, rootID, ok := knownSubdomainDetails(r.Host, knownGateways); ok { // Looks like we're using known subdomain gateway. + // Add gateway hostname context for linking to other root ids. + // Example: localhost/ipfs/{cid} + ctx := context.WithValue(r.Context(), "gw-hostname", hostname) + // Assemble original path prefix. pathPrefix := "/" + ns + "/" + rootID @@ -167,7 +171,7 @@ func HostnameOption() ServeOption { r.URL.Path = pathPrefix + r.URL.Path // Serve path request - childMux.ServeHTTP(w, r) + childMux.ServeHTTP(w, r.WithContext(ctx)) return } // We don't have a known gateway. Fallback on DNSLink lookup