models.go 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. package guerrilla
  2. import (
  3. "bufio"
  4. "errors"
  5. "io"
  6. )
  7. var (
  8. LineLimitExceeded = errors.New("maximum line length exceeded")
  9. MessageSizeExceeded = errors.New("maximum message size exceeded")
  10. )
  11. // we need to adjust the limit, so we embed io.LimitedReader
  12. type adjustableLimitedReader struct {
  13. R *io.LimitedReader
  14. }
  15. // bolt this on so we can adjust the limit
  16. func (alr *adjustableLimitedReader) setLimit(n int64) {
  17. alr.R.N = n
  18. }
  19. // Returns a specific error when a limit is reached, that can be differentiated
  20. // from an EOF error from the standard io.Reader.
  21. func (alr *adjustableLimitedReader) Read(p []byte) (n int, err error) {
  22. n, err = alr.R.Read(p)
  23. if err == io.EOF && alr.R.N <= 0 {
  24. // return our custom error since io.Reader returns EOF
  25. err = LineLimitExceeded
  26. }
  27. return
  28. }
  29. // allocate a new adjustableLimitedReader
  30. func newAdjustableLimitedReader(r io.Reader, n int64) *adjustableLimitedReader {
  31. lr := &io.LimitedReader{R: r, N: n}
  32. return &adjustableLimitedReader{lr}
  33. }
  34. // This is a bufio.Reader what will use our adjustable limit reader
  35. // We 'extend' buffio to have the limited reader feature
  36. type smtpBufferedReader struct {
  37. *bufio.Reader
  38. alr *adjustableLimitedReader
  39. }
  40. // Delegate to the adjustable limited reader
  41. func (sbr *smtpBufferedReader) setLimit(n int64) {
  42. sbr.alr.setLimit(n)
  43. }
  44. // Set a new reader & use it to reset the underlying reader
  45. func (sbr *smtpBufferedReader) Reset(r io.Reader) {
  46. sbr.alr = newAdjustableLimitedReader(r, CommandLineMaxLength)
  47. sbr.Reader.Reset(sbr.alr)
  48. }
  49. // Allocate a new SMTPBufferedReader
  50. func newSMTPBufferedReader(rd io.Reader) *smtpBufferedReader {
  51. alr := newAdjustableLimitedReader(rd, CommandLineMaxLength)
  52. s := &smtpBufferedReader{bufio.NewReader(alr), alr}
  53. return s
  54. }