1
0
mirror of https://github.com/v2fly/v2ray-core.git synced 2024-06-10 01:40:44 +00:00

simplify code

This commit is contained in:
Darien Raymond 2017-02-09 12:31:40 +01:00
parent 0d68293ef8
commit d270a99d4f
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169

View File

@ -27,7 +27,30 @@ type ConnectionWithError struct {
err error
}
type WSListener struct {
type requestHandler struct {
path string
conns chan *ConnectionWithError
}
func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Request) {
if request.URL.Path != h.path {
writer.WriteHeader(http.StatusNotFound)
return
}
conn, err := converttovws(writer, request)
if err != nil {
log.Info("WebSocket|Listener: Failed to convert to WebSocket connection: ", err)
return
}
select {
case h.conns <- &ConnectionWithError{conn: conn}:
default:
conn.Close()
}
}
type Listener struct {
sync.Mutex
acccepting bool
awaitingConns chan *ConnectionWithError
@ -43,7 +66,7 @@ func ListenWS(address v2net.Address, port v2net.Port, options internet.ListenOpt
}
wsSettings := networkSettings.(*Config)
l := &WSListener{
l := &Listener{
acccepting: true,
awaitingConns: make(chan *ConnectionWithError, 32),
config: wsSettings,
@ -65,51 +88,35 @@ func ListenWS(address v2net.Address, port v2net.Port, options internet.ListenOpt
return l, err
}
func (wsl *WSListener) listenws(address v2net.Address, port v2net.Port) error {
http.HandleFunc("/"+wsl.config.Path, func(w http.ResponseWriter, r *http.Request) {
conn, err := wsl.converttovws(w, r)
if err != nil {
log.Warning("WebSocket|Listener: Failed to convert connection: ", err)
return
}
select {
case wsl.awaitingConns <- &ConnectionWithError{
conn: conn,
}:
default:
if conn != nil {
conn.Close()
}
}
return
})
func (ln *Listener) listenws(address v2net.Address, port v2net.Port) error {
netAddr := address.String() + ":" + strconv.Itoa(int(port.Value()))
var listener net.Listener
if wsl.tlsConfig == nil {
if ln.tlsConfig == nil {
l, err := net.Listen("tcp", netAddr)
if err != nil {
return errors.Base(err).Message("WebSocket|Listener: Failed to listen TCP ", netAddr)
}
listener = l
} else {
l, err := tls.Listen("tcp", netAddr, wsl.tlsConfig)
l, err := tls.Listen("tcp", netAddr, ln.tlsConfig)
if err != nil {
return errors.Base(err).Message("WebSocket|Listener: Failed to listen TLS ", netAddr)
}
listener = l
}
wsl.listener = listener
ln.listener = listener
go func() {
http.Serve(listener, nil)
http.Serve(listener, &requestHandler{
path: "/" + ln.config.Path,
conns: ln.awaitingConns,
})
}()
return nil
}
func (wsl *WSListener) converttovws(w http.ResponseWriter, r *http.Request) (*wsconn, error) {
func converttovws(w http.ResponseWriter, r *http.Request) (*wsconn, error) {
var upgrader = websocket.Upgrader{
ReadBufferSize: 32 * 1024,
WriteBufferSize: 32 * 1024,
@ -123,49 +130,49 @@ func (wsl *WSListener) converttovws(w http.ResponseWriter, r *http.Request) (*ws
return &wsconn{wsc: conn}, nil
}
func (v *WSListener) Accept() (internet.Connection, error) {
for v.acccepting {
func (ln *Listener) Accept() (internet.Connection, error) {
for ln.acccepting {
select {
case connErr, open := <-v.awaitingConns:
case connErr, open := <-ln.awaitingConns:
if !open {
return nil, ErrClosedListener
}
if connErr.err != nil {
return nil, connErr.err
}
return internal.NewConnection(internal.ConnectionID{}, connErr.conn, v, internal.ReuseConnection(v.config.IsConnectionReuse())), nil
return internal.NewConnection(internal.ConnectionID{}, connErr.conn, ln, internal.ReuseConnection(ln.config.IsConnectionReuse())), nil
case <-time.After(time.Second * 2):
}
}
return nil, ErrClosedListener
}
func (v *WSListener) Put(id internal.ConnectionID, conn net.Conn) {
v.Lock()
defer v.Unlock()
if !v.acccepting {
func (ln *Listener) Put(id internal.ConnectionID, conn net.Conn) {
ln.Lock()
defer ln.Unlock()
if !ln.acccepting {
return
}
select {
case v.awaitingConns <- &ConnectionWithError{conn: conn}:
case ln.awaitingConns <- &ConnectionWithError{conn: conn}:
default:
conn.Close()
}
}
func (v *WSListener) Addr() net.Addr {
return nil
func (ln *Listener) Addr() net.Addr {
return ln.listener.Addr()
}
func (v *WSListener) Close() error {
v.Lock()
defer v.Unlock()
v.acccepting = false
func (ln *Listener) Close() error {
ln.Lock()
defer ln.Unlock()
ln.acccepting = false
v.listener.Close()
ln.listener.Close()
close(v.awaitingConns)
for connErr := range v.awaitingConns {
close(ln.awaitingConns)
for connErr := range ln.awaitingConns {
if connErr.conn != nil {
connErr.conn.Close()
}