{"record":{"id":"612f4c8ca75a8dbe","repo":"golang/go","slug":"invalid-format-invalid-header-line","errorCode":null,"errorMessage":"invalid format: invalid header line","messagePattern":"invalid format: invalid header line","errorType":"error_code","errorClass":null,"httpStatus":null,"severity":"error","filePath":"src/cmd/go/internal/auth/userauth.go","lineNumber":87,"sourceCode":"\t\t\tif err != nil {\n\t\t\t\treturn nil, fmt.Errorf(\"could not parse URL %s: %v\", line, err)\n\t\t\t}\n\t\t\turls = append(urls, u.String())\n\t\t}\n\t\t// Parse Headers second.\n\t\theader := make(http.Header)\n\t\tfor {\n\t\t\tline, data, ok = strings.Cut(data, \"\\n\")\n\t\t\tif !ok {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid format: missing empty line after headers\")\n\t\t\t}\n\t\t\tif line == \"\" {\n\t\t\t\tbreak\n\t\t\t}\n\t\t\tname, value, ok := strings.Cut(line, \": \")\n\t\t\tvalue = strings.TrimSpace(value)\n\t\t\tif !ok || !validHeaderFieldName(name) || !validHeaderFieldValue(value) {\n\t\t\t\treturn nil, fmt.Errorf(\"invalid format: invalid header line\")\n\t\t\t}\n\t\t\theader.Add(name, value)\n\t\t}\n\t\tmaps.Copy(credentials, mapHeadersToPrefixes(urls, header))\n\t}\n\treturn credentials, nil\n}\n\n// mapHeadersToPrefixes returns a mapping of prefix → http.Header without\n// the leading \"https://\".\nfunc mapHeadersToPrefixes(prefixes []string, header http.Header) map[string]http.Header {\n\tprefixToHeaders := make(map[string]http.Header, len(prefixes))\n\tfor _, p := range prefixes {\n\t\tp = strings.TrimPrefix(p, \"https://\")\n\t\tprefixToHeaders[p] = header.Clone() // Clone the header to avoid sharing\n\t}\n\treturn prefixToHeaders\n}","sourceCodeStart":69,"sourceCodeEnd":105,"githubUrl":"https://github.com/golang/go/blob/b6b368adc57c96c3151d224d172029f233ead2c3/src/cmd/go/internal/auth/userauth.go#L69-L105","documentation":"Raised inside parseUserAuth for each header line. A header line must (1) contain a `: ` separator (strings.Cut succeeds), (2) have a name passing validHeaderFieldName, and (3) have a value (after TrimSpace) passing validHeaderFieldValue. Failure of any check aborts parsing.","triggerScenarios":"A header line without `: ` (e.g. `Authorization:Bearer x` with no space, or a bare token), a name with invalid token characters or whitespace, or a value containing control characters/newlines.","commonSituations":"Using a colon without the required space; header names containing spaces or non-token characters; header values with embedded newlines; CRLF endings leaving a stray CR.","solutions":["Format headers as `Name: value` (a colon followed by exactly one space).","Use only RFC 7230 token characters for header names.","Keep header values on a single line with no control characters.","Strip any trailing carriage return from CRLF input before emitting."],"exampleFix":"// before\nAuthorization:Bearer x\n// after\nAuthorization: Bearer x\n","handlingStrategy":"validation","validationCode":"// Validate a header line matches the expected shape.\nfunc validHeaderLine(line string) error {\n    name, value, ok := strings.Cut(line, \": \")\n    if !ok || !validHeaderFieldName(name) || !validHeaderFieldValue(strings.TrimSpace(value)) {\n        return errors.New(\"invalid header line: expected 'Name: value'\")\n    }\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Format headers as `Name: value` (colon plus one space).","Use RFC 7230 token characters for names.","Keep values single-line with no control characters.","Strip CRLF carriage returns before emitting."],"tags":["go-toolchain","goauth","authentication","parsing","headers","custom-command"],"analyzedSha":"b6b368adc57c96c3151d224d172029f233ead2c3","analyzedAt":"2026-08-12T00:22:02.250Z","schemaVersion":2},"datasetVersion":"2026-08-12T06:17:24.410Z"}