flashmob 9 лет назад
Родитель
Сommit
95899ffd48
1 измененных файлов с 25 добавлено и 15 удалено
  1. 25 15
      smtpd.go

+ 25 - 15
smtpd.go

@@ -28,7 +28,7 @@ type Client struct {
 	time        int64
 	tls_on      bool
 	conn        net.Conn
-	bufin       *bufio.Reader
+	bufin       *smtpBufferedReader
 	bufout      *bufio.Writer
 	kill_time   int64
 	errors      int
@@ -259,51 +259,61 @@ func killClient(client *Client) {
 	client.kill_time = time.Now().Unix()
 }
 
+// we need to change the limit, so we extend io.LimitedReader
 type mutableLimitedReader struct {
 	R io.LimitedReader
 }
 
+// bolt this on so we can set the limit
 func (mlr *mutableLimitedReader) setLimit(n int64) {
 	mlr.R.N = n;
 }
 
+// this just delegates to the underlying reader
 func (mlr *mutableLimitedReader) Read(p []byte) (n int, err error) {
 	n, err = mlr.R.Read(p)
 	return
 }
 
-
-
 func newMutableLimitedReader(r io.Reader, n int64) mutableLimitedReader {
 	lr := io.LimitedReader{R:r, N:n}
 	return mutableLimitedReader{lr}
 }
 
-type smtpBufferedReader struct {
+type smtpLimitedReader struct {
 	mlr mutableLimitedReader
 }
 
-func (sbr *smtpBufferedReader) Read(p []byte) (n int, err error) {
+func (sbr *smtpLimitedReader) Read(p []byte) (n int, err error) {
 	n, err = sbr.mlr.Read(p)
 	return
 }
 
-func (sbr *smtpBufferedReader) setLimit(n int64) {
+func (sbr *smtpLimitedReader) setLimit(n int64) {
 	sbr.mlr.setLimit(n);
 }
 
-func newSmtpBufferedReader(rd io.Reader) *bufio.Reader {
-	mlr := newMutableLimitedReader(rd, 20);
-	z := &smtpBufferedReader{mlr}
-	return bufio.NewReader(z)
+type smtpBufferedReader struct {
+	br *bufio.Reader
+	slr *smtpLimitedReader
+}
+
+func newSmtpBufferedReader(rd io.Reader) *smtpBufferedReader {
+	mlr := newMutableLimitedReader(rd, 2);
+	z := &smtpLimitedReader{mlr}
+	s := &smtpBufferedReader{bufio.NewReader(z), z}
+	return s
+}
+
+func (sbr *smtpBufferedReader) ReadString(delim byte) (line string, err error) {
+	line, err = sbr.br.ReadString(delim)
+	return
 }
 
-/*
-func newSmtpBufferedReader(rd io.Reader) *bufio.Reader {
-	mlr := newMutableLimitedReader(rd, 1024);
-	return bufio.NewReader(mlr)
+func (sbr *smtpBufferedReader) setLimit(n int64) {
+	sbr.slr.setLimit(n)
 }
-*/
+