decode.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796
  1. // Copyright 2018 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package prototext
  5. import (
  6. "fmt"
  7. "strings"
  8. "unicode/utf8"
  9. "google.golang.org/protobuf/internal/encoding/messageset"
  10. "google.golang.org/protobuf/internal/encoding/text"
  11. "google.golang.org/protobuf/internal/errors"
  12. "google.golang.org/protobuf/internal/fieldnum"
  13. "google.golang.org/protobuf/internal/flags"
  14. "google.golang.org/protobuf/internal/pragma"
  15. "google.golang.org/protobuf/internal/set"
  16. "google.golang.org/protobuf/internal/strs"
  17. "google.golang.org/protobuf/proto"
  18. pref "google.golang.org/protobuf/reflect/protoreflect"
  19. "google.golang.org/protobuf/reflect/protoregistry"
  20. )
  21. // Unmarshal reads the given []byte into the given proto.Message.
  22. func Unmarshal(b []byte, m proto.Message) error {
  23. return UnmarshalOptions{}.Unmarshal(b, m)
  24. }
  25. // UnmarshalOptions is a configurable textproto format unmarshaler.
  26. type UnmarshalOptions struct {
  27. pragma.NoUnkeyedLiterals
  28. // AllowPartial accepts input for messages that will result in missing
  29. // required fields. If AllowPartial is false (the default), Unmarshal will
  30. // return error if there are any missing required fields.
  31. AllowPartial bool
  32. // DiscardUnknown specifies whether to ignore unknown fields when parsing.
  33. // An unknown field is any field whose field name or field number does not
  34. // resolve to any known or extension field in the message.
  35. // By default, unmarshal rejects unknown fields as an error.
  36. DiscardUnknown bool
  37. // Resolver is used for looking up types when unmarshaling
  38. // google.protobuf.Any messages or extension fields.
  39. // If nil, this defaults to using protoregistry.GlobalTypes.
  40. Resolver interface {
  41. protoregistry.MessageTypeResolver
  42. protoregistry.ExtensionTypeResolver
  43. }
  44. }
  45. // Unmarshal reads the given []byte and populates the given proto.Message using options in
  46. // UnmarshalOptions object.
  47. func (o UnmarshalOptions) Unmarshal(b []byte, m proto.Message) error {
  48. return o.unmarshal(b, m)
  49. }
  50. // unmarshal is a centralized function that all unmarshal operations go through.
  51. // For profiling purposes, avoid changing the name of this function or
  52. // introducing other code paths for unmarshal that do not go through this.
  53. func (o UnmarshalOptions) unmarshal(b []byte, m proto.Message) error {
  54. proto.Reset(m)
  55. if o.Resolver == nil {
  56. o.Resolver = protoregistry.GlobalTypes
  57. }
  58. dec := decoder{text.NewDecoder(b), o}
  59. if err := dec.unmarshalMessage(m.ProtoReflect(), false); err != nil {
  60. return err
  61. }
  62. if o.AllowPartial {
  63. return nil
  64. }
  65. return proto.CheckInitialized(m)
  66. }
  67. type decoder struct {
  68. *text.Decoder
  69. opts UnmarshalOptions
  70. }
  71. // newError returns an error object with position info.
  72. func (d decoder) newError(pos int, f string, x ...interface{}) error {
  73. line, column := d.Position(pos)
  74. head := fmt.Sprintf("(line %d:%d): ", line, column)
  75. return errors.New(head+f, x...)
  76. }
  77. // unexpectedTokenError returns a syntax error for the given unexpected token.
  78. func (d decoder) unexpectedTokenError(tok text.Token) error {
  79. return d.syntaxError(tok.Pos(), "unexpected token: %s", tok.RawString())
  80. }
  81. // syntaxError returns a syntax error for given position.
  82. func (d decoder) syntaxError(pos int, f string, x ...interface{}) error {
  83. line, column := d.Position(pos)
  84. head := fmt.Sprintf("syntax error (line %d:%d): ", line, column)
  85. return errors.New(head+f, x...)
  86. }
  87. // unmarshalMessage unmarshals into the given protoreflect.Message.
  88. func (d decoder) unmarshalMessage(m pref.Message, checkDelims bool) error {
  89. messageDesc := m.Descriptor()
  90. if !flags.ProtoLegacy && messageset.IsMessageSet(messageDesc) {
  91. return errors.New("no support for proto1 MessageSets")
  92. }
  93. if messageDesc.FullName() == "google.protobuf.Any" {
  94. return d.unmarshalAny(m, checkDelims)
  95. }
  96. if checkDelims {
  97. tok, err := d.Read()
  98. if err != nil {
  99. return err
  100. }
  101. if tok.Kind() != text.MessageOpen {
  102. return d.unexpectedTokenError(tok)
  103. }
  104. }
  105. var seenNums set.Ints
  106. var seenOneofs set.Ints
  107. fieldDescs := messageDesc.Fields()
  108. for {
  109. // Read field name.
  110. tok, err := d.Read()
  111. if err != nil {
  112. return err
  113. }
  114. switch typ := tok.Kind(); typ {
  115. case text.Name:
  116. // Continue below.
  117. case text.EOF:
  118. if checkDelims {
  119. return text.ErrUnexpectedEOF
  120. }
  121. return nil
  122. default:
  123. if checkDelims && typ == text.MessageClose {
  124. return nil
  125. }
  126. return d.unexpectedTokenError(tok)
  127. }
  128. // Resolve the field descriptor.
  129. var name pref.Name
  130. var fd pref.FieldDescriptor
  131. var xt pref.ExtensionType
  132. var xtErr error
  133. var isFieldNumberName bool
  134. switch tok.NameKind() {
  135. case text.IdentName:
  136. name = pref.Name(tok.IdentName())
  137. fd = fieldDescs.ByName(name)
  138. if fd == nil {
  139. // The proto name of a group field is in all lowercase,
  140. // while the textproto field name is the group message name.
  141. gd := fieldDescs.ByName(pref.Name(strings.ToLower(string(name))))
  142. if gd != nil && gd.Kind() == pref.GroupKind && gd.Message().Name() == name {
  143. fd = gd
  144. }
  145. } else if fd.Kind() == pref.GroupKind && fd.Message().Name() != name {
  146. fd = nil // reset since field name is actually the message name
  147. }
  148. case text.TypeName:
  149. // Handle extensions only. This code path is not for Any.
  150. xt, xtErr = d.findExtension(pref.FullName(tok.TypeName()))
  151. case text.FieldNumber:
  152. isFieldNumberName = true
  153. num := pref.FieldNumber(tok.FieldNumber())
  154. if !num.IsValid() {
  155. return d.newError(tok.Pos(), "invalid field number: %d", num)
  156. }
  157. fd = fieldDescs.ByNumber(num)
  158. if fd == nil {
  159. xt, xtErr = d.opts.Resolver.FindExtensionByNumber(messageDesc.FullName(), num)
  160. }
  161. }
  162. if xt != nil {
  163. fd = xt.TypeDescriptor()
  164. if !messageDesc.ExtensionRanges().Has(fd.Number()) || fd.ContainingMessage().FullName() != messageDesc.FullName() {
  165. return d.newError(tok.Pos(), "message %v cannot be extended by %v", messageDesc.FullName(), fd.FullName())
  166. }
  167. } else if xtErr != nil && xtErr != protoregistry.NotFound {
  168. return d.newError(tok.Pos(), "unable to resolve [%s]: %v", tok.RawString(), xtErr)
  169. }
  170. if flags.ProtoLegacy {
  171. if fd != nil && fd.IsWeak() && fd.Message().IsPlaceholder() {
  172. fd = nil // reset since the weak reference is not linked in
  173. }
  174. }
  175. // Handle unknown fields.
  176. if fd == nil {
  177. if d.opts.DiscardUnknown || messageDesc.ReservedNames().Has(name) {
  178. d.skipValue()
  179. continue
  180. }
  181. return d.newError(tok.Pos(), "unknown field: %v", tok.RawString())
  182. }
  183. // Handle fields identified by field number.
  184. if isFieldNumberName {
  185. // TODO: Add an option to permit parsing field numbers.
  186. //
  187. // This requires careful thought as the MarshalOptions.EmitUnknown
  188. // option allows formatting unknown fields as the field number and the
  189. // best-effort textual representation of the field value. In that case,
  190. // it may not be possible to unmarshal the value from a parser that does
  191. // have information about the unknown field.
  192. return d.newError(tok.Pos(), "cannot specify field by number: %v", tok.RawString())
  193. }
  194. switch {
  195. case fd.IsList():
  196. kind := fd.Kind()
  197. if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() {
  198. return d.syntaxError(tok.Pos(), "missing field separator :")
  199. }
  200. list := m.Mutable(fd).List()
  201. if err := d.unmarshalList(fd, list); err != nil {
  202. return err
  203. }
  204. case fd.IsMap():
  205. mmap := m.Mutable(fd).Map()
  206. if err := d.unmarshalMap(fd, mmap); err != nil {
  207. return err
  208. }
  209. default:
  210. kind := fd.Kind()
  211. if kind != pref.MessageKind && kind != pref.GroupKind && !tok.HasSeparator() {
  212. return d.syntaxError(tok.Pos(), "missing field separator :")
  213. }
  214. // If field is a oneof, check if it has already been set.
  215. if od := fd.ContainingOneof(); od != nil {
  216. idx := uint64(od.Index())
  217. if seenOneofs.Has(idx) {
  218. return d.newError(tok.Pos(), "error parsing %q, oneof %v is already set", tok.RawString(), od.FullName())
  219. }
  220. seenOneofs.Set(idx)
  221. }
  222. num := uint64(fd.Number())
  223. if seenNums.Has(num) {
  224. return d.newError(tok.Pos(), "non-repeated field %q is repeated", tok.RawString())
  225. }
  226. if err := d.unmarshalSingular(fd, m); err != nil {
  227. return err
  228. }
  229. seenNums.Set(num)
  230. }
  231. }
  232. return nil
  233. }
  234. // findExtension returns protoreflect.ExtensionType from the Resolver if found.
  235. func (d decoder) findExtension(xtName pref.FullName) (pref.ExtensionType, error) {
  236. xt, err := d.opts.Resolver.FindExtensionByName(xtName)
  237. if err == nil {
  238. return xt, nil
  239. }
  240. return messageset.FindMessageSetExtension(d.opts.Resolver, xtName)
  241. }
  242. // unmarshalSingular unmarshals a non-repeated field value specified by the
  243. // given FieldDescriptor.
  244. func (d decoder) unmarshalSingular(fd pref.FieldDescriptor, m pref.Message) error {
  245. var val pref.Value
  246. var err error
  247. switch fd.Kind() {
  248. case pref.MessageKind, pref.GroupKind:
  249. val = m.NewField(fd)
  250. err = d.unmarshalMessage(val.Message(), true)
  251. default:
  252. val, err = d.unmarshalScalar(fd)
  253. }
  254. if err == nil {
  255. m.Set(fd, val)
  256. }
  257. return err
  258. }
  259. // unmarshalScalar unmarshals a scalar/enum protoreflect.Value specified by the
  260. // given FieldDescriptor.
  261. func (d decoder) unmarshalScalar(fd pref.FieldDescriptor) (pref.Value, error) {
  262. tok, err := d.Read()
  263. if err != nil {
  264. return pref.Value{}, err
  265. }
  266. if tok.Kind() != text.Scalar {
  267. return pref.Value{}, d.unexpectedTokenError(tok)
  268. }
  269. kind := fd.Kind()
  270. switch kind {
  271. case pref.BoolKind:
  272. if b, ok := tok.Bool(); ok {
  273. return pref.ValueOfBool(b), nil
  274. }
  275. case pref.Int32Kind, pref.Sint32Kind, pref.Sfixed32Kind:
  276. if n, ok := tok.Int32(); ok {
  277. return pref.ValueOfInt32(n), nil
  278. }
  279. case pref.Int64Kind, pref.Sint64Kind, pref.Sfixed64Kind:
  280. if n, ok := tok.Int64(); ok {
  281. return pref.ValueOfInt64(n), nil
  282. }
  283. case pref.Uint32Kind, pref.Fixed32Kind:
  284. if n, ok := tok.Uint32(); ok {
  285. return pref.ValueOfUint32(n), nil
  286. }
  287. case pref.Uint64Kind, pref.Fixed64Kind:
  288. if n, ok := tok.Uint64(); ok {
  289. return pref.ValueOfUint64(n), nil
  290. }
  291. case pref.FloatKind:
  292. if n, ok := tok.Float32(); ok {
  293. return pref.ValueOfFloat32(n), nil
  294. }
  295. case pref.DoubleKind:
  296. if n, ok := tok.Float64(); ok {
  297. return pref.ValueOfFloat64(n), nil
  298. }
  299. case pref.StringKind:
  300. if s, ok := tok.String(); ok {
  301. if strs.EnforceUTF8(fd) && !utf8.ValidString(s) {
  302. return pref.Value{}, d.newError(tok.Pos(), "contains invalid UTF-8")
  303. }
  304. return pref.ValueOfString(s), nil
  305. }
  306. case pref.BytesKind:
  307. if b, ok := tok.String(); ok {
  308. return pref.ValueOfBytes([]byte(b)), nil
  309. }
  310. case pref.EnumKind:
  311. if lit, ok := tok.Enum(); ok {
  312. // Lookup EnumNumber based on name.
  313. if enumVal := fd.Enum().Values().ByName(pref.Name(lit)); enumVal != nil {
  314. return pref.ValueOfEnum(enumVal.Number()), nil
  315. }
  316. }
  317. if num, ok := tok.Int32(); ok {
  318. return pref.ValueOfEnum(pref.EnumNumber(num)), nil
  319. }
  320. default:
  321. panic(fmt.Sprintf("invalid scalar kind %v", kind))
  322. }
  323. return pref.Value{}, d.newError(tok.Pos(), "invalid value for %v type: %v", kind, tok.RawString())
  324. }
  325. // unmarshalList unmarshals into given protoreflect.List. A list value can
  326. // either be in [] syntax or simply just a single scalar/message value.
  327. func (d decoder) unmarshalList(fd pref.FieldDescriptor, list pref.List) error {
  328. tok, err := d.Peek()
  329. if err != nil {
  330. return err
  331. }
  332. switch fd.Kind() {
  333. case pref.MessageKind, pref.GroupKind:
  334. switch tok.Kind() {
  335. case text.ListOpen:
  336. d.Read()
  337. for {
  338. tok, err := d.Peek()
  339. if err != nil {
  340. return err
  341. }
  342. switch tok.Kind() {
  343. case text.ListClose:
  344. d.Read()
  345. return nil
  346. case text.MessageOpen:
  347. pval := list.NewElement()
  348. if err := d.unmarshalMessage(pval.Message(), true); err != nil {
  349. return err
  350. }
  351. list.Append(pval)
  352. default:
  353. return d.unexpectedTokenError(tok)
  354. }
  355. }
  356. case text.MessageOpen:
  357. pval := list.NewElement()
  358. if err := d.unmarshalMessage(pval.Message(), true); err != nil {
  359. return err
  360. }
  361. list.Append(pval)
  362. return nil
  363. }
  364. default:
  365. switch tok.Kind() {
  366. case text.ListOpen:
  367. d.Read()
  368. for {
  369. tok, err := d.Peek()
  370. if err != nil {
  371. return err
  372. }
  373. switch tok.Kind() {
  374. case text.ListClose:
  375. d.Read()
  376. return nil
  377. case text.Scalar:
  378. pval, err := d.unmarshalScalar(fd)
  379. if err != nil {
  380. return err
  381. }
  382. list.Append(pval)
  383. default:
  384. return d.unexpectedTokenError(tok)
  385. }
  386. }
  387. case text.Scalar:
  388. pval, err := d.unmarshalScalar(fd)
  389. if err != nil {
  390. return err
  391. }
  392. list.Append(pval)
  393. return nil
  394. }
  395. }
  396. return d.unexpectedTokenError(tok)
  397. }
  398. // unmarshalMap unmarshals into given protoreflect.Map. A map value is a
  399. // textproto message containing {key: <kvalue>, value: <mvalue>}.
  400. func (d decoder) unmarshalMap(fd pref.FieldDescriptor, mmap pref.Map) error {
  401. // Determine ahead whether map entry is a scalar type or a message type in
  402. // order to call the appropriate unmarshalMapValue func inside
  403. // unmarshalMapEntry.
  404. var unmarshalMapValue func() (pref.Value, error)
  405. switch fd.MapValue().Kind() {
  406. case pref.MessageKind, pref.GroupKind:
  407. unmarshalMapValue = func() (pref.Value, error) {
  408. pval := mmap.NewValue()
  409. if err := d.unmarshalMessage(pval.Message(), true); err != nil {
  410. return pref.Value{}, err
  411. }
  412. return pval, nil
  413. }
  414. default:
  415. unmarshalMapValue = func() (pref.Value, error) {
  416. return d.unmarshalScalar(fd.MapValue())
  417. }
  418. }
  419. tok, err := d.Read()
  420. if err != nil {
  421. return err
  422. }
  423. switch tok.Kind() {
  424. case text.MessageOpen:
  425. return d.unmarshalMapEntry(fd, mmap, unmarshalMapValue)
  426. case text.ListOpen:
  427. for {
  428. tok, err := d.Read()
  429. if err != nil {
  430. return err
  431. }
  432. switch tok.Kind() {
  433. case text.ListClose:
  434. return nil
  435. case text.MessageOpen:
  436. if err := d.unmarshalMapEntry(fd, mmap, unmarshalMapValue); err != nil {
  437. return err
  438. }
  439. default:
  440. return d.unexpectedTokenError(tok)
  441. }
  442. }
  443. default:
  444. return d.unexpectedTokenError(tok)
  445. }
  446. }
  447. // unmarshalMap unmarshals into given protoreflect.Map. A map value is a
  448. // textproto message containing {key: <kvalue>, value: <mvalue>}.
  449. func (d decoder) unmarshalMapEntry(fd pref.FieldDescriptor, mmap pref.Map, unmarshalMapValue func() (pref.Value, error)) error {
  450. var key pref.MapKey
  451. var pval pref.Value
  452. Loop:
  453. for {
  454. // Read field name.
  455. tok, err := d.Read()
  456. if err != nil {
  457. return err
  458. }
  459. switch tok.Kind() {
  460. case text.Name:
  461. if tok.NameKind() != text.IdentName {
  462. if !d.opts.DiscardUnknown {
  463. return d.newError(tok.Pos(), "unknown map entry field %q", tok.RawString())
  464. }
  465. d.skipValue()
  466. continue Loop
  467. }
  468. // Continue below.
  469. case text.MessageClose:
  470. break Loop
  471. default:
  472. return d.unexpectedTokenError(tok)
  473. }
  474. name := tok.IdentName()
  475. switch name {
  476. case "key":
  477. if !tok.HasSeparator() {
  478. return d.syntaxError(tok.Pos(), "missing field separator :")
  479. }
  480. if key.IsValid() {
  481. return d.newError(tok.Pos(), `map entry "key" cannot be repeated`)
  482. }
  483. val, err := d.unmarshalScalar(fd.MapKey())
  484. if err != nil {
  485. return err
  486. }
  487. key = val.MapKey()
  488. case "value":
  489. if kind := fd.MapValue().Kind(); (kind != pref.MessageKind) && (kind != pref.GroupKind) {
  490. if !tok.HasSeparator() {
  491. return d.syntaxError(tok.Pos(), "missing field separator :")
  492. }
  493. }
  494. if pval.IsValid() {
  495. return d.newError(tok.Pos(), `map entry "value" cannot be repeated`)
  496. }
  497. pval, err = unmarshalMapValue()
  498. if err != nil {
  499. return err
  500. }
  501. default:
  502. if !d.opts.DiscardUnknown {
  503. return d.newError(tok.Pos(), "unknown map entry field %q", name)
  504. }
  505. d.skipValue()
  506. }
  507. }
  508. if !key.IsValid() {
  509. key = fd.MapKey().Default().MapKey()
  510. }
  511. if !pval.IsValid() {
  512. switch fd.MapValue().Kind() {
  513. case pref.MessageKind, pref.GroupKind:
  514. // If value field is not set for message/group types, construct an
  515. // empty one as default.
  516. pval = mmap.NewValue()
  517. default:
  518. pval = fd.MapValue().Default()
  519. }
  520. }
  521. mmap.Set(key, pval)
  522. return nil
  523. }
  524. // unmarshalAny unmarshals an Any textproto. It can either be in expanded form
  525. // or non-expanded form.
  526. func (d decoder) unmarshalAny(m pref.Message, checkDelims bool) error {
  527. var typeURL string
  528. var bValue []byte
  529. // hasFields tracks which valid fields have been seen in the loop below in
  530. // order to flag an error if there are duplicates or conflicts. It may
  531. // contain the strings "type_url", "value" and "expanded". The literal
  532. // "expanded" is used to indicate that the expanded form has been
  533. // encountered already.
  534. hasFields := map[string]bool{}
  535. if checkDelims {
  536. tok, err := d.Read()
  537. if err != nil {
  538. return err
  539. }
  540. if tok.Kind() != text.MessageOpen {
  541. return d.unexpectedTokenError(tok)
  542. }
  543. }
  544. Loop:
  545. for {
  546. // Read field name. Can only have 3 possible field names, i.e. type_url,
  547. // value and type URL name inside [].
  548. tok, err := d.Read()
  549. if err != nil {
  550. return err
  551. }
  552. if typ := tok.Kind(); typ != text.Name {
  553. if checkDelims {
  554. if typ == text.MessageClose {
  555. break Loop
  556. }
  557. } else if typ == text.EOF {
  558. break Loop
  559. }
  560. return d.unexpectedTokenError(tok)
  561. }
  562. switch tok.NameKind() {
  563. case text.IdentName:
  564. // Both type_url and value fields require field separator :.
  565. if !tok.HasSeparator() {
  566. return d.syntaxError(tok.Pos(), "missing field separator :")
  567. }
  568. switch tok.IdentName() {
  569. case "type_url":
  570. if hasFields["type_url"] {
  571. return d.newError(tok.Pos(), "duplicate Any type_url field")
  572. }
  573. if hasFields["expanded"] {
  574. return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
  575. }
  576. tok, err := d.Read()
  577. if err != nil {
  578. return err
  579. }
  580. var ok bool
  581. typeURL, ok = tok.String()
  582. if !ok {
  583. return d.newError(tok.Pos(), "invalid Any type_url: %v", tok.RawString())
  584. }
  585. hasFields["type_url"] = true
  586. case "value":
  587. if hasFields["value"] {
  588. return d.newError(tok.Pos(), "duplicate Any value field")
  589. }
  590. if hasFields["expanded"] {
  591. return d.newError(tok.Pos(), "conflict with [%s] field", typeURL)
  592. }
  593. tok, err := d.Read()
  594. if err != nil {
  595. return err
  596. }
  597. s, ok := tok.String()
  598. if !ok {
  599. return d.newError(tok.Pos(), "invalid Any value: %v", tok.RawString())
  600. }
  601. bValue = []byte(s)
  602. hasFields["value"] = true
  603. default:
  604. if !d.opts.DiscardUnknown {
  605. return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString())
  606. }
  607. }
  608. case text.TypeName:
  609. if hasFields["expanded"] {
  610. return d.newError(tok.Pos(), "cannot have more than one type")
  611. }
  612. if hasFields["type_url"] {
  613. return d.newError(tok.Pos(), "conflict with type_url field")
  614. }
  615. typeURL = tok.TypeName()
  616. var err error
  617. bValue, err = d.unmarshalExpandedAny(typeURL, tok.Pos())
  618. if err != nil {
  619. return err
  620. }
  621. hasFields["expanded"] = true
  622. default:
  623. if !d.opts.DiscardUnknown {
  624. return d.newError(tok.Pos(), "invalid field name %q in google.protobuf.Any message", tok.RawString())
  625. }
  626. }
  627. }
  628. fds := m.Descriptor().Fields()
  629. if len(typeURL) > 0 {
  630. m.Set(fds.ByNumber(fieldnum.Any_TypeUrl), pref.ValueOfString(typeURL))
  631. }
  632. if len(bValue) > 0 {
  633. m.Set(fds.ByNumber(fieldnum.Any_Value), pref.ValueOfBytes(bValue))
  634. }
  635. return nil
  636. }
  637. func (d decoder) unmarshalExpandedAny(typeURL string, pos int) ([]byte, error) {
  638. mt, err := d.opts.Resolver.FindMessageByURL(typeURL)
  639. if err != nil {
  640. return nil, d.newError(pos, "unable to resolve message [%v]: %v", typeURL, err)
  641. }
  642. // Create new message for the embedded message type and unmarshal the value
  643. // field into it.
  644. m := mt.New()
  645. if err := d.unmarshalMessage(m, true); err != nil {
  646. return nil, err
  647. }
  648. // Serialize the embedded message and return the resulting bytes.
  649. b, err := proto.MarshalOptions{
  650. AllowPartial: true, // Never check required fields inside an Any.
  651. Deterministic: true,
  652. }.Marshal(m.Interface())
  653. if err != nil {
  654. return nil, d.newError(pos, "error in marshaling message into Any.value: %v", err)
  655. }
  656. return b, nil
  657. }
  658. // skipValue makes the decoder parse a field value in order to advance the read
  659. // to the next field. It relies on Read returning an error if the types are not
  660. // in valid sequence.
  661. func (d decoder) skipValue() error {
  662. tok, err := d.Read()
  663. if err != nil {
  664. return err
  665. }
  666. // Only need to continue reading for messages and lists.
  667. switch tok.Kind() {
  668. case text.MessageOpen:
  669. return d.skipMessageValue()
  670. case text.ListOpen:
  671. for {
  672. tok, err := d.Read()
  673. if err != nil {
  674. return err
  675. }
  676. switch tok.Kind() {
  677. case text.ListClose:
  678. return nil
  679. case text.MessageOpen:
  680. return d.skipMessageValue()
  681. default:
  682. // Skip items. This will not validate whether skipped values are
  683. // of the same type or not, same behavior as C++
  684. // TextFormat::Parser::AllowUnknownField(true) version 3.8.0.
  685. if err := d.skipValue(); err != nil {
  686. return err
  687. }
  688. }
  689. }
  690. }
  691. return nil
  692. }
  693. // skipMessageValue makes the decoder parse and skip over all fields in a
  694. // message. It assumes that the previous read type is MessageOpen.
  695. func (d decoder) skipMessageValue() error {
  696. for {
  697. tok, err := d.Read()
  698. if err != nil {
  699. return err
  700. }
  701. switch tok.Kind() {
  702. case text.MessageClose:
  703. return nil
  704. case text.Name:
  705. if err := d.skipValue(); err != nil {
  706. return err
  707. }
  708. }
  709. }
  710. }