mirror of
https://github.com/tailscale/tailscale.git
synced 2025-01-07 08:07:42 +00:00
tsweb: JSONHandler: supports HTTPError
Signed-off-by: Zijie Lu <zijie@tailscale.com>
This commit is contained in:
parent
51d176ecff
commit
d1a30be275
@ -102,26 +102,33 @@ func JSONHandler(fn interface{}) http.Handler {
|
|||||||
panic("JSONHandler: number of input parameter should be 2 or 3")
|
panic("JSONHandler: number of input parameter should be 2 or 3")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var e reflect.Value
|
||||||
switch len(vs) {
|
switch len(vs) {
|
||||||
case 1:
|
case 1:
|
||||||
// todo support other error types
|
// todo support other error types
|
||||||
if vs[0].IsNil() {
|
if vs[0].IsZero() {
|
||||||
writeResponse(w, http.StatusOK, responseSuccess(nil))
|
writeResponse(w, http.StatusOK, responseSuccess(nil))
|
||||||
} else {
|
return
|
||||||
err := vs[0].Interface().(error)
|
|
||||||
writeResponse(w, http.StatusBadRequest, responseError(err.Error()))
|
|
||||||
}
|
}
|
||||||
|
e = vs[0]
|
||||||
case 2:
|
case 2:
|
||||||
if vs[1].IsNil() {
|
if vs[1].IsZero() {
|
||||||
if !vs[0].IsNil() {
|
if !vs[0].IsZero() {
|
||||||
writeResponse(w, http.StatusOK, responseSuccess(vs[0].Interface()))
|
writeResponse(w, http.StatusOK, responseSuccess(vs[0].Interface()))
|
||||||
}
|
}
|
||||||
} else {
|
return
|
||||||
err := vs[1].Interface().(error)
|
|
||||||
writeResponse(w, http.StatusBadRequest, responseError(err.Error()))
|
|
||||||
}
|
}
|
||||||
|
e = vs[1]
|
||||||
default:
|
default:
|
||||||
panic("JSONHandler: number of return values should be 1 or 2")
|
panic("JSONHandler: number of return values should be 1 or 2")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if e.Type().AssignableTo(reflect.TypeOf(HTTPError{})) {
|
||||||
|
err := e.Interface().(HTTPError)
|
||||||
|
writeResponse(w, err.Code, responseError(err.Error()))
|
||||||
|
} else {
|
||||||
|
err := e.Interface().(error)
|
||||||
|
writeResponse(w, http.StatusBadRequest, responseError(err.Error()))
|
||||||
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
@ -59,6 +59,19 @@ func TestNewJSONHandler(t *testing.T) {
|
|||||||
checkStatus(w, "success")
|
checkStatus(w, "success")
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("2 1 HTTPError", func(t *testing.T) {
|
||||||
|
h := JSONHandler(func(w http.ResponseWriter, r *http.Request) HTTPError {
|
||||||
|
return Error(http.StatusForbidden, "forbidden", nil)
|
||||||
|
})
|
||||||
|
|
||||||
|
w := httptest.NewRecorder()
|
||||||
|
r := httptest.NewRequest("GET", "/", nil)
|
||||||
|
h.ServeHTTP(w, r)
|
||||||
|
if w.Code != http.StatusForbidden {
|
||||||
|
t.Fatalf("wrong code: %d %d", w.Code, http.StatusForbidden)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
// 2 2
|
// 2 2
|
||||||
h22 := JSONHandler(func(w http.ResponseWriter, r *http.Request) (*Data, error) {
|
h22 := JSONHandler(func(w http.ResponseWriter, r *http.Request) (*Data, error) {
|
||||||
return &Data{Name: "tailscale"}, nil
|
return &Data{Name: "tailscale"}, nil
|
||||||
|
Loading…
x
Reference in New Issue
Block a user