Browse Source

simplified - don't need ReadLimitedString()

flashmob 9 years ago
parent
commit
e85eb42930
1 changed files with 12 additions and 16 deletions
  1. 12 16
      smtpd.go

+ 12 - 16
smtpd.go

@@ -297,42 +297,38 @@ func (alr *adjustableLimitedReader) setLimit(n int64) {
 }
 }
 
 
 // this just delegates to the underlying reader in order to satisfy the Reader interface
 // this just delegates to the underlying reader in order to satisfy the Reader interface
-func (alr adjustableLimitedReader) Read(p []byte) (n int, err error) {
+// Since the vanilla limited reader returns io.EOF when the limit is reached, we need a more specific
+// error so that we can distinguish when a limit is reached
+func (alr *adjustableLimitedReader) Read(p []byte) (n int, err error) {
 	n, err = alr.R.Read(p)
 	n, err = alr.R.Read(p)
+	if err == io.EOF && alr.R.N <= 0 {
+		// return our custom error since std lib returns EOF
+		err = INPUT_LIMIT_EXCEEDED
+	}
 	return
 	return
 }
 }
 
 
+// allocate a new adjustableLimitedReader
 func newAdjustableLimitedReader(r io.Reader, n int64) *adjustableLimitedReader {
 func newAdjustableLimitedReader(r io.Reader, n int64) *adjustableLimitedReader {
 	lr := &io.LimitedReader{R: r, N: n}
 	lr := &io.LimitedReader{R: r, N: n}
 	return &adjustableLimitedReader{lr}
 	return &adjustableLimitedReader{lr}
 }
 }
 
 
-// We need buffio to use the limited reader, and have access to the limited reader
+// This is a bufio.Reader what will use our adjustable limit reader
+// We 'extend' buffio to have the limited reader feature
 type smtpBufferedReader struct {
 type smtpBufferedReader struct {
 	*bufio.Reader
 	*bufio.Reader
 	alr *adjustableLimitedReader
 	alr *adjustableLimitedReader
 }
 }
 
 
 
 
-
-// delegate to the bufio.Reader & detect if input limit exceeded
-func (sbr *smtpBufferedReader) ReadLimitedString(delim byte) (line string, err error) {
-	line, err = sbr.ReadString(delim)
-	if err == io.EOF && sbr.alr.R.N <= 0 {
-		// return our custom error since std lib returns EOF
-		err = INPUT_LIMIT_EXCEEDED
-	}
-	return
-}
-
-
 // delegate to the adjustable limited reader
 // delegate to the adjustable limited reader
 func (sbr *smtpBufferedReader) setLimit(n int64) {
 func (sbr *smtpBufferedReader) setLimit(n int64) {
 	sbr.alr.setLimit(n)
 	sbr.alr.setLimit(n)
 }
 }
 
 
 
 
-// new limited buffered reader
+// allocate a new smtpBufferedReader
 func newSmtpBufferedReader(rd io.Reader) *smtpBufferedReader {
 func newSmtpBufferedReader(rd io.Reader) *smtpBufferedReader {
 	alr := newAdjustableLimitedReader(rd, commandMaxLength)
 	alr := newAdjustableLimitedReader(rd, commandMaxLength)
 	s := &smtpBufferedReader{bufio.NewReader(alr), alr}
 	s := &smtpBufferedReader{bufio.NewReader(alr), alr}
@@ -350,7 +346,7 @@ func (server *SmtpdServer) readSmtp(client *Client) (input string, err error) {
 	}
 	}
 	for err == nil {
 	for err == nil {
 		client.conn.SetDeadline(time.Now().Add(server.timeout * time.Second))
 		client.conn.SetDeadline(time.Now().Add(server.timeout * time.Second))
-		reply, err = client.bufin.ReadLimitedString('\n')
+		reply, err = client.bufin.ReadString('\n')
 		if reply != "" {
 		if reply != "" {
 			input = input + reply
 			input = input + reply
 			if len(input) > server.Config.Max_size {
 			if len(input) > server.Config.Max_size {