dm.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  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. query := string(payload[dmMsgHeaderSize:]) + queryTail
  38. fmt.Printf("-------dm query is [%s] \n", query)
  39. return query
  40. }
  41. func (p *DmParser) getUint32By2ByteFromPayload(payload []byte, offset int) uint32 {
  42. var result uint32
  43. result = uint32(payload[offset] & 0xff)
  44. offset++
  45. result |= uint32(payload[offset]&0xff) << 8
  46. offset++
  47. return result
  48. }
  49. func (p *DmParser) getUint32By4ByteFromPayload(payload []byte, offset int) uint32 {
  50. var result uint32
  51. result = uint32(payload[offset] & 0xff)
  52. offset++
  53. result |= uint32(payload[offset]&0xff) << 8
  54. offset++
  55. result |= uint32(payload[offset]&0xff) << 16
  56. offset++
  57. result |= uint32(payload[offset]&0xff) << 24
  58. return result
  59. }