Remove unspecced error type

This commit is contained in:
Devon Hudson 2023-05-09 08:54:25 -06:00
parent 2d1ec1e13c
commit 7a4978a94c
No known key found for this signature in database
GPG key ID: CD06B18E77F6A628
19 changed files with 61 additions and 61 deletions

View file

@ -68,7 +68,7 @@ func LoginFromJSONReader(ctx context.Context, r io.Reader, useraccountAPI uapi.U
default:
err := util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("unhandled login type: " + header.Type),
JSON: jsonerror.InvalidParam("unhandled login type: " + header.Type),
}
return nil, nil, &err
}

View file

@ -140,7 +140,7 @@ func TestBadLoginFromJSONReader(t *testing.T) {
"type": "m.login.invalid",
"device_id": "adevice"
}`,
WantErrCode: "M_INVALID_ARGUMENT_VALUE",
WantErrCode: "M_INVALID_PARAM",
},
}
for _, tst := range tsts {

View file

@ -104,7 +104,7 @@ func AdminResetPassword(req *http.Request, cfg *config.ClientAPI, device *api.De
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}
accAvailableResp := &api.QueryAccountAvailabilityResponse{}
@ -135,7 +135,7 @@ func AdminResetPassword(req *http.Request, cfg *config.ClientAPI, device *api.De
if request.Password == "" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Expecting non-empty password."),
JSON: jsonerror.MissingParam("Expecting non-empty password."),
}
}
@ -221,14 +221,14 @@ func AdminDownloadState(req *http.Request, device *api.Device, rsAPI roomserverA
if !ok {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Expecting room ID."),
JSON: jsonerror.MissingParam("Expecting room ID."),
}
}
serverName, ok := vars["serverName"]
if !ok {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Expecting remote server name."),
JSON: jsonerror.MissingParam("Expecting remote server name."),
}
}
if err = rsAPI.PerformAdminDownloadState(req.Context(), roomID, device.UserID, spec.ServerName(serverName)); err != nil {

View file

@ -156,7 +156,7 @@ func CreateRoom(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}
return createRoom(req.Context(), r, device, cfg, profileAPI, rsAPI, asAPI, evTime)

View file

@ -377,7 +377,7 @@ func extractRequestData(req *http.Request) (body *threepid.MembershipRequest, ev
if err != nil {
resErr = &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
return
}

View file

@ -127,7 +127,7 @@ func SetAvatarURL(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}
@ -216,7 +216,7 @@ func SetDisplayName(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}

View file

@ -17,7 +17,7 @@ func errorResponse(ctx context.Context, err error, msg string, args ...interface
if eerr, ok := err.(*jsonerror.MatrixError); ok {
var status int
switch eerr.ErrCode {
case "M_INVALID_ARGUMENT_VALUE":
case "M_INVALID_PARAM":
status = http.StatusBadRequest
case "M_NOT_FOUND":
status = http.StatusNotFound
@ -48,7 +48,7 @@ func GetPushRulesByScope(ctx context.Context, scope string, device *userapi.Devi
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
return util.JSONResponse{
Code: http.StatusOK,
@ -63,12 +63,12 @@ func GetPushRulesByKind(ctx context.Context, scope, kind string, device *userapi
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
// Even if rulesPtr is not nil, there may not be any rules for this kind
if rulesPtr == nil || (rulesPtr != nil && len(*rulesPtr) == 0) {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
return util.JSONResponse{
Code: http.StatusOK,
@ -83,11 +83,11 @@ func GetPushRuleByRuleID(ctx context.Context, scope, kind, ruleID string, device
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
if rulesPtr == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
i := pushRuleIndexByID(*rulesPtr, ruleID)
if i < 0 {
@ -111,7 +111,7 @@ func PutPushRuleByRuleID(ctx context.Context, scope, kind, ruleID, afterRuleID,
errs := pushrules.ValidateRule(pushrules.Kind(kind), &newRule)
if len(errs) > 0 {
return errorResponse(ctx, jsonerror.InvalidArgumentValue(errs[0].Error()), "rule sanity check failed: %v", errs)
return errorResponse(ctx, jsonerror.InvalidParam(errs[0].Error()), "rule sanity check failed: %v", errs)
}
ruleSets, err := userAPI.QueryPushRules(ctx, device.UserID)
@ -120,12 +120,12 @@ func PutPushRuleByRuleID(ctx context.Context, scope, kind, ruleID, afterRuleID,
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
if rulesPtr == nil {
// while this should be impossible (ValidateRule would already return an error), better keep it around
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
i := pushRuleIndexByID(*rulesPtr, ruleID)
if i >= 0 && afterRuleID == "" && beforeRuleID == "" {
@ -172,11 +172,11 @@ func DeletePushRuleByRuleID(ctx context.Context, scope, kind, ruleID string, dev
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
if rulesPtr == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
i := pushRuleIndexByID(*rulesPtr, ruleID)
if i < 0 {
@ -203,11 +203,11 @@ func GetPushRuleAttrByRuleID(ctx context.Context, scope, kind, ruleID, attr stri
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
if rulesPtr == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
i := pushRuleIndexByID(*rulesPtr, ruleID)
if i < 0 {
@ -249,11 +249,11 @@ func PutPushRuleAttrByRuleID(ctx context.Context, scope, kind, ruleID, attr stri
}
ruleSet := pushRuleSetByScope(ruleSets, pushrules.Scope(scope))
if ruleSet == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rule set"), "pushRuleSetByScope failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rule set"), "pushRuleSetByScope failed")
}
rulesPtr := pushRuleSetKindPointer(ruleSet, pushrules.Kind(kind))
if rulesPtr == nil {
return errorResponse(ctx, jsonerror.InvalidArgumentValue("invalid push rules kind"), "pushRuleSetKindPointer failed")
return errorResponse(ctx, jsonerror.InvalidParam("invalid push rules kind"), "pushRuleSetKindPointer failed")
}
i := pushRuleIndexByID(*rulesPtr, ruleID)
if i < 0 {
@ -313,7 +313,7 @@ func pushRuleAttrGetter(attr string) (func(*pushrules.Rule) interface{}, error)
case "enabled":
return func(rule *pushrules.Rule) interface{} { return rule.Enabled }, nil
default:
return nil, jsonerror.InvalidArgumentValue("invalid push rule attribute")
return nil, jsonerror.InvalidParam("invalid push rule attribute")
}
}
@ -324,7 +324,7 @@ func pushRuleAttrSetter(attr string) (func(dest, src *pushrules.Rule), error) {
case "enabled":
return func(dest, src *pushrules.Rule) { dest.Enabled = src.Enabled }, nil
default:
return nil, jsonerror.InvalidArgumentValue("invalid push rule attribute")
return nil, jsonerror.InvalidParam("invalid push rule attribute")
}
}

View file

@ -552,7 +552,7 @@ func Register(
// type is not known or specified)
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("A known registration type (e.g. m.login.application_service) must be specified if an access_token is provided"),
JSON: jsonerror.MissingParam("A known registration type (e.g. m.login.application_service) must be specified if an access_token is provided"),
}
default:
// Spec-compliant case (neither the access_token nor the login type are
@ -834,14 +834,14 @@ func completeRegistration(
if username == "" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Missing username"),
JSON: jsonerror.MissingParam("Missing username"),
}
}
// Blank passwords are only allowed by registered application services
if password == "" && appserviceID == "" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Missing password"),
JSON: jsonerror.MissingParam("Missing password"),
}
}
var accRes userapi.PerformAccountCreationResponse

View file

@ -659,7 +659,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("missing trailing slash"),
JSON: jsonerror.InvalidParam("missing trailing slash"),
}
}),
).Methods(http.MethodGet, http.MethodOptions)
@ -674,7 +674,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("scope, kind and rule ID must be specified"),
JSON: jsonerror.InvalidParam("scope, kind and rule ID must be specified"),
}
}),
).Methods(http.MethodPut)
@ -693,7 +693,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("missing trailing slash after scope"),
JSON: jsonerror.InvalidParam("missing trailing slash after scope"),
}
}),
).Methods(http.MethodGet, http.MethodOptions)
@ -702,7 +702,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("kind and rule ID must be specified"),
JSON: jsonerror.InvalidParam("kind and rule ID must be specified"),
}
}),
).Methods(http.MethodPut)
@ -721,7 +721,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("missing trailing slash after kind"),
JSON: jsonerror.InvalidParam("missing trailing slash after kind"),
}
}),
).Methods(http.MethodGet, http.MethodOptions)
@ -730,7 +730,7 @@ func Setup(
httputil.MakeAuthAPI("push_rules", userAPI, func(req *http.Request, device *userapi.Device) util.JSONResponse {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("rule ID must be specified"),
JSON: jsonerror.InvalidParam("rule ID must be specified"),
}
}),
).Methods(http.MethodPut)
@ -1244,7 +1244,7 @@ func Setup(
if version == "" {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("version must be specified"),
JSON: jsonerror.InvalidParam("version must be specified"),
}
}
var reqBody keyBackupSessionRequest
@ -1265,7 +1265,7 @@ func Setup(
if version == "" {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("version must be specified"),
JSON: jsonerror.InvalidParam("version must be specified"),
}
}
roomID := vars["roomID"]
@ -1297,7 +1297,7 @@ func Setup(
if version == "" {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("version must be specified"),
JSON: jsonerror.InvalidParam("version must be specified"),
}
}
var reqBody userapi.KeyBackupSession

View file

@ -126,7 +126,7 @@ func SendEvent(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}

View file

@ -50,7 +50,7 @@ func Backfill(
if _, _, err = gomatrixserverlib.SplitID('!', roomID); err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Bad room ID: " + err.Error()),
JSON: jsonerror.MissingParam("Bad room ID: " + err.Error()),
}
}
@ -65,14 +65,14 @@ func Backfill(
if !exists {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("v is missing"),
JSON: jsonerror.MissingParam("v is missing"),
}
}
limit = httpReq.URL.Query().Get("limit")
if len(limit) == 0 {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("limit is missing"),
JSON: jsonerror.MissingParam("limit is missing"),
}
}
@ -92,7 +92,7 @@ func Backfill(
util.GetLogger(httpReq.Context()).WithError(err).Error("strconv.Atoi failed")
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(fmt.Sprintf("limit %q is invalid format", limit)),
JSON: jsonerror.InvalidParam(fmt.Sprintf("limit %q is invalid format", limit)),
}
}

View file

@ -155,7 +155,7 @@ func processInvite(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(fmt.Sprintf("The user ID is invalid or domain %q does not belong to this server", domain)),
JSON: jsonerror.InvalidParam(fmt.Sprintf("The user ID is invalid or domain %q does not belong to this server", domain)),
}
}

View file

@ -36,7 +36,7 @@ func GetOpenIDUserInfo(
if len(token) == 0 {
return util.JSONResponse{
Code: http.StatusUnauthorized,
JSON: jsonerror.MissingArgument("access_token is missing"),
JSON: jsonerror.MissingParam("access_token is missing"),
}
}

View file

@ -37,7 +37,7 @@ func GetProfile(
if userID == "" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("The request body did not contain required argument 'user_id'."),
JSON: jsonerror.MissingParam("The request body did not contain required argument 'user_id'."),
}
}
@ -46,7 +46,7 @@ func GetProfile(
util.GetLogger(httpReq.Context()).WithError(err).Error("gomatrixserverlib.SplitID failed")
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(fmt.Sprintf("Domain %q does not match this server", domain)),
JSON: jsonerror.InvalidParam(fmt.Sprintf("Domain %q does not match this server", domain)),
}
}
@ -71,7 +71,7 @@ func GetProfile(
}
default:
code = http.StatusBadRequest
res = jsonerror.InvalidArgumentValue("The request body did not contain an allowed value of argument 'field'. Allowed values are either: 'avatar_url', 'displayname'.")
res = jsonerror.InvalidParam("The request body did not contain an allowed value of argument 'field'. Allowed values are either: 'avatar_url', 'displayname'.")
}
} else {
res = eventutil.UserProfile{

View file

@ -88,7 +88,7 @@ func parseEventIDParam(
if eventID == "" {
resErr = &util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("event_id missing"),
JSON: jsonerror.MissingParam("event_id missing"),
}
}

View file

@ -233,7 +233,7 @@ func (w *walker) walk() util.JSONResponse {
if cache == nil {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("invalid from"),
JSON: jsonerror.InvalidParam("invalid from"),
}
}
} else {

View file

@ -110,7 +110,7 @@ func OnIncomingMessagesRequest(
if err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("unable to parse filter"),
JSON: jsonerror.InvalidParam("unable to parse filter"),
}
}
@ -132,7 +132,7 @@ func OnIncomingMessagesRequest(
if dir != "b" && dir != "f" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Bad or missing dir query parameter (should be either 'b' or 'f')"),
JSON: jsonerror.MissingParam("Bad or missing dir query parameter (should be either 'b' or 'f')"),
}
}
// A boolean is easier to handle in this case, especially since dir is sure
@ -145,7 +145,7 @@ func OnIncomingMessagesRequest(
if streamToken, err = types.NewStreamTokenFromString(fromQuery); err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("Invalid from parameter: " + err.Error()),
JSON: jsonerror.InvalidParam("Invalid from parameter: " + err.Error()),
}
} else {
fromStream = &streamToken
@ -168,7 +168,7 @@ func OnIncomingMessagesRequest(
if streamToken, err = types.NewStreamTokenFromString(toQuery); err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue("Invalid to parameter: " + err.Error()),
JSON: jsonerror.InvalidParam("Invalid to parameter: " + err.Error()),
}
} else {
to, err = snapshot.StreamToTopologicalPosition(req.Context(), roomID, streamToken.PDUPosition, !backwardOrdering)
@ -197,7 +197,7 @@ func OnIncomingMessagesRequest(
if _, _, err = gomatrixserverlib.SplitID('!', roomID); err != nil {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Bad room ID: " + err.Error()),
JSON: jsonerror.MissingParam("Bad room ID: " + err.Error()),
}
}

View file

@ -73,7 +73,7 @@ func Relations(
if dir != "b" && dir != "f" {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.MissingArgument("Bad or missing dir query parameter (should be either 'b' or 'f')"),
JSON: jsonerror.MissingParam("Bad or missing dir query parameter (should be either 'b' or 'f')"),
}
}

View file

@ -232,7 +232,7 @@ func (rp *RequestPool) OnIncomingSyncRequest(req *http.Request, device *userapi.
if err == types.ErrMalformedSyncToken {
return util.JSONResponse{
Code: http.StatusBadRequest,
JSON: jsonerror.InvalidArgumentValue(err.Error()),
JSON: jsonerror.InvalidParam(err.Error()),
}
}
return util.JSONResponse{
@ -517,21 +517,21 @@ func (rp *RequestPool) OnIncomingKeyChangeRequest(req *http.Request, device *use
if from == "" || to == "" {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("missing ?from= or ?to="),
JSON: jsonerror.InvalidParam("missing ?from= or ?to="),
}
}
fromToken, err := types.NewStreamTokenFromString(from)
if err != nil {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("bad 'from' value"),
JSON: jsonerror.InvalidParam("bad 'from' value"),
}
}
toToken, err := types.NewStreamTokenFromString(to)
if err != nil {
return util.JSONResponse{
Code: 400,
JSON: jsonerror.InvalidArgumentValue("bad 'to' value"),
JSON: jsonerror.InvalidParam("bad 'to' value"),
}
}
syncReq, err := newSyncRequest(req, *device, rp.db)