AlistGo/alist · error
request failed: %s
Error message
request failed: %s
What it means
Thrown by the Seafile driver's request helper after the response status is >= 400. The helper first retries once on 401 by re-fetching an auth token, so any other 4xx/5xx (or a 401 that survived the token refresh) reaches this check. The message embeds the full response body, so the Seafile server's own error text is included.
Source
Thrown at drivers/seafile/util.go:68
var (
res *resty.Response
err error
)
for i := 0; i < 2; i++ {
res, err = req.Execute(method, full)
if err != nil {
return nil, err
}
if res.StatusCode() != 401 { // Unauthorized
break
}
err = d.getToken()
if err != nil {
return nil, err
}
}
if res.StatusCode() >= 400 {
return nil, fmt.Errorf("request failed: %s", res.String())
}
return res.Body(), nil
}
func (d *Seafile) getRepoAndPath(fullPath string) (repo *LibraryInfo, path string, err error) {
libraryMap := d.libraryMap
repoId := d.Addition.RepoId
if repoId != "" {
if len(repoId) == 36 /* uuid */ {
for _, library := range libraryMap {
if library.Id == repoId {
return library, fullPath, nil
}
}
}
} else {
var repoName string
str := fullPath[1:]View on GitHub (pinned to 843d9dc814)
Solutions
- Read the response body inside the error text — Seafile usually states the exact cause (e.g. 'Library not found', 'Incorrect password')
- Verify the Addition config: server address, repo ID (36-char UUID or library name), username and password/token
- Re-enter credentials so a fresh token is obtained, then retry the operation
- Confirm the account still has access to the target library on the Seafile web UI
- Check the reverse proxy / Seafile server logs if the body shows 5xx or an HTML error page
Example fix
// before: opaque failure
err := d.request(ctx, url)
// after: surface status + body for diagnosis
if res.StatusCode() >= 400 {
return nil, fmt.Errorf("request failed: status=%d body=%s", res.StatusCode(), res.String())
} Defensive patterns
Strategy: retry
Try / catch
err := doSeafileOp()
if err != nil {
if strings.Contains(err.Error(), "request failed:") {
// body text from Seafile is embedded; branch on 'Unauthorized'/'not found'
if strings.Contains(err.Error(), "Unauthorized") { refreshCreds(); retry() }
}
} Prevention
- Keep Seafile credentials and repo ID current in the storage config
- Treat 401-containing messages as a signal to re-authenticate, not to keep retrying
- Log the full error — it embeds the server's response body
When it happens
Trigger: Any Seafile API call (listing, upload, link, delete) whose response code is >= 400: expired or invalid token whose getToken() refresh also fails or returns a token the server still rejects (401 twice), a library/repo ID that no longer exists (404), permission denied (403), or a Seafile server-side 5xx.
Common situations: Wrong Seafile server URL or repository ID in the mount config; password/token changed or revoked since it was saved; the account lost access to the library; Seafile server upgraded and the API endpoint moved; reverse proxy in front of Seafile returning HTML error pages.
Related errors
AI-assisted analysis of AlistGo/alist@843d9dc814 (2026-08-15).
Data as JSON: /api/errors/150f7852c46d7e72.
Report an issue: GitHub.