diff options
author | holisticode <holistic.computing@gmail.com> | 2017-10-06 21:45:54 +0800 |
---|---|---|
committer | Felix Lange <fjl@users.noreply.github.com> | 2017-10-06 21:45:54 +0800 |
commit | 1ae0411d419d2178727048021f8dc09b6ccd1d82 (patch) | |
tree | e1958ecbcad5581d27c56afd5c03258309e19861 /swarm/api/http/error.go | |
parent | d54e3539d453c78e30d950706f6465743723a33c (diff) | |
download | dexon-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.go | 46 |
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. |