{"record":{"id":"0ddf4ab365d24312","repo":"hashicorp/terraform","slug":"failed-to-parse-lock-address-url-s","errorCode":null,"errorMessage":"failed to parse lock_address URL: %s","messagePattern":"failed to parse lock_address URL: (.+?)","errorType":"validation","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/backend/remote-state/http/backend.go","lineNumber":153,"sourceCode":"\t}\n\tif updateURL.Scheme != \"http\" && updateURL.Scheme != \"https\" {\n\t\treturn backendbase.ErrorAsDiagnostics(\n\t\t\tfmt.Errorf(\"address must be HTTP or HTTPS\"),\n\t\t)\n\t}\n\n\tupdateMethod := backendbase.GetAttrEnvDefaultFallback(\n\t\tconfigVal, \"update_method\",\n\t\t\"TF_HTTP_UPDATE_METHOD\", cty.StringVal(\"POST\"),\n\t).AsString()\n\n\tvar lockURL *url.URL\n\tif v := backendbase.GetAttrEnvDefault(configVal, \"lock_address\", \"TF_HTTP_LOCK_ADDRESS\"); !v.IsNull() {\n\t\tvar err error\n\t\tlockURL, err = url.Parse(v.AsString())\n\t\tif err != nil {\n\t\t\treturn backendbase.ErrorAsDiagnostics(\n\t\t\t\tfmt.Errorf(\"failed to parse lock_address URL: %s\", err),\n\t\t\t)\n\t\t}\n\t\tif lockURL.Scheme != \"http\" && lockURL.Scheme != \"https\" {\n\t\t\treturn backendbase.ErrorAsDiagnostics(\n\t\t\t\tfmt.Errorf(\"lock_address must be HTTP or HTTPS\"),\n\t\t\t)\n\t\t}\n\t}\n\tlockMethod := backendbase.GetAttrEnvDefaultFallback(\n\t\tconfigVal, \"lock_method\",\n\t\t\"TF_HTTP_LOCK_METHOD\", cty.StringVal(\"LOCK\"),\n\t).AsString()\n\n\tvar unlockURL *url.URL\n\tif v := backendbase.GetAttrEnvDefault(configVal, \"unlock_address\", \"TF_HTTP_UNLOCK_ADDRESS\"); !v.IsNull() {\n\t\tvar err error\n\t\tunlockURL, err = url.Parse(v.AsString())\n\t\tif err != nil {","sourceCodeStart":135,"sourceCodeEnd":171,"githubUrl":"https://github.com/hashicorp/terraform/blob/c9def3e214014c1188faabfc4a5bde5095139765/internal/backend/remote-state/http/backend.go#L135-L171","documentation":"When lock_address is provided (config or TF_HTTP_LOCK_ADDRESS), Configure() parses it with url.Parse. A malformed lock URL (control chars, bad escapes) yields this error mirroring the address check. If lock_address is unset, parsing is skipped and no error fires.","triggerScenarios":"Setting lock_address to a string with invalid URL syntax (unencoded spaces, control characters, stray backslashes) in 'terraform init'.","commonSituations":"lock_address built by concatenation producing malformed escapes; copy-paste with spaces; mismatch where address is clean but lock_address has a typo.","solutions":["Make lock_address a valid URL (URL-encode any special components).","Ensure the scheme + host + path match the address style.","If you don't need a separate lock endpoint, unset lock_address (the backend supports lockless operation)."],"exampleFix":"// before\nlock_address = \"https://state.example.com/lock/my team\"\n\n// after\nlock_address = \"https://state.example.com/lock/my%20team\"","handlingStrategy":"validation","validationCode":"if lockAddr != \"\" {\n    if _, err := url.Parse(lockAddr); err != nil {\n        log.Fatalf(\"lock_address is not a valid URL: %v\", err)\n    }\n}","typeGuard":"func isValidLockURL(s string) bool {\n    if s == \"\" { return true }\n    _, err := url.Parse(s)\n    return err == nil\n}","tryCatchPattern":null,"preventionTips":["URL-encode any spaces or special characters in lock_address.","Ensure lock_address scheme/host match address.","Leave lock_address unset if there is no separate lock endpoint."],"tags":["http","backend","url","locking","config-validation"],"analyzedSha":"c9def3e214014c1188faabfc4a5bde5095139765","analyzedAt":"2026-08-07T15:39:49.278Z","schemaVersion":2},"datasetVersion":"2026-08-07T21:17:07.882Z"}