1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-07-21 12:44:17 -04:00
v2fly/transport/internet/ws/stopablehttplistener.go
2016-08-15 21:19:15 +08:00

60 lines
1.1 KiB
Go

package ws
import (
"errors"
"net"
)
type StoppableListener struct {
net.Listener //Wrapped listener
stop chan int //Channel used only to indicate listener should shutdown
}
func NewStoppableListener(l net.Listener) (*StoppableListener, error) {
/*
tcpL, ok := l.(*net.TCPListener)
if !ok {
return nil, errors.New("Cannot wrap listener")
}
*/
retval := &StoppableListener{}
retval.Listener = l
retval.stop = make(chan int)
return retval, nil
}
var StoppedError = errors.New("Listener stopped")
func (sl *StoppableListener) Accept() (net.Conn, error) {
for {
newConn, err := sl.Listener.Accept()
//Check for the channel being closed
select {
case <-sl.stop:
return nil, StoppedError
default:
//If the channel is still open, continue as normal
}
if err != nil {
netErr, ok := err.(net.Error)
//If this is a timeout, then continue to wait for
//new connections
if ok && netErr.Timeout() && netErr.Temporary() {
continue
}
}
return newConn, err
}
}
func (sl *StoppableListener) Stop() {
close(sl.stop)
}