dm.go 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package l7
  2. import "fmt"
  3. const (
  4. dmMsgHeaderSize = 64
  5. dmMsgOffsetPackType = 4
  6. dmMsgOffsetBodyLen = 6
  7. dmMsgPackTypeQuery = 0x05
  8. )
  9. type DmParser struct {
  10. //preparedStatements map[string]string
  11. }
  12. func NewDmParser() *DmParser {
  13. //return &DmParser{preparedStatements: map[string]string{}}
  14. return &DmParser{}
  15. }
  16. func (p *DmParser) Parse(payload []byte, statementId uint32) string {
  17. payloadSize := uint32(len(payload))
  18. fmt.Println("-------dm payloadSize", payloadSize)
  19. if payloadSize <= dmMsgHeaderSize {
  20. return ""
  21. }
  22. //msgHeader := payload[:dmMsgHeaderSize]
  23. packType := p.getUint32By2ByteFromPayload(payload, dmMsgOffsetPackType)
  24. if packType != dmMsgPackTypeQuery {
  25. fmt.Println("-------dm packType != dmMsgPackTypeQuery ", packType)
  26. return ""
  27. }
  28. bodySize := p.getUint32By4ByteFromPayload(payload, dmMsgOffsetBodyLen)
  29. if dmMsgHeaderSize+bodySize < payloadSize {
  30. return ""
  31. }
  32. queryTail := ""
  33. if dmMsgHeaderSize+bodySize > payloadSize {
  34. //partial
  35. queryTail = "..."
  36. }
  37. payload = payload[:len(payload)-1]
  38. query := string(payload[dmMsgHeaderSize:]) + queryTail
  39. fmt.Printf("-------dm query is [%s] \n", query)
  40. return query
  41. }
  42. func (p *DmParser) getUint32By2ByteFromPayload(payload []byte, offset int) uint32 {
  43. var result uint32
  44. result = uint32(payload[offset] & 0xff)
  45. offset++
  46. result |= uint32(payload[offset]&0xff) << 8
  47. offset++
  48. return result
  49. }
  50. func (p *DmParser) getUint32By4ByteFromPayload(payload []byte, offset int) uint32 {
  51. var result uint32
  52. result = uint32(payload[offset] & 0xff)
  53. offset++
  54. result |= uint32(payload[offset]&0xff) << 8
  55. offset++
  56. result |= uint32(payload[offset]&0xff) << 16
  57. offset++
  58. result |= uint32(payload[offset]&0xff) << 24
  59. return result
  60. }