tsweb: JSONHandler: supports HTTPError

Signed-off-by: Zijie Lu <zijie@tailscale.com>
This commit is contained in:
Zijie Lu
2020-06-09 17:40:45 -04:00
parent 51d176ecff
commit d1a30be275
2 changed files with 29 additions and 9 deletions
+16 -9
View File
@@ -102,26 +102,33 @@ func JSONHandler(fn interface{}) http.Handler {
panic("JSONHandler: number of input parameter should be 2 or 3")
}
var e reflect.Value
switch len(vs) {
case 1:
// todo support other error types
if vs[0].IsNil() {
if vs[0].IsZero() {
writeResponse(w, http.StatusOK, responseSuccess(nil))
} else {
err := vs[0].Interface().(error)
writeResponse(w, http.StatusBadRequest, responseError(err.Error()))
return
}
e = vs[0]
case 2:
if vs[1].IsNil() {
if !vs[0].IsNil() {
if vs[1].IsZero() {
if !vs[0].IsZero() {
writeResponse(w, http.StatusOK, responseSuccess(vs[0].Interface()))
}
} else {
err := vs[1].Interface().(error)
writeResponse(w, http.StatusBadRequest, responseError(err.Error()))
return
}
e = vs[1]
default:
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()))
}
})
}