forked from quic-go/quic-go
mint performs a Write for every state change. This results in a lot of small packets getting sent when using an unbuffered connection. By buffering, we make sure that packets are filled up properly.
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package handshake
|
|
|
|
import (
|
|
"bytes"
|
|
"io"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
type cryptoStreamConn struct {
|
|
buffer *bytes.Buffer
|
|
stream io.ReadWriter
|
|
}
|
|
|
|
var _ net.Conn = &cryptoStreamConn{}
|
|
|
|
func newCryptoStreamConn(stream io.ReadWriter) *cryptoStreamConn {
|
|
return &cryptoStreamConn{
|
|
stream: stream,
|
|
buffer: &bytes.Buffer{},
|
|
}
|
|
}
|
|
|
|
func (c *cryptoStreamConn) Read(b []byte) (int, error) {
|
|
return c.stream.Read(b)
|
|
}
|
|
|
|
func (c *cryptoStreamConn) Write(p []byte) (int, error) {
|
|
return c.buffer.Write(p)
|
|
}
|
|
|
|
func (c *cryptoStreamConn) Flush() error {
|
|
if c.buffer.Len() == 0 {
|
|
return nil
|
|
}
|
|
_, err := c.stream.Write(c.buffer.Bytes())
|
|
c.buffer.Reset()
|
|
return err
|
|
}
|
|
|
|
// Close is not implemented
|
|
func (c *cryptoStreamConn) Close() error {
|
|
return nil
|
|
}
|
|
|
|
// LocalAddr is not implemented
|
|
func (c *cryptoStreamConn) LocalAddr() net.Addr {
|
|
return nil
|
|
}
|
|
|
|
// RemoteAddr is not implemented
|
|
func (c *cryptoStreamConn) RemoteAddr() net.Addr {
|
|
return nil
|
|
}
|
|
|
|
// SetReadDeadline is not implemented
|
|
func (c *cryptoStreamConn) SetReadDeadline(time.Time) error {
|
|
return nil
|
|
}
|
|
|
|
// SetWriteDeadline is not implemented
|
|
func (c *cryptoStreamConn) SetWriteDeadline(time.Time) error {
|
|
return nil
|
|
}
|
|
|
|
// SetDeadline is not implemented
|
|
func (c *cryptoStreamConn) SetDeadline(time.Time) error {
|
|
return nil
|
|
}
|