Add listeners
This commit is contained in:
		
							parent
							
								
									06d5e60341
								
							
						
					
					
						commit
						382cc113c5
					
				
							
								
								
									
										91
									
								
								listen.go
									
									
									
									
									
								
							
							
						
						
									
										91
									
								
								listen.go
									
									
									
									
									
								
							| @ -1,10 +1,95 @@ | ||||
| package hopp | ||||
| 
 | ||||
| import "io" | ||||
| import "net" | ||||
| import "context" | ||||
| import "crypto/tls" | ||||
| import "github.com/quic-go/quic-go" | ||||
| 
 | ||||
| // Listener is an object which listens for incoming HOPP connections. | ||||
| type Listener interface { | ||||
| 	io.Closer | ||||
| 	Accept(Conn, error) | ||||
| 	// Accept waits for and returns the next connection to the listener. | ||||
| 	Accept() (Conn, error) | ||||
| 	// Close closes the listener. Any blocked Accept operations will be | ||||
| 	// unblocked and return errors. | ||||
| 	Close() error | ||||
| 	// Addr returns the listener's network address. | ||||
| 	Addr() net.Addr | ||||
| } | ||||
| 
 | ||||
| // Listen listens for incoming HOPP connections. The network must be one of | ||||
| // "quic", "quic4", (IPv4-only) "quic6" (IPv6-only), or "unix". | ||||
| func Listen(network, address string) (Listener, error) { | ||||
| 	switch network { | ||||
| 	case "quic", "quic4", "quic6": return ListenQUIC(network, address, nil) | ||||
| 	case "unix":                   return ListenUnix(network, address) | ||||
| 	default:                       return nil, ErrUnknownNetwork | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ListenQUIC listens for incoming HOPP connections using QUIC as a transport. | ||||
| // The network must be one of "quic", "quic4", (IPv4-only) or "quic6" | ||||
| // (IPv6-only). | ||||
| func ListenQUIC(network, address string, tlsConf *tls.Config) (Listener, error) { | ||||
| 	tlsConf   = tlsConfig(tlsConf) | ||||
| 	quicConf := quicConfig() | ||||
| 	udpNetwork, err := quicNetworkToUDPNetwork(network) | ||||
| 	if err != nil { return nil, err } | ||||
| 	addr, err := net.ResolveUDPAddr(udpNetwork, address) | ||||
| 	if err != nil { return nil, err } | ||||
| 	udpListener, err := net.ListenUDP(udpNetwork, addr) | ||||
| 	if err != nil { return nil, err } | ||||
| 	quicListener, err := quic.Listen(udpListener, tlsConf, quicConf) | ||||
| 	if err != nil { return nil, err } | ||||
| 	return &listenerQUIC { | ||||
| 		underlying: quicListener, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| // ListenUnix listens for incoming HOPP connections using a Unix domain socket | ||||
| // as a transport. The network must be "unix". | ||||
| func ListenUnix(network, address string) (Listener, error) { | ||||
| 	if network != "unix" { return nil, ErrUnknownNetwork } | ||||
| 	addr, err := net.ResolveUnixAddr(network, address) | ||||
| 	if err != nil { return nil, err } | ||||
| 	unixListener, err := net.ListenUnix(network, addr) | ||||
| 	if err != nil { return nil, err } | ||||
| 	return &listenerUnix { | ||||
| 		underlying: unixListener, | ||||
| 	}, nil | ||||
| } | ||||
| 
 | ||||
| type listenerQUIC struct { | ||||
| 	underlying *quic.Listener | ||||
| } | ||||
| 
 | ||||
| func (this *listenerQUIC) Accept() (Conn, error) { | ||||
| 	conn, err := this.underlying.Accept(context.Background()) | ||||
| 	if err != nil { return nil, err } | ||||
| 	return AdaptB(quicMultiConn { underlying: conn }), nil | ||||
| } | ||||
| 
 | ||||
| func (this *listenerQUIC) Close() error { | ||||
| 	return this.underlying.Close() | ||||
| } | ||||
| 
 | ||||
| func (this *listenerQUIC) Addr() net.Addr { | ||||
| 	return this.underlying.Addr() | ||||
| } | ||||
| 
 | ||||
| type listenerUnix struct { | ||||
| 	underlying *net.UnixListener | ||||
| } | ||||
| 
 | ||||
| func (this *listenerUnix) Accept() (Conn, error) { | ||||
| 	conn, err := this.underlying.Accept() | ||||
| 	if err != nil { return nil, err } | ||||
| 	return AdaptA(conn, ServerSide), nil | ||||
| } | ||||
| 
 | ||||
| func (this *listenerUnix) Close() error { | ||||
| 	return this.underlying.Close() | ||||
| } | ||||
| 
 | ||||
| func (this *listenerUnix) Addr() net.Addr { | ||||
| 	return this.underlying.Addr() | ||||
| } | ||||
|  | ||||
							
								
								
									
										10
									
								
								listener.go
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								listener.go
									
									
									
									
									
								
							| @ -1,10 +0,0 @@ | ||||
| package hopp | ||||
| 
 | ||||
| import "io" | ||||
| import "net" | ||||
| 
 | ||||
| type Listener interface { | ||||
| 	io.Closer | ||||
| 	Accept(Conn, error) | ||||
| 	Addr() net.Addr | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user