-
Notifications
You must be signed in to change notification settings - Fork 2
Expand file tree
/
Copy pathbufconn.go
More file actions
49 lines (40 loc) · 1.31 KB
/
bufconn.go
File metadata and controls
49 lines (40 loc) · 1.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package mitmproxy
import (
"bufio"
"io"
"net"
"github.com/josexy/mitmproxy-go/buf"
"github.com/josexy/websocket"
)
type bufConn struct {
net.Conn
r *bufio.Reader
}
func newBufConn(c net.Conn) *bufConn { return &bufConn{Conn: c, r: bufio.NewReader(c)} }
func (c *bufConn) Peek(n int) ([]byte, error) { return c.r.Peek(n) }
func (c *bufConn) Read(p []byte) (int, error) { return c.r.Read(p) }
var (
wsBufferPool = buf.New(512)
socksBufferPool = buf.New(515)
http2BodyBufferPool = buf.NewV1(1024 * 4)
)
func acquireBuffer() *buf.Buffer { return wsBufferPool.Get() }
func releaseBuffer(buffer *buf.Buffer) { wsBufferPool.Put(buffer) }
func acquireHTTP2BodyBuffer() *[]byte { return http2BodyBufferPool.Get() }
func releaseHTTP2BodyBuffer(buffer *[]byte) { http2BodyBufferPool.Put(buffer) }
func acquireSocksBuffer() *buf.Buffer { return socksBufferPool.Get() }
func releaseSocksBuffer(buffer *buf.Buffer) { socksBufferPool.Put(buffer) }
func readBufferFromWSConn(conn *websocket.Conn) (msgType int, buffer *buf.Buffer, err error) {
var reader io.Reader
msgType, reader, err = conn.NextReader()
if err != nil {
return
}
buffer = acquireBuffer()
if _, err = buffer.ReadFrom(reader); err != nil {
wsBufferPool.Put(buffer)
buffer = nil
return
}
return msgType, buffer, nil
}