diff --git a/core/corehttp/gateway_handler.go b/core/corehttp/gateway_handler.go index d26f21d54a2..f6727d63f5b 100644 --- a/core/corehttp/gateway_handler.go +++ b/core/corehttp/gateway_handler.go @@ -342,6 +342,15 @@ func (i *gatewayHandler) getOrHeadHandler(w http.ResponseWriter, r *http.Request BackLink: backLink, Hash: hash, } + + // See statusResponseWriter.WriteHeader + // and https://github.com/ipfs/go-ipfs/issues/7164 + // Note: this needs to occur before listingTemplate.Execute otherwise we get + // superfluous response.WriteHeader call from prometheus/client_golang + if w.Header().Get("Location") != "" { + w.WriteHeader(http.StatusMovedPermanently) + } + err = listingTemplate.Execute(w, tplData) if err != nil { internalWebError(w, err) diff --git a/test/sharness/t0114-gateway-subdomains.sh b/test/sharness/t0114-gateway-subdomains.sh index d079f56e6c7..426ed2e92e2 100755 --- a/test/sharness/t0114-gateway-subdomains.sh +++ b/test/sharness/t0114-gateway-subdomains.sh @@ -145,7 +145,7 @@ test_localhost_gateway_response_should_contain \ # payload directly, but redirect to URL with proper origin isolation test_localhost_gateway_response_should_contain \ - "request for localhost/ipfs/{CIDv1} returns status code HTTP 301" \ + "request for localhost/ipfs/{CIDv1} returns HTTP 301 Moved Permanently" \ "http://localhost:$GWAY_PORT/ipfs/$CIDv1" \ "301 Moved Permanently" @@ -154,6 +154,16 @@ test_localhost_gateway_response_should_contain \ "http://localhost:$GWAY_PORT/ipfs/$CIDv1" \ "Location: http://$CIDv1.ipfs.localhost:$GWAY_PORT/" +test_localhost_gateway_response_should_contain \ + "request for localhost/ipfs/{DIR_CID} returns HTTP 301 Moved Permanently" \ + "http://localhost:$GWAY_PORT/ipfs/$DIR_CID" \ + "301 Moved Permanently" + +test_localhost_gateway_response_should_contain \ + "request for localhost/ipfs/{DIR_CID} returns Location HTTP header for subdomain redirect in browsers" \ + "http://localhost:$GWAY_PORT/ipfs/$DIR_CID/" \ + "Location: http://$DIR_CID.ipfs.localhost:$GWAY_PORT/" + # Responses to the root domain of subdomain gateway hostname should Clear-Site-Data # https://github.com/ipfs/go-ipfs/issues/6975#issuecomment-597472477 test_localhost_gateway_response_should_contain \