|  | @@ -8,15 +8,14 @@ import (
 | 
											
												
													
														|  |  	"sync"
 |  |  	"sync"
 | 
											
												
													
														|  |  	"time"
 |  |  	"time"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +	"github.com/gorilla/websocket"
 | 
											
												
													
														|  | 
 |  | +	"v2ray.com/core/app/log"
 | 
											
												
													
														|  |  	"v2ray.com/core/common"
 |  |  	"v2ray.com/core/common"
 | 
											
												
													
														|  |  	"v2ray.com/core/common/errors"
 |  |  	"v2ray.com/core/common/errors"
 | 
											
												
													
														|  | -	"v2ray.com/core/app/log"
 |  | 
 | 
											
												
													
														|  |  	v2net "v2ray.com/core/common/net"
 |  |  	v2net "v2ray.com/core/common/net"
 | 
											
												
													
														|  |  	"v2ray.com/core/transport/internet"
 |  |  	"v2ray.com/core/transport/internet"
 | 
											
												
													
														|  | -	v2tls "v2ray.com/core/transport/internet/tls"
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -	"github.com/gorilla/websocket"
 |  | 
 | 
											
												
													
														|  |  	"v2ray.com/core/transport/internet/internal"
 |  |  	"v2ray.com/core/transport/internet/internal"
 | 
											
												
													
														|  | 
 |  | +	v2tls "v2ray.com/core/transport/internet/tls"
 | 
											
												
													
														|  |  )
 |  |  )
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  var (
 |  |  var (
 | 
											
										
											
												
													
														|  | @@ -68,7 +67,7 @@ func ListenWS(address v2net.Address, port v2net.Port, options internet.ListenOpt
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  func (wsl *WSListener) listenws(address v2net.Address, port v2net.Port) error {
 |  |  func (wsl *WSListener) listenws(address v2net.Address, port v2net.Port) error {
 | 
											
												
													
														|  |  	http.HandleFunc("/"+wsl.config.Path, func(w http.ResponseWriter, r *http.Request) {
 |  |  	http.HandleFunc("/"+wsl.config.Path, func(w http.ResponseWriter, r *http.Request) {
 | 
											
												
													
														|  | -		con, err := wsl.converttovws(w, r)
 |  | 
 | 
											
												
													
														|  | 
 |  | +		conn, err := wsl.converttovws(w, r)
 | 
											
												
													
														|  |  		if err != nil {
 |  |  		if err != nil {
 | 
											
												
													
														|  |  			log.Warning("WebSocket|Listener: Failed to convert connection: ", err)
 |  |  			log.Warning("WebSocket|Listener: Failed to convert connection: ", err)
 | 
											
												
													
														|  |  			return
 |  |  			return
 | 
											
										
											
												
													
														|  | @@ -76,17 +75,17 @@ func (wsl *WSListener) listenws(address v2net.Address, port v2net.Port) error {
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  		select {
 |  |  		select {
 | 
											
												
													
														|  |  		case wsl.awaitingConns <- &ConnectionWithError{
 |  |  		case wsl.awaitingConns <- &ConnectionWithError{
 | 
											
												
													
														|  | -			conn: con,
 |  | 
 | 
											
												
													
														|  | 
 |  | +			conn: conn,
 | 
											
												
													
														|  |  		}:
 |  |  		}:
 | 
											
												
													
														|  |  		default:
 |  |  		default:
 | 
											
												
													
														|  | -			if con != nil {
 |  | 
 | 
											
												
													
														|  | -				con.Close()
 |  | 
 | 
											
												
													
														|  | 
 |  | +			if conn != nil {
 | 
											
												
													
														|  | 
 |  | +				conn.Close()
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  		return
 |  |  		return
 | 
											
												
													
														|  |  	})
 |  |  	})
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -	errchan := make(chan error)
 |  | 
 | 
											
												
													
														|  | 
 |  | +	errchan := make(chan error, 1)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	listenerfunc := func() error {
 |  |  	listenerfunc := func() error {
 | 
											
												
													
														|  |  		ol, err := net.Listen("tcp", address.String()+":"+strconv.Itoa(int(port.Value())))
 |  |  		ol, err := net.Listen("tcp", address.String()+":"+strconv.Itoa(int(port.Value())))
 | 
											
										
											
												
													
														|  | @@ -114,14 +113,13 @@ func (wsl *WSListener) listenws(address v2net.Address, port v2net.Port) error {
 | 
											
												
													
														|  |  	go func() {
 |  |  	go func() {
 | 
											
												
													
														|  |  		err := listenerfunc()
 |  |  		err := listenerfunc()
 | 
											
												
													
														|  |  		errchan <- err
 |  |  		errchan <- err
 | 
											
												
													
														|  | -		return
 |  | 
 | 
											
												
													
														|  |  	}()
 |  |  	}()
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	var err error
 |  |  	var err error
 | 
											
												
													
														|  |  	select {
 |  |  	select {
 | 
											
												
													
														|  |  	case err = <-errchan:
 |  |  	case err = <-errchan:
 | 
											
												
													
														|  | -	case <-time.After(time.Second * 2):
 |  | 
 | 
											
												
													
														|  | -		//Should this listen fail after 2 sec, it could gone untracked.
 |  | 
 | 
											
												
													
														|  | 
 |  | +	case <-time.After(time.Second * 5):
 | 
											
												
													
														|  | 
 |  | +		//Should this listen fail after 5 sec, it could gone untracked.
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
										
											
												
													
														|  | @@ -158,7 +156,7 @@ func (v *WSListener) Accept() (internet.Connection, error) {
 | 
											
												
													
														|  |  			if connErr.err != nil {
 |  |  			if connErr.err != nil {
 | 
											
												
													
														|  |  				return nil, connErr.err
 |  |  				return nil, connErr.err
 | 
											
												
													
														|  |  			}
 |  |  			}
 | 
											
												
													
														|  | -			return internal.NewConnection(internal.ConnectionID{}, connErr.conn.(*wsconn), v, internal.ReuseConnection(v.config.IsConnectionReuse())), nil
 |  | 
 | 
											
												
													
														|  | 
 |  | +			return internal.NewConnection(internal.ConnectionID{}, connErr.conn, v, internal.ReuseConnection(v.config.IsConnectionReuse())), nil
 | 
											
												
													
														|  |  		case <-time.After(time.Second * 2):
 |  |  		case <-time.After(time.Second * 2):
 | 
											
												
													
														|  |  		}
 |  |  		}
 | 
											
												
													
														|  |  	}
 |  |  	}
 |