Go version
go1.22.5
Output of go env in your module/workspace:
GO111MODULE=''
GOARCH='arm64'
GOBIN=''
GOCACHE='/Users/user/Library/Caches/go-build'
GOENV='/Users/user/Library/Application Support/go/env'
GOEXE=''
GOEXPERIMENT=''
GOFLAGS=''
GOHOSTARCH='arm64'
GOHOSTOS='darwin'
GOINSECURE=''
GOMODCACHE='/Users/user/go/pkg/mod'
GONOPROXY=''
GONOSUMDB=''
GOOS='darwin'
GOPATH='/Users/user/go'
GOPRIVATE=''
GOPROXY='https://proxy.golang.org,direct'
GOROOT='/usr/local/go'
GOSUMDB='sum.golang.org'
GOTMPDIR=''
GOTOOLCHAIN='auto'
GOTOOLDIR='/usr/local/go/pkg/tool/darwin_arm64'
GOVCS=''
GOVERSION='go1.22.5'
GCCGO='gccgo'
AR='ar'
CC='clang'
CXX='clang++'
CGO_ENABLED='1'
GOMOD='/Users/user/projects/project/go.mod'
GOWORK=''
CGO_CFLAGS='-O2 -g'
CGO_CPPFLAGS=''
CGO_CXXFLAGS='-O2 -g'
CGO_FFLAGS='-O2 -g'
CGO_LDFLAGS='-O2 -g'
PKG_CONFIG='pkg-config'
GOGCCFLAGS='-fPIC -arch arm64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -ffile-prefix-map=/var/folders/g0/r8qb78z13c3_x62jqrr_6xqm0000gp/T/go-build1410450898=/tmp/go-build -gno-record-gcc-switches -fno-common'
What did you do?
I tried to get the mime headers passing an email header
tr := textproto.NewReader(bufio.NewReader(bytes.NewReader(b)))
headers, err := tr.ReadMIMEHeader()
What did you see happen?
I got this error:
malformed MIME header line: X-Hdr-a/b
What did you expect to see?
I expect to see this mime header along with the others in the headers object.
The issue happens because the function validHeaderFieldByte is missing the / character in the list of valid ones
https://datatracker.ietf.org/doc/html/rfc2822#section-3.6.8
optional-field = field-name ":" unstructured CRLF
field-name = 1*ftext
ftext = %d33-57 / ; Any character except
%d59-126 ; controls, SP, and
; ":".
The validation was already missing the character in version 1.19, but the canonicalMIMEHeaderKey function was not returning the boolean value to indicate as a !ok to the readMIMEHeader function.
// validHeaderFieldByte reports whether b is a valid byte in a header
// field name. RFC 7230 says:
//
// header-field = field-name ":" OWS field-value OWS
// field-name = token
// tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
// token = 1*tchar
func validHeaderFieldByte(b byte) bool {
return int(b) < len(isTokenTable) && isTokenTable[b]
}
// canonicalMIMEHeaderKey is like CanonicalMIMEHeaderKey but is
// allowed to mutate the provided byte slice before returning the
// string.
//
// For invalid inputs (if a contains spaces or non-token bytes), a
// is unchanged and a string copy is returned.
func canonicalMIMEHeaderKey(a []byte) string {
// See if a looks like a header key. If not, return it unchanged.
for _, c := range a {
if validHeaderFieldByte(c) {
continue
}
// Don't canonicalize.
return string(a)
}
...
}
Go version
go1.22.5
Output of
go envin your module/workspace:What did you do?
I tried to get the mime headers passing an email header
What did you see happen?
I got this error:
malformed MIME header line: X-Hdr-a/bWhat did you expect to see?
I expect to see this mime header along with the others in the headers object.
The issue happens because the function
validHeaderFieldByteis missing the/character in the list of valid oneshttps://datatracker.ietf.org/doc/html/rfc2822#section-3.6.8
The validation was already missing the character in version 1.19, but the
canonicalMIMEHeaderKeyfunction was not returning the boolean value to indicate as a !ok to thereadMIMEHeaderfunction.