protocol.go 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * Licensed to the Apache Software Foundation (ASF) under one
  3. * or more contributor license agreements. See the NOTICE file
  4. * distributed with this work for additional information
  5. * regarding copyright ownership. The ASF licenses this file
  6. * to you under the Apache License, Version 2.0 (the
  7. * "License"); you may not use this file except in compliance
  8. * with the License. You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing,
  13. * software distributed under the License is distributed on an
  14. * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
  15. * KIND, either express or implied. See the License for the
  16. * specific language governing permissions and limitations
  17. * under the License.
  18. */
  19. package thrift
  20. const (
  21. VERSION_MASK = 0xffff0000
  22. VERSION_1 = 0x80010000
  23. )
  24. type TProtocol interface {
  25. WriteMessageBegin(name string, typeId TMessageType, seqid int32) error
  26. WriteMessageEnd() error
  27. WriteStructBegin(name string) error
  28. WriteStructEnd() error
  29. WriteFieldBegin(name string, typeId TType, id int16) error
  30. WriteFieldEnd() error
  31. WriteFieldStop() error
  32. WriteMapBegin(keyType TType, valueType TType, size int) error
  33. WriteMapEnd() error
  34. WriteListBegin(elemType TType, size int) error
  35. WriteListEnd() error
  36. WriteSetBegin(elemType TType, size int) error
  37. WriteSetEnd() error
  38. WriteBool(value bool) error
  39. WriteByte(value byte) error
  40. WriteI16(value int16) error
  41. WriteI32(value int32) error
  42. WriteI64(value int64) error
  43. WriteDouble(value float64) error
  44. WriteString(value string) error
  45. WriteBinary(value []byte) error
  46. ReadMessageBegin() (name string, typeId TMessageType, seqid int32, err error)
  47. ReadMessageEnd() error
  48. ReadStructBegin() (name string, err error)
  49. ReadStructEnd() error
  50. ReadFieldBegin() (name string, typeId TType, id int16, err error)
  51. ReadFieldEnd() error
  52. ReadMapBegin() (keyType TType, valueType TType, size int, err error)
  53. ReadMapEnd() error
  54. ReadListBegin() (elemType TType, size int, err error)
  55. ReadListEnd() error
  56. ReadSetBegin() (elemType TType, size int, err error)
  57. ReadSetEnd() error
  58. ReadBool() (value bool, err error)
  59. ReadByte() (value byte, err error)
  60. ReadI16() (value int16, err error)
  61. ReadI32() (value int32, err error)
  62. ReadI64() (value int64, err error)
  63. ReadDouble() (value float64, err error)
  64. ReadString() (value string, err error)
  65. ReadBinary() (value []byte, err error)
  66. Skip(fieldType TType) (err error)
  67. Flush() (err error)
  68. Transport() TTransport
  69. }
  70. // The maximum recursive depth the skip() function will traverse
  71. var MaxSkipDepth = 1<<31 - 1
  72. // Skips over the next data element from the provided input TProtocol object.
  73. func SkipDefaultDepth(prot TProtocol, typeId TType) (err error) {
  74. return Skip(prot, typeId, MaxSkipDepth)
  75. }
  76. // Skips over the next data element from the provided input TProtocol object.
  77. func Skip(self TProtocol, fieldType TType, maxDepth int) (err error) {
  78. switch fieldType {
  79. case STOP:
  80. return
  81. case BOOL:
  82. _, err = self.ReadBool()
  83. return
  84. case BYTE:
  85. _, err = self.ReadByte()
  86. return
  87. case I16:
  88. _, err = self.ReadI16()
  89. return
  90. case I32:
  91. _, err = self.ReadI32()
  92. return
  93. case I64:
  94. _, err = self.ReadI64()
  95. return
  96. case DOUBLE:
  97. _, err = self.ReadDouble()
  98. return
  99. case STRING:
  100. _, err = self.ReadString()
  101. return
  102. case STRUCT:
  103. if _, err = self.ReadStructBegin(); err != nil {
  104. return err
  105. }
  106. for {
  107. _, typeId, _, _ := self.ReadFieldBegin()
  108. if typeId == STOP {
  109. break
  110. }
  111. Skip(self, typeId, maxDepth-1)
  112. self.ReadFieldEnd()
  113. }
  114. return self.ReadStructEnd()
  115. case MAP:
  116. keyType, valueType, size, err := self.ReadMapBegin()
  117. if err != nil {
  118. return err
  119. }
  120. for i := 0; i < size; i++ {
  121. Skip(self, keyType, maxDepth-1)
  122. self.Skip(valueType)
  123. }
  124. return self.ReadMapEnd()
  125. case SET:
  126. elemType, size, err := self.ReadSetBegin()
  127. if err != nil {
  128. return err
  129. }
  130. for i := 0; i < size; i++ {
  131. Skip(self, elemType, maxDepth-1)
  132. }
  133. return self.ReadSetEnd()
  134. case LIST:
  135. elemType, size, err := self.ReadListBegin()
  136. if err != nil {
  137. return err
  138. }
  139. for i := 0; i < size; i++ {
  140. Skip(self, elemType, maxDepth-1)
  141. }
  142. return self.ReadListEnd()
  143. }
  144. return nil
  145. }