request.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. package rpc
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "git.nspix.com/golang/micro/gateway/rpc/codec"
  6. "io"
  7. "net"
  8. )
  9. type Request struct {
  10. codec codec.Codec
  11. conn net.Conn
  12. Method string
  13. Header map[string]string
  14. ContentLength int
  15. Sequence uint16
  16. Body interface{}
  17. body []byte
  18. }
  19. func (r *Request) reset(seq uint16, conn net.Conn) {
  20. r.Sequence = seq
  21. r.conn = conn
  22. }
  23. //解码内容
  24. func (r *Request) Decode(i interface{}) (err error) {
  25. return r.codec.Decode(r.body, i)
  26. }
  27. func (r *Request) RemoteAddr() net.Addr {
  28. if r.conn != nil {
  29. return r.conn.RemoteAddr()
  30. }
  31. return nil
  32. }
  33. func (r *Request) Bytes() []byte {
  34. buf := &bytes.Buffer{}
  35. if _, err := r.WriteTo(buf); err == nil {
  36. return buf.Bytes()
  37. }
  38. return nil
  39. }
  40. func (r *Request) WriteTo(w io.Writer) (n int64, err error) {
  41. var (
  42. headerBuffer []byte
  43. bodyBuffer []byte
  44. m int
  45. headerLen int
  46. bodyLen int
  47. )
  48. if r.Header == nil {
  49. r.Header = make(map[string]string)
  50. }
  51. r.Header["_METHOD"] = r.Method
  52. if headerBuffer, err = r.codec.Encode(r.Header); err != nil {
  53. return
  54. }
  55. if bodyBuffer, err = r.codec.Encode(r.Body); err != nil {
  56. return
  57. }
  58. headerLen = len(headerBuffer)
  59. bodyLen = len(bodyBuffer)
  60. if err = binary.Write(w, binary.LittleEndian, uint16(headerLen)); err != nil {
  61. return
  62. }
  63. n += 2
  64. if err = binary.Write(w, binary.LittleEndian, uint16(bodyLen)); err != nil {
  65. return
  66. }
  67. n += 2
  68. if m, err = w.Write(headerBuffer); err == nil {
  69. n += int64(m)
  70. }
  71. if m, err = w.Write(bodyBuffer); err == nil {
  72. n += int64(m)
  73. }
  74. return
  75. }
  76. func ReadRequest(b []byte) (req *Request, err error) {
  77. var (
  78. p []byte
  79. headerBuffer []byte
  80. bodyBuffer []byte
  81. headerLen uint16
  82. bodyLen uint16
  83. )
  84. req = &Request{
  85. codec: codec.DefaultCodec,
  86. Header: make(map[string]string),
  87. }
  88. if b == nil || len(b) <= 4 {
  89. err = io.ErrShortBuffer
  90. return
  91. }
  92. headerLen = binary.LittleEndian.Uint16(b[0:2])
  93. bodyLen = binary.LittleEndian.Uint16(b[2:4])
  94. p = b[4:]
  95. if headerLen > 0 {
  96. if len(p) < int(headerLen) {
  97. err = io.ErrShortBuffer
  98. return
  99. }
  100. headerBuffer = p[:headerLen]
  101. if err = req.codec.Decode(headerBuffer, &req.Header); err != nil {
  102. return
  103. }
  104. req.Method = req.Header["_METHOD"]
  105. p = p[headerLen:]
  106. }
  107. if bodyLen > 0 {
  108. if len(p) < int(bodyLen) {
  109. err = io.ErrShortBuffer
  110. return
  111. }
  112. bodyBuffer = p[:bodyLen]
  113. req.body = make([]byte, bodyLen)
  114. copy(req.body[:], bodyBuffer[:])
  115. req.ContentLength = int(bodyLen)
  116. }
  117. return
  118. }
  119. func NewRequest(method string, i interface{}) *Request {
  120. return &Request{
  121. Method: method,
  122. Body: i,
  123. codec: codec.DefaultCodec,
  124. Header: make(map[string]string),
  125. }
  126. }