Browse Source

allow resizing the ws read buffer

tags/v2.12.0-rc1
Shivaram Lingamneni 1 year ago
parent
commit
9439e9b9e1
1 changed files with 15 additions and 3 deletions
  1. 15
    3
      irc/ircconn.go

+ 15
- 3
irc/ircconn.go View File

102
 	return &IRCWSConn{
102
 	return &IRCWSConn{
103
 		conn:   conn,
103
 		conn:   conn,
104
 		binary: conn.Subprotocol() == "binary.ircv3.net",
104
 		binary: conn.Subprotocol() == "binary.ircv3.net",
105
-		buf:    make([]byte, maxReadQBytes()),
105
+		buf:    make([]byte, initialBufferSize),
106
 	}
106
 	}
107
 }
107
 }
108
 
108
 
143
 		return line, err
143
 		return line, err
144
 	}
144
 	}
145
 
145
 
146
-	n, err := io.ReadFull(reader, wc.buf)
147
-	line = wc.buf[:n]
146
+	line, err = wc.readFull(reader)
148
 	switch err {
147
 	switch err {
149
 	case io.ErrUnexpectedEOF, io.EOF:
148
 	case io.ErrUnexpectedEOF, io.EOF:
150
 		// these are OK. io.ErrUnexpectedEOF is the good case:
149
 		// these are OK. io.ErrUnexpectedEOF is the good case:
161
 	}
160
 	}
162
 }
161
 }
163
 
162
 
163
+func (wc *IRCWSConn) readFull(reader io.Reader) (line []byte, err error) {
164
+	// XXX this is io.ReadFull with a single attempt to resize upwards
165
+	n, err := io.ReadFull(reader, wc.buf)
166
+	if err == nil && len(wc.buf) < maxReadQBytes() {
167
+		newBuf := make([]byte, maxReadQBytes())
168
+		copy(newBuf, wc.buf[:n])
169
+		wc.buf = newBuf
170
+		n2, err := io.ReadFull(reader, wc.buf[n:])
171
+		return wc.buf[:n+n2], err
172
+	}
173
+	return wc.buf[:n], err
174
+}
175
+
164
 func (wc *IRCWSConn) Close() (err error) {
176
 func (wc *IRCWSConn) Close() (err error) {
165
 	return wc.conn.Close()
177
 	return wc.conn.Close()
166
 }
178
 }

Loading…
Cancel
Save