limit_reader.go 616 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. package parser
  2. import (
  3. "io"
  4. )
  5. type limitReader struct {
  6. io.Reader
  7. remain int
  8. }
  9. func newLimitReader(r io.Reader, limit int) *limitReader {
  10. return &limitReader{
  11. Reader: r,
  12. remain: limit,
  13. }
  14. }
  15. func (r *limitReader) Read(b []byte) (int, error) {
  16. if r.remain == 0 {
  17. return 0, io.EOF
  18. }
  19. if len(b) > r.remain {
  20. b = b[:r.remain]
  21. }
  22. n, err := r.Reader.Read(b)
  23. r.remain -= n
  24. return n, err
  25. }
  26. func (r *limitReader) Close() error {
  27. if r.remain > 0 {
  28. b := make([]byte, 10240)
  29. for {
  30. _, err := r.Read(b)
  31. if err == io.EOF {
  32. break
  33. }
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. }
  39. return nil
  40. }