utils.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. package common
  2. import (
  3. "encoding/binary"
  4. "github.com/pkg/errors"
  5. "io"
  6. "strings"
  7. )
  8. // CopyBuffer is an implement of io.Copy with buffer pool
  9. func CopyBuffer(dst io.Writer, src io.Reader, buf []byte) (written int64, err error) {
  10. for {
  11. nr, er := src.Read(buf)
  12. if nr > 0 {
  13. nw, ew := dst.Write(buf[0:nr])
  14. if nw < 0 || nr < nw {
  15. nw = 0
  16. if ew == nil {
  17. ew = errors.New("invalid write result")
  18. }
  19. }
  20. written += int64(nw)
  21. if ew != nil {
  22. err = ew
  23. break
  24. }
  25. if nr != nw {
  26. err = errors.New("short write")
  27. break
  28. }
  29. }
  30. if er != nil {
  31. if er != io.EOF {
  32. err = er
  33. }
  34. break
  35. }
  36. }
  37. return written, err
  38. }
  39. // HostContains tests whether the string host contained ruleHost
  40. func HostContains(ruleHost string, host string) bool {
  41. return strings.HasSuffix(host, strings.Replace(ruleHost, "*", "", -1))
  42. }
  43. // WriteLenBytes is used to write length and bytes to writer
  44. func WriteLenBytes(w io.Writer, b []byte) (int, error) {
  45. err := binary.Write(w, binary.LittleEndian, uint32(len(b)))
  46. if err != nil {
  47. return 0, errors.Wrap(err, "write len")
  48. }
  49. n, err := w.Write(b)
  50. if err != nil {
  51. return 0, errors.Wrap(err, "write bytes")
  52. }
  53. return n, nil
  54. }
  55. // ReadLenBytes is used to read bytes from reader
  56. func ReadLenBytes(r io.Reader, b []byte) (int, error) {
  57. var l int32
  58. err := binary.Read(r, binary.LittleEndian, &l)
  59. if err != nil {
  60. return 0, errors.Wrap(err, "read len")
  61. }
  62. if int(l) > len(b) {
  63. return 0, errors.Errorf("data is too long(%d)", l)
  64. }
  65. n, err := io.ReadAtLeast(r, b, int(l))
  66. if err != nil {
  67. return n, errors.Wrap(err, "read data error")
  68. }
  69. return n, nil
  70. }