protocol.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  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. import (
  21. "context"
  22. "errors"
  23. "fmt"
  24. )
  25. const (
  26. VERSION_MASK = 0xffff0000
  27. VERSION_1 = 0x80010000
  28. )
  29. type TProtocol interface {
  30. WriteMessageBegin(ctx context.Context, name string, typeId TMessageType, seqid int32) error
  31. WriteMessageEnd(ctx context.Context) error
  32. WriteStructBegin(ctx context.Context, name string) error
  33. WriteStructEnd(ctx context.Context) error
  34. WriteFieldBegin(ctx context.Context, name string, typeId TType, id int16) error
  35. WriteFieldEnd(ctx context.Context) error
  36. WriteFieldStop(ctx context.Context) error
  37. WriteMapBegin(ctx context.Context, keyType TType, valueType TType, size int) error
  38. WriteMapEnd(ctx context.Context) error
  39. WriteListBegin(ctx context.Context, elemType TType, size int) error
  40. WriteListEnd(ctx context.Context) error
  41. WriteSetBegin(ctx context.Context, elemType TType, size int) error
  42. WriteSetEnd(ctx context.Context) error
  43. WriteBool(ctx context.Context, value bool) error
  44. WriteByte(ctx context.Context, value int8) error
  45. WriteI16(ctx context.Context, value int16) error
  46. WriteI32(ctx context.Context, value int32) error
  47. WriteI64(ctx context.Context, value int64) error
  48. WriteDouble(ctx context.Context, value float64) error
  49. WriteString(ctx context.Context, value string) error
  50. WriteBinary(ctx context.Context, value []byte) error
  51. ReadMessageBegin(ctx context.Context) (name string, typeId TMessageType, seqid int32, err error)
  52. ReadMessageEnd(ctx context.Context) error
  53. ReadStructBegin(ctx context.Context) (name string, err error)
  54. ReadStructEnd(ctx context.Context) error
  55. ReadFieldBegin(ctx context.Context) (name string, typeId TType, id int16, err error)
  56. ReadFieldEnd(ctx context.Context) error
  57. ReadMapBegin(ctx context.Context) (keyType TType, valueType TType, size int, err error)
  58. ReadMapEnd(ctx context.Context) error
  59. ReadListBegin(ctx context.Context) (elemType TType, size int, err error)
  60. ReadListEnd(ctx context.Context) error
  61. ReadSetBegin(ctx context.Context) (elemType TType, size int, err error)
  62. ReadSetEnd(ctx context.Context) error
  63. ReadBool(ctx context.Context) (value bool, err error)
  64. ReadByte(ctx context.Context) (value int8, err error)
  65. ReadI16(ctx context.Context) (value int16, err error)
  66. ReadI32(ctx context.Context) (value int32, err error)
  67. ReadI64(ctx context.Context) (value int64, err error)
  68. ReadDouble(ctx context.Context) (value float64, err error)
  69. ReadString(ctx context.Context) (value string, err error)
  70. ReadBinary(ctx context.Context) (value []byte, err error)
  71. Skip(ctx context.Context, fieldType TType) (err error)
  72. Flush(ctx context.Context) (err error)
  73. Transport() TTransport
  74. }
  75. // The maximum recursive depth the skip() function will traverse
  76. const DEFAULT_RECURSION_DEPTH = 64
  77. // Skips over the next data element from the provided input TProtocol object.
  78. func SkipDefaultDepth(ctx context.Context, prot TProtocol, typeId TType) (err error) {
  79. return Skip(ctx, prot, typeId, DEFAULT_RECURSION_DEPTH)
  80. }
  81. // Skips over the next data element from the provided input TProtocol object.
  82. func Skip(ctx context.Context, self TProtocol, fieldType TType, maxDepth int) (err error) {
  83. if maxDepth <= 0 {
  84. return NewTProtocolExceptionWithType(DEPTH_LIMIT, errors.New("Depth limit exceeded"))
  85. }
  86. switch fieldType {
  87. case BOOL:
  88. _, err = self.ReadBool(ctx)
  89. return
  90. case BYTE:
  91. _, err = self.ReadByte(ctx)
  92. return
  93. case I16:
  94. _, err = self.ReadI16(ctx)
  95. return
  96. case I32:
  97. _, err = self.ReadI32(ctx)
  98. return
  99. case I64:
  100. _, err = self.ReadI64(ctx)
  101. return
  102. case DOUBLE:
  103. _, err = self.ReadDouble(ctx)
  104. return
  105. case STRING:
  106. _, err = self.ReadString(ctx)
  107. return
  108. case STRUCT:
  109. if _, err = self.ReadStructBegin(ctx); err != nil {
  110. return err
  111. }
  112. for {
  113. _, typeId, _, _ := self.ReadFieldBegin(ctx)
  114. if typeId == STOP {
  115. break
  116. }
  117. err := Skip(ctx, self, typeId, maxDepth-1)
  118. if err != nil {
  119. return err
  120. }
  121. self.ReadFieldEnd(ctx)
  122. }
  123. return self.ReadStructEnd(ctx)
  124. case MAP:
  125. keyType, valueType, size, err := self.ReadMapBegin(ctx)
  126. if err != nil {
  127. return err
  128. }
  129. for i := 0; i < size; i++ {
  130. err := Skip(ctx, self, keyType, maxDepth-1)
  131. if err != nil {
  132. return err
  133. }
  134. self.Skip(ctx, valueType)
  135. }
  136. return self.ReadMapEnd(ctx)
  137. case SET:
  138. elemType, size, err := self.ReadSetBegin(ctx)
  139. if err != nil {
  140. return err
  141. }
  142. for i := 0; i < size; i++ {
  143. err := Skip(ctx, self, elemType, maxDepth-1)
  144. if err != nil {
  145. return err
  146. }
  147. }
  148. return self.ReadSetEnd(ctx)
  149. case LIST:
  150. elemType, size, err := self.ReadListBegin(ctx)
  151. if err != nil {
  152. return err
  153. }
  154. for i := 0; i < size; i++ {
  155. err := Skip(ctx, self, elemType, maxDepth-1)
  156. if err != nil {
  157. return err
  158. }
  159. }
  160. return self.ReadListEnd(ctx)
  161. default:
  162. return NewTProtocolExceptionWithType(INVALID_DATA, errors.New(fmt.Sprintf("Unknown data type %d", fieldType)))
  163. }
  164. return nil
  165. }