|  | @@ -3,6 +3,7 @@ package internet
 | 
	
		
			
				|  |  |  import (
 | 
	
		
			
				|  |  |  	"context"
 | 
	
		
			
				|  |  |  	"errors"
 | 
	
		
			
				|  |  | +	"net"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common"
 | 
	
		
			
				|  |  |  )
 | 
	
	
		
			
				|  | @@ -17,10 +18,24 @@ func CreatePacketHeader(config interface{}) (PacketHeader, error) {
 | 
	
		
			
				|  |  |  	if err != nil {
 | 
	
		
			
				|  |  |  		return nil, err
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	switch h := header.(type) {
 | 
	
		
			
				|  |  | -	case PacketHeader:
 | 
	
		
			
				|  |  | +	if h, ok := header.(PacketHeader); ok {
 | 
	
		
			
				|  |  |  		return h, nil
 | 
	
		
			
				|  |  | -	default:
 | 
	
		
			
				|  |  | -		return nil, errors.New("Internet: Not a packet header.")
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | +	return nil, errors.New("Internet: Not a packet header.")
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +type ConnectionAuthenticator interface {
 | 
	
		
			
				|  |  | +	Client(net.Conn) net.Conn
 | 
	
		
			
				|  |  | +	Server(net.Conn) net.Conn
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +func CreateConnectionAuthenticator(config interface{}) (ConnectionAuthenticator, error) {
 | 
	
		
			
				|  |  | +	auth, err := common.CreateObject(context.Background(), config)
 | 
	
		
			
				|  |  | +	if err != nil {
 | 
	
		
			
				|  |  | +		return nil, err
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	if a, ok := auth.(ConnectionAuthenticator); ok {
 | 
	
		
			
				|  |  | +		return a, nil
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +	return nil, errors.New("Internet: Not a ConnectionAuthenticator.")
 | 
	
		
			
				|  |  |  }
 |