From f4d97fd7cacdb8c436cd98acfa79b1eea9c53313 Mon Sep 17 00:00:00 2001 From: linyows Date: Sat, 14 Oct 2023 22:18:35 +0900 Subject: [PATCH] buffer size is 10mb --- cmd/warp/main.go | 10 ++++++---- pipe.go | 14 +++++++------- server.go | 26 ++++++++++++++++---------- 3 files changed, 29 insertions(+), 21 deletions(-) diff --git a/cmd/warp/main.go b/cmd/warp/main.go index 6d0354b..fff2c3c 100644 --- a/cmd/warp/main.go +++ b/cmd/warp/main.go @@ -17,6 +17,7 @@ var ( port = flag.Int("port", 0, "listen port") oip = flag.String("outbound-ip", "0.0.0.0", "outbound ip") storage = flag.String("storage", "", "sspecify extended storage from: mysql, sqlite, file") + maxSize = flag.Int("message-size-limit", 10240000, "The maximal size in bytes of a message") verbose = flag.Bool("verbose", false, "verbose logging") verFlag = flag.Bool("version", false, "show build version") ) @@ -32,10 +33,11 @@ func main() { } w := &warp.Server{ - Addr: *ip, - Port: *port, - OutboundAddr: *oip, - Verbose: *verbose, + Addr: *ip, + Port: *port, + OutboundAddr: *oip, + Verbose: *verbose, + MessageSizeLimit: *maxSize, } switch *storage { diff --git a/pipe.go b/pipe.go index 9eb76b1..3204550 100644 --- a/pipe.go +++ b/pipe.go @@ -14,9 +14,10 @@ import ( ) type Pipe struct { - id string - sConn net.Conn - rConn net.Conn + id string + sConn net.Conn + rConn net.Conn + bufferSize int rAddr *net.TCPAddr sMailAddr []byte @@ -46,7 +47,6 @@ const ( mailFromPrefix string = "MAIL FROM:<" rcptToPrefix string = "RCPT TO:<" mailRegex string = `[A-z0-9.!#$%&'*+\-/=?^_\{|}~]{1,64}@[A-z0-9.\-]{1,255}` - bufferSize int = 32 * 1024 crlf string = "\r\n" mailHeaderEnd string = crlf + crlf @@ -213,7 +213,7 @@ func (p *Pipe) dst(d Flow) net.Conn { } func (p *Pipe) copy(dr Flow, fn Mediator) (written int64, err error) { - size := bufferSize + size := p.bufferSize src, ok := p.src(dr).(io.Reader) if !ok { err = fmt.Errorf("io.Reader cast error") @@ -226,7 +226,7 @@ func (p *Pipe) copy(dr Flow, fn Mediator) (written int64, err error) { } go p.afterCommHook([]byte(fmt.Sprintf("io.Reader size: %d", size)), onPxy) } - buf := make([]byte, bufferSize) + buf := make([]byte, p.bufferSize) for { var isContinue bool @@ -284,7 +284,7 @@ func (p *Pipe) starttls() error { } func (p *Pipe) readReceiverConn() error { - buf := make([]byte, bufferSize) + buf := make([]byte, 64*1024) i, err := p.rConn.Read(buf) if err != nil { return err diff --git a/server.go b/server.go index 7b3d4ee..06980dc 100644 --- a/server.go +++ b/server.go @@ -12,12 +12,13 @@ import ( const SO_ORIGINAL_DST = 80 type Server struct { - Addr string - Port int - Hooks []Hook - OutboundAddr string - Verbose bool - log *log.Logger + Addr string + Port int + Hooks []Hook + OutboundAddr string + Verbose bool + log *log.Logger + MessageSizeLimit int } // These are global variables for integration test. @@ -30,6 +31,10 @@ func (s *Server) Start() error { if s.log == nil { s.log = log.New(os.Stderr, "", log.Ldate|log.Ltime|log.Lmicroseconds) } + if s.MessageSizeLimit == 0 { + // default is around 10MB (https://www.postfix.org/postconf.5.html) + s.MessageSizeLimit = 10240000 + } pl := &Plugins{} if err := pl.load(); err != nil { @@ -109,10 +114,11 @@ func (s *Server) HandleConnection(conn net.Conn) { } p := &Pipe{ - id: uuid, - sConn: conn, - rConn: dstConn, - rAddr: raddr, + id: uuid, + sConn: conn, + rConn: dstConn, + rAddr: raddr, + bufferSize: s.MessageSizeLimit, } p.afterCommHook = func(b Data, to Direction) { now := time.Now()