You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

decode.go 21 kB

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