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

  1. Choose a different WebDAV provider (self-hosted WebDAV/Nextcloud, InfiniCloud, Alist, etc.)
  2. Use S3-compatible storage or the local-folder sync provider instead
  3. Use SiYuan's official cloud sync service (siyuan-note membership sync)
  4. 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

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


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()
	return

View on GitHub (pinned to 9f775e8a12)