internal/impl: lazy extension decoding
Historically, extensions have been placed in the unknown fields section
of the unmarshaled message and decoded lazily on demand. The current
unmarshal implementation decodes extensions eagerly at unmarshal time,
permitting errors to be immediately reported and correctly detecting
unset required fields in extension values.
Add support for validated lazy extension decoding, where the extension
value is fully validated at initial unmarshal time but the fully
unmarshaled message is only created lazily.
Make this behavior conditional on the protolegacy flag for now.
Change-Id: I9d742496a4bd4dafea83fca8619cd6e8d7e65bc3
Reviewed-on: https://go-review.googlesource.com/c/protobuf/+/216764
Reviewed-by: Joe Tsai <joetsai@google.com>
diff --git a/proto/decode.go b/proto/decode.go
index f3cd997..e1177b8 100644
--- a/proto/decode.go
+++ b/proto/decode.go
@@ -64,8 +64,12 @@
}
func (o UnmarshalOptions) unmarshal(b []byte, message Message) (out protoiface.UnmarshalOutput, err error) {
+ defaultResolver := false
if o.Resolver == nil {
o.Resolver = protoregistry.GlobalTypes
+ defaultResolver = true
+ } else if o.Resolver == protoregistry.GlobalTypes {
+ defaultResolver = true
}
if !o.Merge {
Reset(message)
@@ -83,6 +87,9 @@
if o.DiscardUnknown {
opts.Flags |= protoiface.UnmarshalDiscardUnknown
}
+ if defaultResolver {
+ opts.Flags |= protoiface.UnmarshalDefaultResolver
+ }
out, err = methods.Unmarshal(m, protoiface.UnmarshalInput{
Buf: b,
}, opts)