diff --git a/bytesconv.go b/bytesconv.go index 5593033..eb4248a 100644 --- a/bytesconv.go +++ b/bytesconv.go @@ -343,18 +343,34 @@ func hexbyte2int(c byte) int { const toLower = 'a' - 'A' -func uppercaseByte(p *byte) { - c := *p - if c >= 'a' && c <= 'z' { - *p = c - toLower +var toLowerTable = func() [256]byte { + var a [256]byte + for i := 0; i < 256; i++ { + c := byte(i) + if c >= 'A' && c <= 'Z' { + a[i] = toLower + } } + return a +}() + +var toUpperTable = func() [256]byte { + var a [256]byte + for i := 0; i < 256; i++ { + c := byte(i) + if c >= 'a' && c <= 'z' { + a[i] = 256 - toLower + } + } + return a +}() + +func uppercaseByte(p *byte) { + *p += toUpperTable[*p] } func lowercaseByte(p *byte) { - c := *p - if c >= 'A' && c <= 'Z' { - *p = c + toLower - } + *p += toLowerTable[*p] } func lowercaseBytes(b []byte) { diff --git a/header.go b/header.go index 00119bc..60b5fd8 100644 --- a/header.go +++ b/header.go @@ -2014,19 +2014,20 @@ func normalizeHeaderKey(b []byte, disableNormalizing bool) { } n := len(b) - up := true - for i := 0; i < n; i++ { - switch b[i] { - case '-': - up = true - default: - if up { - up = false + if n == 0 { + return + } + + uppercaseByte(&b[0]) + for i := 1; i < n; i++ { + if b[i] == '-' { + i++ + if i < n { uppercaseByte(&b[i]) - } else { - lowercaseByte(&b[i]) } + continue } + lowercaseByte(&b[i]) } }