l7_test.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package l7
  2. import (
  3. "bytes"
  4. "encoding/binary"
  5. "testing"
  6. "github.com/stretchr/testify/assert"
  7. "go.mongodb.org/mongo-driver/bson"
  8. )
  9. func TestParseHttp(t *testing.T) {
  10. m, p := ParseHttp([]byte(`HEAD /1 HTTP/1.1\nHost: 127.0.0.1\nUser-Agent: curl/8.0.1\nAccept: */*\n\nxzxxxxxxzx`))
  11. assert.Equal(t, "HEAD", m)
  12. assert.Equal(t, "/1", p)
  13. m, p = ParseHttp([]byte(`GET /too-long-uri`))
  14. assert.Equal(t, "GET", m)
  15. assert.Equal(t, "/too-long-uri...", p)
  16. }
  17. func Test_parseMemcached(t *testing.T) {
  18. cmd, items := ParseMemcached(append([]byte(`incr 1111 2222`), '\r', '\n'))
  19. assert.Equal(t, "incr", cmd)
  20. assert.Equal(t, []string{"1111"}, items)
  21. cmd, items = ParseMemcached(append([]byte(`gets 1111 2222 3333`), '\r', '\n'))
  22. assert.Equal(t, "gets", cmd)
  23. assert.Equal(t, []string{"1111", "2222", "3333"}, items)
  24. }
  25. func TestParseRedis(t *testing.T) {
  26. cmd, args := ParseRedis([]byte{
  27. '*', '3', '\r', '\n',
  28. '$', '4', '\r', '\n',
  29. 'L', 'L', 'E', 'N', '\r', '\n',
  30. '$', '6', '\r', '\n',
  31. 'm', 'y', 'l', 'i', 's', 't', '\r', '\n',
  32. '$', '2', '\r', '\n',
  33. 'x', 'y', '\r', '\n',
  34. })
  35. assert.Equal(t, "LLEN", cmd)
  36. assert.Equal(t, "mylist ...", args)
  37. cmd, args = ParseRedis([]byte{
  38. '*', '2', '\r', '\n',
  39. '$', '8', '\r', '\n',
  40. 'S', 'M', 'E', 'M', 'B', 'E', 'R', 'S', '\r', '\n',
  41. '$', '6', '\r', '\n',
  42. 'm', 'y', 'l', 'i', 's', 't', '\r', '\n',
  43. })
  44. assert.Equal(t, "SMEMBERS", cmd)
  45. assert.Equal(t, "mylist", args)
  46. }
  47. type mongoHeader struct {
  48. MessageLength int32
  49. RequestID int32
  50. ResponseTo int32
  51. OpCode int32
  52. Flags int32
  53. SectionKind uint8
  54. }
  55. func TestParseMongo(t *testing.T) {
  56. buf := bytes.NewBuffer(nil)
  57. v := bson.M{"a": "bssssssssssssssssssssssssssssssssssssssssss"}
  58. data, err := bson.Marshal(v)
  59. assert.NoError(t, err)
  60. h := mongoHeader{
  61. MessageLength: 16 + 4 + 1 + int32(len(data)),
  62. OpCode: MongoOpMSG,
  63. }
  64. assert.NoError(t, binary.Write(buf, binary.LittleEndian, h))
  65. _, err = buf.Write(data)
  66. assert.NoError(t, err)
  67. payload := buf.Bytes()
  68. assert.Equal(t, `{"a": "bssssssssssssssssssssssssssssssssssssssssss"}`, ParseMongo(payload))
  69. assert.Equal(t, `<truncated>`, ParseMongo(payload[:20]))
  70. dataSize := binary.LittleEndian.Uint32(data)
  71. binary.LittleEndian.PutUint32(payload[mongoHeaderLength+mongoSectionKindLength:], dataSize+1)
  72. assert.Equal(t, `<truncated>`, ParseMongo(payload))
  73. }