{"record":{"id":"084bc37d50afd0dd","repo":"AlistGo/alist","slug":"remove-failed-status-d","errorCode":null,"errorMessage":"remove failed: status=%d","messagePattern":"remove failed: status=(.+?)","errorType":"http","errorClass":null,"httpStatus":null,"severity":"error","filePath":"drivers/sjtu_netdisk/driver.go","lineNumber":624,"sourceCode":"\t\tendpoint = \"directory\"\n\t} else {\n\t\tendpoint = \"file\"\n\t}\n\n\tremoveURL := fmt.Sprintf(\"%s/%s/%s/%s/%s\", API_URL, endpoint, d.libraryId, d.spaceId, d.encodePath(obj.GetPath()))\n\tresp, err := d.newClient().R().\n\t\tSetContext(ctx).\n\t\tSetQueryParam(\"access_token\", d.accessToken).\n\t\tSetQueryParam(\"permanent\", \"0\").\n\t\tSetQueryParam(\"space_org_id\", \"1\").\n\t\tExecute(http.MethodDelete, removeURL)\n\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tif resp.StatusCode() < 200 || resp.StatusCode() >= 300 {\n\t\treturn fmt.Errorf(\"remove failed: status=%d\", resp.StatusCode())\n\t}\n\n\treturn nil\n}\n\nfunc (d *SJTUNetdisk) Put(ctx context.Context, dstDir model.Obj, stream model.FileStreamer, up driver.UpdateProgress) (model.Obj, error) {\n\tif err := d.refreshToken(ctx); err != nil {\n\t\treturn nil, err\n\t}\n\n\tparentPath := strings.TrimPrefix(strings.ReplaceAll(dstDir.GetPath(), \"\\\\\", \"/\"), \"/\")\n\n\t// step 1: apply for confirm key\n\tinitURL := fmt.Sprintf(\"%s/file/%s/%s/%s\", API_URL, d.libraryId, d.spaceId, d.encodePath(buildPath(parentPath, stream.GetName())))\n\n\tmainClient := d.newClient()\n\n\tvar initResp UploadInitResp","sourceCodeStart":606,"sourceCodeEnd":642,"githubUrl":"https://github.com/AlistGo/alist/blob/843d9dc8149126976b2625911e45a4d3ffd6f2f5/drivers/sjtu_netdisk/driver.go#L606-L642","documentation":"Thrown by the SJTU driver's Remove when the DELETE call does not return a 2xx status. The status code is printed. Because permanent=0 is requested, the item goes to the recycle bin; failures usually mean auth, permission, or the item already being gone in an unexpected way.","triggerScenarios":"Deleting a file/folder with an expired access_token (401), no delete permission (403), or a server error (5xx).","commonSituations":"Token expired before the delete; deleting an item already removed by another client (server may not return 2xx); read-only shared space.","solutions":["Map the printed status: 401 → re-save credentials; 403 → verify delete permission; 5xx → retry","Refresh the directory listing — if the item is already gone, the error is moot","Retry the delete once after re-authentication","Confirm deletion works in the official SJTU client"],"exampleFix":null,"handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"if err != nil {\n    var st int\n    if n, _ := fmt.Sscanf(err.Error(), \"remove failed: status=%d\", &st); n == 1 {\n        if st == 401 { reauthAndRetry() }\n        if st >= 500 { backoffAndRetry() }\n        if st == 404 { return nil } // already gone\n    }\n}","preventionTips":["Refresh the listing first; deleting already-removed items can error","Verify delete permission on the space","Treat 404 after delete attempts as success in caller logic"],"tags":["sjtu-netdisk","delete","http"],"backgroundTag":null,"analyzedSha":"843d9dc8149126976b2625911e45a4d3ffd6f2f5","analyzedAt":"2026-08-15T12:14:11.722Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}