package proxy import ( "io" "net" "net/http" "time" ) type mitmConn struct { w FlushWriter r io.Reader remoteAddr addr closed chan struct{} } type FlushWriter interface { io.Writer http.Flusher } func newMitmConn(w FlushWriter, r io.Reader, remoteAddr string) *mitmConn { return &mitmConn{ w: w, r: r, remoteAddr: addr(remoteAddr), closed: make(chan struct{}), } } func (c *mitmConn) Read(b []byte) (int, error) { return c.r.Read(b) } func (c *mitmConn) Write(b []byte) (int, error) { n, err := c.w.Write(b) c.w.Flush() return n, err } func (c *mitmConn) Close() error { close(c.closed) return nil } func (c *mitmConn) RemoteAddr() net.Addr { return c.remoteAddr } func (c *mitmConn) LocalAddr() net.Addr { return addr("") } func (c *mitmConn) SetDeadline(t time.Time) error { return nil } func (c *mitmConn) SetReadDeadline(t time.Time) error { return nil } func (c *mitmConn) SetWriteDeadline(t time.Time) error { return nil } type addr string func (a addr) String() string { return string(a) } func (a addr) Network() string { return "tcp" }