{"record":{"id":"626dbf7d79ce025e","repo":"benbjohnson/litestream","slug":"cannot-specify-url-webdav-url-for-webdav-replica","errorCode":null,"errorMessage":"cannot specify url & webdav-url for webdav replica","messagePattern":"cannot specify url & webdav-url for webdav replica","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/litestream/main.go","lineNumber":1864,"sourceCode":"\tclient.Path = path\n\tclient.KeyPath = c.KeyPath\n\tclient.HostKey = c.HostKey\n\n\t// Set concurrent writes if specified, otherwise use default (true)\n\tif c.ConcurrentWrites != nil {\n\t\tclient.ConcurrentWrites = *c.ConcurrentWrites\n\t}\n\n\treturn client, nil\n}\n\n// newWebDAVReplicaClientFromConfig returns a new instance of webdav.ReplicaClient built from config.\nfunc newWebDAVReplicaClientFromConfig(c *ReplicaConfig, _ *litestream.Replica) (_ *webdav.ReplicaClient, err error) {\n\t// Ensure URL & constituent parts are not both specified.\n\tif c.URL != \"\" && c.Path != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url & path for webdav replica\")\n\t} else if c.URL != \"\" && c.WebDAVURL != \"\" {\n\t\treturn nil, fmt.Errorf(\"cannot specify url & webdav-url for webdav replica\")\n\t}\n\n\twebdavURL, username, password, path := c.WebDAVURL, c.WebDAVUsername, c.WebDAVPassword, c.Path\n\n\t// Apply settings from URL, if specified.\n\tif c.URL != \"\" {\n\t\tu, err := url.Parse(c.URL)\n\t\tif err != nil {\n\t\t\treturn nil, err\n\t\t}\n\n\t\t// Build WebDAV URL from scheme and host\n\t\tscheme := \"http\"\n\t\tif u.Scheme == \"webdavs\" {\n\t\t\tscheme = \"https\"\n\t\t}\n\t\tif webdavURL == \"\" && u.Host != \"\" {\n\t\t\twebdavURL = fmt.Sprintf(\"%s://%s\", scheme, u.Host)","sourceCodeStart":1846,"sourceCodeEnd":1882,"githubUrl":"https://github.com/benbjohnson/litestream/blob/4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3/cmd/litestream/main.go#L1846-L1882","documentation":"newWebDAVReplicaClientFromConfig rejects configs with both 'url' and 'webdav-url' set. Both describe the WebDAV server endpoint, so having both is contradictory; the constructor returns this validation error during replica client creation.","triggerScenarios":"A webdav replica config with c.URL non-empty (e.g. 'webdavs://dav.example.com/db') and c.WebDAVURL also non-empty (e.g. webdav-url: https://dav.example.com).","commonSituations":"Mixing two documentation styles in one config; a migration tool that maps old 'webdav-url' fields and adds a new 'url' field without removing the original.","solutions":["Remove 'webdav-url' and keep only 'url'","Or remove 'url' and use webdav-url + username + password + path fields","Pick one style and apply it consistently across all replicas in the config"],"exampleFix":"# before\n- type: webdav\n  url: webdavs://dav.example.com/db\n  webdav-url: https://dav.example.com\n# after\n- type: webdav\n  url: webdavs://dav.example.com/db","handlingStrategy":"validation","validationCode":"if rep.Type == \"webdav\" && rep.URL != \"\" && rep.WebDAVURL != \"\" {\n    return fmt.Errorf(\"webdav replica %s: url and webdav-url are mutually exclusive\", rep.Name)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Use 'url' as the single source for endpoint in new configs","Keep only webdav-url in legacy configs; never mix","Review migrations for dual endpoint keys"],"tags":["config","webdav","litestream","validation"],"backgroundTag":"conflicting-config-options","analyzedSha":"4ed7a308f6271ebfd2b0a6e4b70b03011a37e4a3","analyzedAt":"2026-09-06T18:29:25.564Z","contentChangedAt":"2026-09-06T18:29:25.564Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}