|
@@ -102,7 +102,7 @@ func NewIRCWSConn(conn *websocket.Conn) *IRCWSConn {
|
102
|
102
|
return &IRCWSConn{
|
103
|
103
|
conn: conn,
|
104
|
104
|
binary: conn.Subprotocol() == "binary.ircv3.net",
|
105
|
|
- buf: make([]byte, maxReadQBytes()),
|
|
105
|
+ buf: make([]byte, initialBufferSize),
|
106
|
106
|
}
|
107
|
107
|
}
|
108
|
108
|
|
|
@@ -143,8 +143,7 @@ func (wc *IRCWSConn) ReadLine() (line []byte, err error) {
|
143
|
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
|
147
|
switch err {
|
149
|
148
|
case io.ErrUnexpectedEOF, io.EOF:
|
150
|
149
|
// these are OK. io.ErrUnexpectedEOF is the good case:
|
|
@@ -161,6 +160,19 @@ func (wc *IRCWSConn) ReadLine() (line []byte, err error) {
|
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
|
176
|
func (wc *IRCWSConn) Close() (err error) {
|
165
|
177
|
return wc.conn.Close()
|
166
|
178
|
}
|