Skip to content

Commit 9ba9975

Browse files
authored
fix nil-aware ok return in jws header accessors (#1818)
* fix nil-aware ok return in jws header accessors * make headers nil-accessor subtests parallel
1 parent 7da785e commit 9ba9975

3 files changed

Lines changed: 45 additions & 4 deletions

File tree

jws/headers_gen.go

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

jws/headers_nil_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
package jws_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/lestrrat-go/jwx/v3/jws"
7+
"github.com/stretchr/testify/require"
8+
)
9+
10+
// A freshly constructed Headers must report ok=false on every typed
11+
// accessor for a field that has never been set. This is a regression
12+
// guard for the genjws generator where slice/interface accessors used
13+
// to unconditionally return ok=true.
14+
func TestHeaders_NilAccessorsReportNotPresent(t *testing.T) {
15+
t.Parallel()
16+
17+
testcases := []struct {
18+
name string
19+
get func(jws.Headers) (any, bool)
20+
}{
21+
{"Algorithm", func(h jws.Headers) (any, bool) { v, ok := h.Algorithm(); return v, ok }},
22+
{"ContentType", func(h jws.Headers) (any, bool) { v, ok := h.ContentType(); return v, ok }},
23+
{"Critical", func(h jws.Headers) (any, bool) { v, ok := h.Critical(); return v, ok }},
24+
{"JWK", func(h jws.Headers) (any, bool) { v, ok := h.JWK(); return v, ok }},
25+
{"JWKSetURL", func(h jws.Headers) (any, bool) { v, ok := h.JWKSetURL(); return v, ok }},
26+
{"KeyID", func(h jws.Headers) (any, bool) { v, ok := h.KeyID(); return v, ok }},
27+
{"Type", func(h jws.Headers) (any, bool) { v, ok := h.Type(); return v, ok }},
28+
{"X509CertChain", func(h jws.Headers) (any, bool) { v, ok := h.X509CertChain(); return v, ok }},
29+
{"X509CertThumbprint", func(h jws.Headers) (any, bool) { v, ok := h.X509CertThumbprint(); return v, ok }},
30+
{"X509CertThumbprintS256", func(h jws.Headers) (any, bool) { v, ok := h.X509CertThumbprintS256(); return v, ok }},
31+
{"X509URL", func(h jws.Headers) (any, bool) { v, ok := h.X509URL(); return v, ok }},
32+
}
33+
34+
for _, tc := range testcases {
35+
t.Run(tc.name, func(t *testing.T) {
36+
t.Parallel()
37+
_, ok := tc.get(jws.NewHeaders())
38+
require.False(t, ok)
39+
})
40+
}
41+
}

tools/cmd/genjws/main.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ func generateHeaders(obj *codegen.Object) error {
165165
o.L("}")
166166
o.L("return *(h.%s), true", f.Name(false))
167167
} else {
168-
o.L("return h.%s, true", f.Name(false))
168+
o.L("return h.%[1]s, h.%[1]s != nil", f.Name(false))
169169
}
170170
o.L("}") // func (h *stdHeaders) %s() %s
171171
}

0 commit comments

Comments
 (0)