package keepweb
import (
+ "errors"
"net/http"
"sync"
"sync/atomic"
if user == nil || expired {
user = new(arvados.User)
err := sess.client.RequestAndDecode(user, "GET", "/arvados/v1/users/current", nil, nil)
- if statusErr, ok := err.(interface{ HTTPStatus() int }); ok && statusErr.HTTPStatus() == http.StatusForbidden {
+ if he := errorWithHTTPStatus(nil); errors.As(err, &he) && he.HTTPStatus() == http.StatusForbidden {
// token is OK, but "get user id" api is out
// of scope -- return nil, signifying unknown
// user
json.NewEncoder(w).Encode(struct{ Version string }{cmd.Version.String()})
}
+type errorWithHTTPStatus interface {
+ HTTPStatus() int
+}
+
// updateOnSuccess wraps httpserver.ResponseWriter. If the handler
// sends an HTTP header indicating success, updateOnSuccess first
// calls the provided update func. If the update func fails, an error
if code >= 200 && code < 400 {
if uos.err = uos.update(); uos.err != nil {
code := http.StatusInternalServerError
- var he interface{ HTTPStatus() int }
- if errors.As(uos.err, &he) {
+ if he := errorWithHTTPStatus(nil); errors.As(uos.err, &he) {
code = he.HTTPStatus()
}
uos.logger.WithError(uos.err).Errorf("update() returned %T error, changing response to HTTP %d", uos.err, code)
var session *cachedSession
var collectionDir arvados.File
for _, token = range tokens {
- var statusErr interface{ HTTPStatus() int }
+ var statusErr errorWithHTTPStatus
fs, sess, user, err := h.Cache.GetSession(token)
if errors.As(err, &statusErr) && statusErr.HTTPStatus() == http.StatusUnauthorized {
// bad token
if forceReload && collectionDir != nil {
err := collectionDir.Sync()
if err != nil {
- var statusErr interface{ HTTPStatus() int }
- if errors.As(err, &statusErr) {
- http.Error(w, err.Error(), statusErr.HTTPStatus())
+ if he := errorWithHTTPStatus(nil); errors.As(err, &he) {
+ http.Error(w, err.Error(), he.HTTPStatus())
} else {
http.Error(w, err.Error(), http.StatusInternalServerError)
}