{"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/d32a084675427f5ac3f7d2868578ef8b2c1dc525/internal/backend/remote-state/http/backend.go#L135-L171","documentation":"url.Parse returned an error for the lock_address value (attribute or TF_HTTP_LOCK_ADDRESS). The string is malformed enough that Go's URL parser rejects it outright — control characters, raw spaces, invalid percent-encoding, or unbalanced IPv6 brackets. Unlike the address, lock_address is optional and only validated when non-null.","triggerScenarios":"lock_address contains raw spaces or control characters, an invalid '%' escape (e.g. '%zz'), unbalanced '[' for an IPv6 literal, or a stray newline inserted by a templating tool.","commonSituations":"lock_address built from a template that left an unencoded space; env var sourced from a secret store with a trailing newline; copy-paste across terminals introduced a carriage return.","solutions":["Percent-encode any spaces/special characters in the URL or remove them.","Ensure lock_address is a single line with no embedded newlines/control characters.","Validate with: printf '%s' \"$TF_HTTP_LOCK_ADDRESS\" | grep -P '[\\x00-\\x1f]' to detect control chars.","Use an absolute http(s) URL identical in shape to the working 'address' value."],"exampleFix":"// before\nlock_address = \"https://state.example.com/lock default\"\n// after\nlock_address = \"https://state.example.com/lock%20default\"","handlingStrategy":"validation","validationCode":"# Pre-flight: validate lock_address parses and has no control chars\nif [ -n \"$TF_HTTP_LOCK_ADDRESS\" ]; then\n  printf '%s' \"$TF_HTTP_LOCK_ADDRESS\" | grep -P '[\\x00-\\x1f]' && { echo 'control chars in lock_address'; exit 1; }\n  case \"$TF_HTTP_LOCK_ADDRESS\" in http://*|https://*) ;; *) echo 'lock_address missing http(s) scheme'; exit 1;; esac\nfi","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Build lock_address from the same base URL as address to keep encoding consistent.","Percent-encode any dynamic path segments.","Run a pre-flight check for control characters whenever the value is templated."],"tags":["config","url-validation","http-backend","lock"],"backgroundTag":null,"analyzedSha":"d32a084675427f5ac3f7d2868578ef8b2c1dc525","analyzedAt":"2026-08-11T18:43:52.779Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}