encode.go 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. package syntax
  2. import (
  3. "bytes"
  4. "fmt"
  5. "reflect"
  6. "runtime"
  7. )
  8. func Marshal(v interface{}) ([]byte, error) {
  9. e := &encodeState{}
  10. err := e.marshal(v, encOpts{})
  11. if err != nil {
  12. return nil, err
  13. }
  14. return e.Bytes(), nil
  15. }
  16. // Marshaler is the interface implemented by types that
  17. // have a defined TLS encoding.
  18. type Marshaler interface {
  19. MarshalTLS() ([]byte, error)
  20. }
  21. // These are the options that can be specified in the struct tag. Right now,
  22. // all of them apply to variable-length vectors and nothing else
  23. type encOpts struct {
  24. head uint // length of length in bytes
  25. min uint // minimum size in bytes
  26. max uint // maximum size in bytes
  27. varint bool // whether to encode as a varint
  28. }
  29. type encodeState struct {
  30. bytes.Buffer
  31. }
  32. func (e *encodeState) marshal(v interface{}, opts encOpts) (err error) {
  33. defer func() {
  34. if r := recover(); r != nil {
  35. if _, ok := r.(runtime.Error); ok {
  36. panic(r)
  37. }
  38. if s, ok := r.(string); ok {
  39. panic(s)
  40. }
  41. err = r.(error)
  42. }
  43. }()
  44. e.reflectValue(reflect.ValueOf(v), opts)
  45. return nil
  46. }
  47. func (e *encodeState) reflectValue(v reflect.Value, opts encOpts) {
  48. valueEncoder(v)(e, v, opts)
  49. }
  50. type encoderFunc func(e *encodeState, v reflect.Value, opts encOpts)
  51. func valueEncoder(v reflect.Value) encoderFunc {
  52. if !v.IsValid() {
  53. panic(fmt.Errorf("Cannot encode an invalid value"))
  54. }
  55. return typeEncoder(v.Type())
  56. }
  57. func typeEncoder(t reflect.Type) encoderFunc {
  58. // Note: Omits the caching / wait-group things that encoding/json uses
  59. return newTypeEncoder(t)
  60. }
  61. var (
  62. marshalerType = reflect.TypeOf(new(Marshaler)).Elem()
  63. )
  64. func newTypeEncoder(t reflect.Type) encoderFunc {
  65. if t.Implements(marshalerType) {
  66. return marshalerEncoder
  67. }
  68. switch t.Kind() {
  69. case reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  70. return uintEncoder
  71. case reflect.Array:
  72. return newArrayEncoder(t)
  73. case reflect.Slice:
  74. return newSliceEncoder(t)
  75. case reflect.Struct:
  76. return newStructEncoder(t)
  77. case reflect.Ptr:
  78. return newPointerEncoder(t)
  79. default:
  80. panic(fmt.Errorf("Unsupported type (%s)", t))
  81. }
  82. }
  83. ///// Specific encoders below
  84. func marshalerEncoder(e *encodeState, v reflect.Value, opts encOpts) {
  85. if v.Kind() == reflect.Ptr && v.IsNil() {
  86. panic(fmt.Errorf("Cannot encode nil pointer"))
  87. }
  88. m, ok := v.Interface().(Marshaler)
  89. if !ok {
  90. panic(fmt.Errorf("Non-Marshaler passed to marshalerEncoder"))
  91. }
  92. b, err := m.MarshalTLS()
  93. if err == nil {
  94. _, err = e.Write(b)
  95. }
  96. if err != nil {
  97. panic(err)
  98. }
  99. }
  100. //////////
  101. func uintEncoder(e *encodeState, v reflect.Value, opts encOpts) {
  102. if opts.varint {
  103. varintEncoder(e, v, opts)
  104. return
  105. }
  106. writeUint(e, v.Uint(), int(v.Type().Size()))
  107. }
  108. func varintEncoder(e *encodeState, v reflect.Value, opts encOpts) {
  109. writeVarint(e, v.Uint())
  110. }
  111. func writeVarint(e *encodeState, u uint64) {
  112. if (u >> 62) > 0 {
  113. panic(fmt.Errorf("uint value is too big for varint"))
  114. }
  115. var varintLen int
  116. for _, len := range []uint{1, 2, 4, 8} {
  117. if u < (uint64(1) << (8*len - 2)) {
  118. varintLen = int(len)
  119. break
  120. }
  121. }
  122. twoBits := map[int]uint64{1: 0x00, 2: 0x01, 4: 0x02, 8: 0x03}[varintLen]
  123. shift := uint(8*varintLen - 2)
  124. writeUint(e, u|(twoBits<<shift), varintLen)
  125. }
  126. func writeUint(e *encodeState, u uint64, len int) {
  127. data := make([]byte, len)
  128. for i := 0; i < len; i += 1 {
  129. data[i] = byte(u >> uint(8*(len-i-1)))
  130. }
  131. e.Write(data)
  132. }
  133. //////////
  134. type arrayEncoder struct {
  135. elemEnc encoderFunc
  136. }
  137. func (ae *arrayEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
  138. n := v.Len()
  139. for i := 0; i < n; i += 1 {
  140. ae.elemEnc(e, v.Index(i), opts)
  141. }
  142. }
  143. func newArrayEncoder(t reflect.Type) encoderFunc {
  144. enc := &arrayEncoder{typeEncoder(t.Elem())}
  145. return enc.encode
  146. }
  147. //////////
  148. type sliceEncoder struct {
  149. ae *arrayEncoder
  150. }
  151. func (se *sliceEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
  152. arrayState := &encodeState{}
  153. se.ae.encode(arrayState, v, opts)
  154. n := uint(arrayState.Len())
  155. if opts.head == 0 {
  156. panic(fmt.Errorf("Cannot encode a slice without a header length"))
  157. }
  158. if opts.max > 0 && n > opts.max {
  159. panic(fmt.Errorf("Encoded length more than max [%d > %d]", n, opts.max))
  160. }
  161. if n < opts.min {
  162. panic(fmt.Errorf("Encoded length less than min [%d < %d]", n, opts.min))
  163. }
  164. switch opts.head {
  165. case headValueNoHead:
  166. // None.
  167. case headValueVarint:
  168. writeVarint(e, uint64(n))
  169. default:
  170. if n>>(8*opts.head) > 0 {
  171. panic(fmt.Errorf("Encoded length too long for header length [%d, %d]", n, opts.head))
  172. }
  173. writeUint(e, uint64(n), int(opts.head))
  174. }
  175. e.Write(arrayState.Bytes())
  176. }
  177. func newSliceEncoder(t reflect.Type) encoderFunc {
  178. enc := &sliceEncoder{&arrayEncoder{typeEncoder(t.Elem())}}
  179. return enc.encode
  180. }
  181. //////////
  182. type structEncoder struct {
  183. fieldOpts []encOpts
  184. fieldEncs []encoderFunc
  185. }
  186. func (se *structEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
  187. for i := range se.fieldEncs {
  188. se.fieldEncs[i](e, v.Field(i), se.fieldOpts[i])
  189. }
  190. }
  191. func newStructEncoder(t reflect.Type) encoderFunc {
  192. n := t.NumField()
  193. se := structEncoder{
  194. fieldOpts: make([]encOpts, n),
  195. fieldEncs: make([]encoderFunc, n),
  196. }
  197. for i := 0; i < n; i += 1 {
  198. f := t.Field(i)
  199. tag := f.Tag.Get("tls")
  200. tagOpts := parseTag(tag)
  201. se.fieldOpts[i] = encOpts{
  202. head: tagOpts["head"],
  203. max: tagOpts["max"],
  204. min: tagOpts["min"],
  205. varint: tagOpts[varintOption] > 0,
  206. }
  207. se.fieldEncs[i] = typeEncoder(f.Type)
  208. }
  209. return se.encode
  210. }
  211. //////////
  212. type pointerEncoder struct {
  213. base encoderFunc
  214. }
  215. func (pe pointerEncoder) encode(e *encodeState, v reflect.Value, opts encOpts) {
  216. if v.IsNil() {
  217. panic(fmt.Errorf("Cannot marshal a struct containing a nil pointer"))
  218. }
  219. pe.base(e, v.Elem(), opts)
  220. }
  221. func newPointerEncoder(t reflect.Type) encoderFunc {
  222. baseEncoder := typeEncoder(t.Elem())
  223. pe := pointerEncoder{base: baseEncoder}
  224. return pe.encode
  225. }