Avoid use of json.NewDecoder (#313)

* Avoid use of json.NewDecoder

Avoid use of json.NewDecoder if not needed.

Resolves #303
This commit is contained in:
Craig Pastro 2023-08-15 08:06:50 -07:00 committed by GitHub
parent 8aa5d6cef8
commit 78e25d6b09
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 21 additions and 11 deletions

View File

@ -137,23 +137,33 @@ func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Toke
} }
// parse Claims // parse Claims
var claimBytes []byte
token.Claims = claims token.Claims = claims
if claimBytes, err = p.DecodeSegment(parts[1]); err != nil { claimBytes, err := p.DecodeSegment(parts[1])
if err != nil {
return token, parts, newError("could not base64 decode claim", ErrTokenMalformed, err) return token, parts, newError("could not base64 decode claim", ErrTokenMalformed, err)
} }
dec := json.NewDecoder(bytes.NewBuffer(claimBytes))
if p.useJSONNumber { // If `useJSONNumber` is enabled then we must use *json.Decoder to decode
dec.UseNumber() // the claims. However, this comes with a performance penalty so only use
} // it if we must and, otherwise, simple use json.Unmarshal.
// JSON Decode. Special case for map type to avoid weird pointer behavior if !p.useJSONNumber {
if c, ok := token.Claims.(MapClaims); ok { // JSON Unmarshal. Special case for map type to avoid weird pointer behavior.
err = dec.Decode(&c) if c, ok := token.Claims.(MapClaims); ok {
err = json.Unmarshal(claimBytes, &c)
} else {
err = json.Unmarshal(claimBytes, &claims)
}
} else { } else {
err = dec.Decode(&claims) dec := json.NewDecoder(bytes.NewBuffer(claimBytes))
dec.UseNumber()
// JSON Decode. Special case for map type to avoid weird pointer behavior.
if c, ok := token.Claims.(MapClaims); ok {
err = dec.Decode(&c)
} else {
err = dec.Decode(&claims)
}
} }
// Handle decode error
if err != nil { if err != nil {
return token, parts, newError("could not JSON decode claim", ErrTokenMalformed, err) return token, parts, newError("could not JSON decode claim", ErrTokenMalformed, err)
} }