siyuan-note/siyuan · error
Conf.Language(194)
Error message
Conf.Language(194)
What it means
SetSyncProviderWebDAV explicitly refuses Jianguoyun (坚果云) WebDAV endpoints by checking whether the normalized endpoint contains "dav.jianguoyun.com"; on a match it returns Conf.Language(194), the localized message that Jianguoyun WebDAV is not supported for syncing (issue #7657). Jianguoyun rate-limits and does not tolerate the request pattern the sync engine generates, so the kernel blocks it up front.
Solutions
- Choose a different WebDAV provider (self-hosted WebDAV/Nextcloud, InfiniCloud, Alist, etc.)
- Use S3-compatible storage or the local-folder sync provider instead
- Use SiYuan's official cloud sync service (siyuan-note membership sync)
- Do not attempt to bypass the check by URL tricks — Jianguoyun will throttle/fail sync operations anyway
Example fix
// before Endpoint: "https://dav.jianguoyun.com/dav/" // after Endpoint: "https://dav.example-owncloud.example.com/remote.php/dav"
Defensive patterns
Strategy: validation
Validate before calling
if strings.Contains(strings.ToLower(endpoint), "dav.jianguoyun.com") {
return errors.New("Jianguoyun WebDAV is not supported for sync")
} Try / catch
if err := model.SetSyncProviderWebDAV(cfg); err != nil {
if strings.Contains(err.Error(), "Language(194)") || strings.Contains(cfg.Endpoint, "jianguoyun") {
// prompt user to choose a different WebDAV provider
}
} Prevention
- Do not configure Jianguoyun as a WebDAV sync target
- Check the endpoint domain before submitting WebDAV settings
- Use supported providers: self-hosted WebDAV, Nextcloud, S3-compatible storage, or official cloud sync
When it happens
Trigger: Calling SetSyncProviderWebDAV (via the setSyncProviderWebDAVContract or importSyncProviderWebDAVContract API handlers) with webdav.Endpoint containing dav.jianguoyun.com (case-insensitive), e.g. "https://dav.jianguoyun.com/dav/".
Common situations: Chinese users configuring their Jianguoyun account's app-password WebDAV as a sync target; migrating configs from another sync tool that allowed Jianguoyun; following older tutorials recommending Jianguoyun for SiYuan sync.
Understand the failure class
Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.
Related errors
- Conf.Language(123)
- This operation is not supported, please go to the cloud…
- 376
- 377
- attribute view not found
AI-assisted analysis of siyuan-note/siyuan@9f775e8a12 (2026-09-19).
Data as JSON: /api/errors/96b6cb87e12407eb.
Report an issue: GitHub.
Appendix: source
Thrown at kernel/model/sync.go:669
if strings.Contains(rawEndpoint, "://") && !strings.HasPrefix(rawEndpoint, "http://") && !strings.HasPrefix(rawEndpoint, "https://") {
return errors.New(Conf.Language(249))
}
endpoint, err := url.Parse(util.NormalizeEndpoint(rawEndpoint))
if err != nil || endpoint.Hostname() == "" || (endpoint.Scheme != "http" && endpoint.Scheme != "https") {
return errors.New(Conf.Language(249))
}
return nil
}
func SetSyncProviderWebDAV(webdav *conf.WebDAV) (err error) {
release := lockAssetSourceChange()
defer release()
webdav.Endpoint = strings.TrimSpace(webdav.Endpoint)
webdav.Endpoint = util.NormalizeEndpoint(webdav.Endpoint)
// 不支持配置坚果云 WebDAV 进行同步 https://github.com/siyuan-note/siyuan/issues/7657
if strings.Contains(strings.ToLower(webdav.Endpoint), "dav.jianguoyun.com") {
err = errors.New(Conf.Language(194))
return
}
webdav.Username = strings.TrimSpace(webdav.Username)
webdav.Password = strings.TrimSpace(webdav.Password)
webdav.Timeout = util.NormalizeTimeout(webdav.Timeout)
webdav.ConcurrentReqs = util.NormalizeConcurrentReqs(webdav.ConcurrentReqs, conf.ProviderWebDAV)
if Conf.Sync.Provider == conf.ProviderWebDAV && (Conf.Sync.WebDAV == nil ||
Conf.Sync.WebDAV.Endpoint != webdav.Endpoint || Conf.Sync.WebDAV.Username != webdav.Username) {
if err = requireCompleteAssetDownloads(); err != nil {
return
}
}
Conf.Sync.WebDAV = webdav
Conf.Save()
refreshLANSyncManager()
returnView on GitHub (pinned to 9f775e8a12)