-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproxylistener.go
66 lines (54 loc) · 1.09 KB
/
proxylistener.go
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
package main
import (
"errors"
"fmt"
"net"
)
type ProxyAddr string
func (pa ProxyAddr) Network() string {
return string(pa)
}
func (pa ProxyAddr) String() string {
return string(pa)
}
var defProxyAddr = ProxyAddr("proxynet")
var connClosed = errors.New("Connection closed")
type ProxyListener struct {
conn chan net.Conn
close chan struct{}
Address net.Addr
}
func NewProxyListener(addr net.Addr) *ProxyListener {
return &ProxyListener{
conn: make(chan net.Conn),
close: make(chan struct{}),
Address: addr,
}
}
func (pl *ProxyListener) Conn(conn net.Conn) {
fmt.Println("Push Conn")
defer fmt.Println("Pushed Conn")
pl.conn <- conn
}
func (pl *ProxyListener) Accept() (net.Conn, error) {
fmt.Println("Accepting...")
select {
case c := <-pl.conn:
fmt.Println("Accepted")
return c, nil
case <-pl.close:
return nil, connClosed
}
return nil, connClosed
}
func (pl *ProxyListener) Close() error {
fmt.Println("Close?")
close(pl.close)
return nil
}
func (pl *ProxyListener) Addr() net.Addr {
if pl.Address != nil {
return pl.Address
}
return defProxyAddr
}