qmsk/net/transport/endpoint.py
author Tero Marttila <terom@fixme.fi>
Sun, 23 Aug 2009 23:12:29 +0300
changeset 38 f0fc793a3754
parent 37 14db3fe42b6c
child 44 01ac7755b15a
permissions -rw-r--r--
reorganize transport.endpoint
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
from qmsk.net.socket import address, constants, af_unix
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
class AddrInfo (address.addrinfo) :
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
    """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
        Represents a sockaddr along with related address-family etc. information
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
    """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
class Endpoint (object) :
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    """
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    11
        Abstract network address interface. This can map to multiple actual addresses, potentially of different
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    12
        address families.
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    15
    def resolve (self, socktype, protocol = 0, passive = True) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        """
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    17
            Translate this Endpoint into a sequence of AddrInfo objects for the given socktype.
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        raise NotImplemented()
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    22
class InetEndpoint (Endpoint) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    """
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    24
        An internet endpoint, supports IPv4, IPv6 addresses and DNS hostnames.
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
           hostname     - [str] literal address or DNS hostname
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
           service      - [str] port number or service name
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    28
           family       - AF_* associated with this address
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
    """
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    30
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    31
    def __init__ (self, hostname=None, service=None, family=constants.AF_UNSPEC) :
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    32
        """
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    33
            Initialize with given parameters, but doesn't perform any lookups yet.
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    34
        """
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    35
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    36
        self.endpoint = address.endpoint(hostname, service)
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    37
        self.family = family
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
    
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    39
    @property
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    40
    def hostname (self) :
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    41
        return self.endpoint.hostname
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    42
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    43
    @property
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    44
    def service (self) :
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    45
        return self.endpoint.service
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    46
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    47
    def resolve (self, socktype, protocol = 0, passive = True) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
            Resolve using getaddrinfo
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        flags = 0
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        if passive :
35
50dc1517f797 fix endpoint.InetAddr.resolve
Tero Marttila <terom@fixme.fi>
parents: 32
diff changeset
    55
            flags |= constants.AI_PASSIVE
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    57
        return self.endpoint.getaddrinfo(self.family, socktype, protocol, flags)
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    59
class Address (Endpoint) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    """
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    61
        A specific socket-level address of some address family, also useable as an Endpoint.
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
            addr        - low-level sockaddr object
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            family      - AF_*
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    67
    def __init__ (self, sockaddr, family = constants.AF_UNSPEC, canonical = None) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        if not family :
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    69
            family = sockaddr.family
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    71
        if not canonical :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    72
            # XXX: delay?
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    73
            canonical = str(sockaddr)
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    74
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    75
        self._sockaddr = sockaddr
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
        self.family = family
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    77
        self.canonical = canonical
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    78
    
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    79
    def sockaddr (self) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    80
        """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    81
            Returns a qmsk.net.socket.address.sockaddr object for this address.
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    82
        """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    83
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    84
        return self._sockaddr
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
37
14db3fe42b6c move address-family from tcp/socket interface to endpoint interface. The address family of a socket is strictly a property of the address passed to it
Tero Marttila <terom@fixme.fi>
parents: 35
diff changeset
    86
    def resolve (self, socktype, protocol = 0, passive = True) :
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
            Returns a single AddrInfo object representing this address 
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
        """
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        if not socktype :
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    92
            raise ValueError("Socket type unknown")
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    94
        return [AddrInfo(0, self.family, socktype, protocol, self._sockaddr, self.canonical)]
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    96
class InetAddr (Address) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    97
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    98
        An AF_INET/AF_INET6 address, with addr and port.
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
    99
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   100
    
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   101
    @property
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   102
    def addr (self) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   103
        return self._sockaddr.addr
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   105
    @property
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   106
    def port (self) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   107
        return self._sockaddr.port
32
2168a9ffaef7 transport.endpoint stuff
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
38
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   109
class IPv4Addr (InetAddr) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   110
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   111
        A fixed AF_INET address and port
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   112
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   113
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   114
    def __init__ (self, addr, port) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   115
        super(IPv4Addr, self).__init__(af_inet.sockaddr_in(addr, port))
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   116
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   117
class IPv6Addr (InetAddr) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   118
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   119
        A fixed AF_INET6 address and port
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   120
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   121
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   122
    def __init__ (self, addr, port) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   123
        super(IPv6Addr, self).__init__(af_inet6.sockaddr_in6(addr, port))
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   124
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   125
class UnixAddr (Address) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   126
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   127
        A local AF_UNIX address, as a path.
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   128
    """
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   129
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   130
    def __init__ (self, path) :
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   131
        super(UnixAddr, self).__init__(af_unix.sockaddr_un(path))
f0fc793a3754 reorganize transport.endpoint
Tero Marttila <terom@fixme.fi>
parents: 37
diff changeset
   132