Skip to content

Commit e14eb9b

Browse files
authored
Fix header not found error (#1435)
* Fix error handling for missing headers * use the newer name * Update Changes
1 parent 8babbb1 commit e14eb9b

File tree

3 files changed

+56
-20
lines changed

3 files changed

+56
-20
lines changed

Changes

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ Changes
44
v3 has many incompatibilities with v2. To see the full list of differences between
55
v2 and v3, please read the Changes-v3.md file (https://github.com/lestrrat-go/jwx/blob/develop/v3/Changes-v3.md)
66

7+
v3.0.10 04 Aug 2025
8+
* [jws/jwsbb] Add `jwsbb.ErrHeaderNotFound()` to return the same error type as when
9+
a non-existent header is requested. via `HeaderGetXXX()` functions. Previously, this
10+
function was called `jwsbb.ErrFieldNotFound()`, but it was a misnomer.
11+
* [jws/jwsbb] Fix a bug where error return values from `HeaderGetXXX()` functions
12+
could not be matched against `jwsbb.ErrHeaderNotFound()` using `errors.Is()`.
13+
714
v3.0.9 31 Jul 2025
815
* [jws/jwsbb] `HeaderGetXXX()` functions now return errors when
916
the requested header is not found, or if the value cannot be

jws/jwsbb/header.go

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,29 @@ func (e headerNotFoundError) Error() string {
1515
return fmt.Sprintf(`jwsbb: header "%s" not found`, e.key)
1616
}
1717

18-
// ErrFieldNotFound returns an error that can be passed to `errors.Is` to check if the error is
18+
func (e headerNotFoundError) Is(target error) bool {
19+
switch target.(type) {
20+
case headerNotFoundError, *headerNotFoundError:
21+
// If the target is a headerNotFoundError or a pointer to it, we
22+
// consider it a match
23+
return true
24+
default:
25+
return false
26+
}
27+
}
28+
29+
// ErrHeaderdNotFound returns an error that can be passed to `errors.Is` to check if the error is
1930
// the result of the field not being found
20-
func ErrFieldNotFound() error {
31+
func ErrHeaderNotFound() error {
2132
return headerNotFoundError{}
2233
}
2334

35+
// ErrFieldNotFound is an alias for ErrHeaderNotFound, and is deprecated. It was a misnomer.
36+
// It will be removed in a future release.
37+
func ErrFieldNotFound() error {
38+
return ErrHeaderNotFound()
39+
}
40+
2441
// Header is an object that allows you to access the JWS header in a quick and
2542
// dirty way. It does not verify anything, it does not know anything about what
2643
// each header field means, and it does not care about the JWS specification.

jws/jwsbb/header_test.go

Lines changed: 30 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -160,31 +160,43 @@ func TestHeader(t *testing.T) {
160160

161161
t.Run("ErrorHandling", func(t *testing.T) {
162162
t.Parallel()
163-
// Test invalid JSON
164-
invalidHeader := jwsbb.HeaderParseCompact([]byte("invalid-json"))
165163

166-
_, err := jwsbb.HeaderGetString(invalidHeader, "alg")
167-
require.Error(t, err, "HeaderGetString should return error for invalid header")
164+
t.Run("non-existent field", func(t *testing.T) {
165+
t.Parallel()
166+
headerJSON := `{"alg":"HS256","typ":"JWT"}`
167+
h := jwsbb.HeaderParse([]byte(headerJSON))
168+
_, err := jwsbb.HeaderGetString(h, "nonexistent")
169+
require.Error(t, err, "HeaderGetString should return error for non-existent field")
170+
require.ErrorIs(t, err, jwsbb.ErrHeaderNotFound(), "Error should be ErrHeaderNotFound")
171+
})
172+
t.Run("invalid JSON", func(t *testing.T) {
173+
t.Parallel()
174+
// Test invalid JSON
175+
invalidHeader := jwsbb.HeaderParseCompact([]byte("invalid-json"))
168176

169-
_, err = jwsbb.HeaderGetBool(invalidHeader, "debug")
170-
require.Error(t, err, "HeaderGetBool should return error for invalid header")
177+
_, err := jwsbb.HeaderGetString(invalidHeader, "alg")
178+
require.Error(t, err, "HeaderGetString should return error for invalid header")
171179

172-
_, err = jwsbb.HeaderGetInt(invalidHeader, "count")
173-
require.Error(t, err, "HeaderGetInt should return error for invalid header")
180+
_, err = jwsbb.HeaderGetBool(invalidHeader, "debug")
181+
require.Error(t, err, "HeaderGetBool should return error for invalid header")
174182

175-
_, err = jwsbb.HeaderGetFloat64(invalidHeader, "pi")
176-
require.Error(t, err, "HeaderGetFloat64 should return error for invalid header")
183+
_, err = jwsbb.HeaderGetInt(invalidHeader, "count")
184+
require.Error(t, err, "HeaderGetInt should return error for invalid header")
177185

178-
_, err = jwsbb.HeaderGetStringBytes(invalidHeader, "data")
179-
require.Error(t, err, "HeaderGetStringBytes should return error for invalid header")
186+
_, err = jwsbb.HeaderGetFloat64(invalidHeader, "pi")
187+
require.Error(t, err, "HeaderGetFloat64 should return error for invalid header")
180188

181-
_, err = jwsbb.HeaderGetUint(invalidHeader, "count")
182-
require.Error(t, err, "HeaderGetUint should return error for invalid header")
189+
_, err = jwsbb.HeaderGetStringBytes(invalidHeader, "data")
190+
require.Error(t, err, "HeaderGetStringBytes should return error for invalid header")
183191

184-
_, err = jwsbb.HeaderGetInt64(invalidHeader, "timestamp")
185-
require.Error(t, err, "HeaderGetInt64 should return error for invalid header")
192+
_, err = jwsbb.HeaderGetUint(invalidHeader, "count")
193+
require.Error(t, err, "HeaderGetUint should return error for invalid header")
186194

187-
_, err = jwsbb.HeaderGetUint64(invalidHeader, "timestamp")
188-
require.Error(t, err, "HeaderGetUint64 should return error for invalid header")
195+
_, err = jwsbb.HeaderGetInt64(invalidHeader, "timestamp")
196+
require.Error(t, err, "HeaderGetInt64 should return error for invalid header")
197+
198+
_, err = jwsbb.HeaderGetUint64(invalidHeader, "timestamp")
199+
require.Error(t, err, "HeaderGetUint64 should return error for invalid header")
200+
})
189201
})
190202
}

0 commit comments

Comments
 (0)