aboutsummaryrefslogtreecommitdiffstats
path: root/swarm/api/http/error.go
diff options
context:
space:
mode:
authorholisticode <holistic.computing@gmail.com>2017-10-06 21:45:54 +0800
committerFelix Lange <fjl@users.noreply.github.com>2017-10-06 21:45:54 +0800
commit1ae0411d419d2178727048021f8dc09b6ccd1d82 (patch)
treee1958ecbcad5581d27c56afd5c03258309e19861 /swarm/api/http/error.go
parentd54e3539d453c78e30d950706f6465743723a33c (diff)
downloaddexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar.gz
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar.bz2
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar.lz
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar.xz
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.tar.zst
dexon-1ae0411d419d2178727048021f8dc09b6ccd1d82.zip
swarm/api: fixed 404 handling on missing default entry (#15139)
Diffstat (limited to 'swarm/api/http/error.go')
-rw-r--r--swarm/api/http/error.go46
1 files changed, 42 insertions, 4 deletions
diff --git a/swarm/api/http/error.go b/swarm/api/http/error.go
index ebb5e3ebe..b4d46b3c4 100644
--- a/swarm/api/http/error.go
+++ b/swarm/api/http/error.go
@@ -25,9 +25,11 @@ import (
"fmt"
"html/template"
"net/http"
+ "strings"
"time"
"github.com/ethereum/go-ethereum/log"
+ "github.com/ethereum/go-ethereum/swarm/api"
)
//templateMap holds a mapping of an HTTP error code to a template
@@ -51,12 +53,14 @@ func initErrHandling() {
//pages are saved as strings - get these strings
genErrPage := GetGenericErrorPage()
notFoundPage := GetNotFoundErrorPage()
+ multipleChoicesPage := GetMultipleChoicesErrorPage()
//map the codes to the available pages
tnames := map[int]string{
- 0: genErrPage, //default
- 400: genErrPage,
- 404: notFoundPage,
- 500: genErrPage,
+ 0: genErrPage, //default
+ http.StatusBadRequest: genErrPage,
+ http.StatusNotFound: notFoundPage,
+ http.StatusMultipleChoices: multipleChoicesPage,
+ http.StatusInternalServerError: genErrPage,
}
templateMap = make(map[int]*template.Template)
for code, tname := range tnames {
@@ -65,6 +69,40 @@ func initErrHandling() {
}
}
+//ShowMultipeChoices is used when a user requests a resource in a manifest which results
+//in ambiguous results. It returns a HTML page with clickable links of each of the entry
+//in the manifest which fits the request URI ambiguity.
+//For example, if the user requests bzz:/<hash>/read and that manifest containes entries
+//"readme.md" and "readinglist.txt", a HTML page is returned with this two links.
+//This only applies if the manifest has no default entry
+func ShowMultipleChoices(w http.ResponseWriter, r *http.Request, list api.ManifestList) {
+ msg := ""
+ if list.Entries == nil {
+ ShowError(w, r, "Internal Server Error", http.StatusInternalServerError)
+ return
+ }
+ //make links relative
+ //requestURI comes with the prefix of the ambiguous path, e.g. "read" for "readme.md" and "readinglist.txt"
+ //to get clickable links, need to remove the ambiguous path, i.e. "read"
+ idx := strings.LastIndex(r.RequestURI, "/")
+ if idx == -1 {
+ ShowError(w, r, "Internal Server Error", http.StatusInternalServerError)
+ return
+ }
+ //remove ambiguous part
+ base := r.RequestURI[:idx+1]
+ for _, e := range list.Entries {
+ //create clickable link for each entry
+ msg += "<a href='" + base + e.Path + "'>" + e.Path + "</a><br/>"
+ }
+ respond(w, r, &ErrorParams{
+ Code: http.StatusMultipleChoices,
+ Details: template.HTML(msg),
+ Timestamp: time.Now().Format(time.RFC1123),
+ template: getTemplate(http.StatusMultipleChoices),
+ })
+}
+
//ShowError is used to show an HTML error page to a client.
//If there is an `Accept` header of `application/json`, JSON will be returned instead
//The function just takes a string message which will be displayed in the error page.