redis.go 687 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package l7
  2. import (
  3. "bytes"
  4. "strconv"
  5. )
  6. func ParseRedis(payload []byte) (cmd string, args string) {
  7. var v, rest []byte
  8. var ok bool
  9. v, rest, ok = bytes.Cut(payload, crlf)
  10. if !ok || !bytes.HasPrefix(v, []byte("*")) {
  11. return
  12. }
  13. arrayLen, err := strconv.ParseUint(string(v[1:]), 10, 32)
  14. if err != nil {
  15. return
  16. }
  17. readString := func() string {
  18. v, rest, ok = bytes.Cut(rest, crlf)
  19. if !ok || !bytes.HasPrefix(v, []byte("$")) {
  20. return ""
  21. }
  22. v, rest, ok = bytes.Cut(rest, crlf)
  23. if ok {
  24. return string(v)
  25. }
  26. return ""
  27. }
  28. cmd = readString()
  29. if cmd == "" {
  30. return
  31. }
  32. if arrayLen > 1 {
  33. args = readString()
  34. if arrayLen > 2 {
  35. args += " ..."
  36. }
  37. }
  38. return
  39. }