pvl/socket.py
author Tero Marttila <tero.marttila@aalto.fi>
Mon, 28 Jul 2014 13:32:41 +0300
changeset 35 4c7905e1cad7
parent 17 9bd35c091f05
permissions -rw-r--r--
version 0.5.1: bugfix for working around conflicting -c/--config options
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    A simple TCP client in the kind of syslog.fifo/file.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Interface: fileno(), __iter__, __call__
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
     7
from __future__ import absolute_import
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
     9
import errno
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import select
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    11
import socket
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
import urlparse
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import logging; log = logging.getLogger('pvl.socket')
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
17
9bd35c091f05 pvl.socket: add SOCK_STREAM to api, fix ValueError on AF_UNIX
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    15
from socket import SOCK_STREAM
9bd35c091f05 pvl.socket: add SOCK_STREAM to api, fix ValueError on AF_UNIX
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    16
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    17
def parse (url, port=None) :
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    18
    """
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    19
        Parse given string into host, port, path parts.
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    20
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    21
        >>> parse_url('')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    22
        (None, None, None)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    23
        >>> parse_url('foo')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    24
        ('foo', None, None)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    25
        >>> parse_url('foo:80')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    26
        ('foo', 80, None)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    27
        >>> parse_url('foo:http')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    28
        ('foo', 'http', None)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    29
        >>> parse_url('/run/foo.sock')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    30
        (None, None, 'run/foo.sock')
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    33
    if '/' in url :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    34
        url, path = url.split('/', 1)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    35
    else :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    36
        path = None
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    38
    if ':' in url :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    39
        url, port = url.split(':')
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    40
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    41
        if port.isdigit() :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    42
            port = int(port)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    43
    
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    44
    if url :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    45
        host = url
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    46
    else :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    47
        host = None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    48
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    49
    return host, port, path
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    50
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    51
def connect (socktype, url, port=None, family=None) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    52
    """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    53
        Returns a connected socket for given string, based on parse().
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    54
    """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    55
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    56
    host, port, path = parse(url, port=port)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    57
    
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    58
    # autodetect as AF_UNIX
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    59
    if path and not family :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    60
        family = socket.AF_UNIX
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    61
    
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    if family == socket.AF_UNIX :
17
9bd35c091f05 pvl.socket: add SOCK_STREAM to api, fix ValueError on AF_UNIX
Tero Marttila <terom@paivola.fi>
parents: 14
diff changeset
    63
        raise ValueError("TODO: AF_UNIX is not yet supported: %s" % (url, ))
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    64
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    65
    else : # AF_UNSPEC or AF_INET/AF_INET6
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    66
        return connect_inet(socktype, host, port, family=family)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    67
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    68
def connect_inet (socktype, host, port, family=None) :
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        Return a TCP/UDP socket connected to the given host/port using getaddrinfo.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    72
        socktype: SOCK_STREAM or SOCK_DGRAM
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    73
        host: IP address, hostname, or None for localhost.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    74
        port: integer port, or string service.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    75
        family: AF_UNSPEC for IP/DNS dependent IPv6/4, or AF_INET or AF_INET6.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    76
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
        TODO: timeout?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
    log.debug("%s:%s: family=%s, socktype=%s", host, port, family, socktype)
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    81
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    82
    if family is None :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
    83
        family = socket.AF_UNSPEC
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
    if host :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
        flags = socket.AI_CANONNAME
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        flags = 0
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
    addrinfo = socket.getaddrinfo(host, port, family, socktype, 0, flags)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
    if not addrinfo :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
        raise Exception("getaddrinfo: %s:%s: no results" % (host, port))
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
    for af, st, proto, name, addr in addrinfo :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
        try :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
            sock = socket.socket(af, st, proto)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
        except socket.error as error :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
            log.warning("%s:%s: socket: %s", host, port, error)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            continue
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
        log.debug("%s:%s: socket: %s", host, port, sock)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        try :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
            sock.connect(addr)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
        except socket.error as error :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
            log.warning("%s:%s: connect: %s", host, port, error)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
            continue
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   112
        log.debug("%s:%s: connect", host, port)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        return sock
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
    else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
        raise Exception("Unable to connect: %s:%s: %s" % (host, port, error))
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
def reverse (sockaddr, numeric_host=False, numeric_port=True) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
        Resolve given sockaddr, returning (host, port).
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
    flags = 0
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
    if numeric_host :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   127
        flags |= socket.NI_NUMERICHOST
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   128
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   129
    if numeric_port :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   130
        flags |= socket.NI_NUMERICSERV
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   131
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   132
    return socket.getnameinfo(sockaddr, flags)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   133
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   134
def socket_str (sock) :
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   135
    """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   136
        Return url str for socket peer.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   137
    """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   138
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   139
    # get connected peer
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   140
    try :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   141
        peer = sock.getpeername()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   142
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   143
    except socket.error as ex :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   144
        # fails if socket is not connected XXX: even after EOF on read..?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   145
        return str(ex)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   146
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   147
    host, port = reverse(peer)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   148
    
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   149
    return "{host}:{port}".format(host=host, port=port)
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   150
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
def nonblocking (call, *args, **kwargs) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
        Call the given function, which read/writes on a nonblocking file, and return None if it would have blocked.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
        Raises EOFError on SIGPIPE/EPIPE.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
        # XXX: does python handle SIGPIPE for us?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   158
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   159
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   160
    try :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
        return call(*args, **kwargs)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
    except socket.error as ex :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        # block?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
        if ex.errno == errno.EAGAIN or ex.errno == errno.EWOULDBLOCK:
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
            # empty
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
            return None
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
        elif ex.errno == errno.EPIPE :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
            # XXX: write-eof?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
            raise EOFError()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   172
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
        else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   174
            raise
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
class ReadStream (object) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
        Buffered stream, supporting non-blocking/line-based reads.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   181
    BLOCK = 512
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
    def __init__ (self, sock, buffer=None) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
            TODO: buffer    - maximum line length
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
        self.sock = sock
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        self._buf = ''
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
    def fileno (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        return self.sock.fileno()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
    def _read (self, block=BLOCK) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
            Read up to n bytes from socket.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
            
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
            Returns None if we would block.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
            Raises EOFError on EOF.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
        buf = nonblocking(self.sock.recv, block)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        log.debug("%s: %s", self, buf)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
        if buf is None :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
            return None
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
        elif buf :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   209
            return buf
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
        else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   211
            raise EOFError()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   213
    def peek (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
            Peek at data in buffer.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
        return self._buf
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
    def read (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
            Read and return any available input.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
            Returns None if blocking.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
        if self._buf :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
            buf, self._buf = self._buf, ''
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
            
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
        else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
            buf = self._read()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
        return buf
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   235
    __call__ = read
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   236
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
    def readline (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
            Read and return next waiting line from input.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
            Line is returned without trailing '\r\n' or '\n'.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
            Returns None if there is no line available.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
            XXX: trailing data in buf when _read() raises EOFError?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   246
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
        while '\n' not in self._buf :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
            # read chunk
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
            read = self._read()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
            if read is None :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
                return None
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
            
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
            self._buf += read
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
        # split out one line
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
        line, self._buf = self._buf.split('\n', 1)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
        # in case we had \r\n
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
        line = line.rstrip('\r')
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
        log.debug("%s: %s", self, line)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   265
        return line
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
    def readlines (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
            Read any available input, yielding lines.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
            Returns None if thre is no more input available.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
            Raises EOFError in the socket was closed.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
        while True :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
            line = self.readline()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
            if line is None :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
                return
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
            else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
                yield line
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
    __iter__ = readlines
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
    def __str__ (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   287
        return socket_str(self.sock)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   289
class WriteStream (object) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
        Writable stream, supporting non-blocking/buffered writes.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
        XXX: buffering is completely untested
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
    """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
    EOL = '\n'
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   298
    def __init__ (self, sock, eol=None, buffer=None) :
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
            TODO:   buffer  - maximum outgoing buffer length
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
        self.sock = sock
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
        self._buf = buffer
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   305
        self.eol = eol or self.EOL
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
    def _write (self, buf) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   308
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   309
            Write given data to socket, returning the number of bytes written, or None, if buffering is enabled.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
        send = nonblocking(self.sock.send, buf)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
        # eof on write?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   315
        if send is None :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
            return None
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   317
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
        elif send :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
            # ok, message (partially) written
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
            return send
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
        else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
            # XXX: zero-length send? how do we handle this? What does it actually mean?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
            # handle as a wouldblock...
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
            return None
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
    def write (self, data) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
            Write given data to socket.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
            TODO: buffer small chunks -> select writable -> write?
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
            Buffers if not able to write, or raises EOFError (hah!)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
        if not self._buf :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
            # write directly
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
            while data :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
                write = self._write(data)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
                
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
                if write :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
                    # remaining data
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
                    data = data[write:]
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
                else :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
                    # cannot write more
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
                    break
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
        if not data :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
            # sent
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
            return
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
        if self._buf is None :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
            # no write buffering, and socket buffer full!
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
            raise EOFError()
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
        # append to outgoing buffer
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358
        self._buf += data
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   359
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   360
    def writeline (self, line, eol=None) :
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   361
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   362
            Write out line.
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   363
        """
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   364
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   365
        log.debug("%s: %s", self, line)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   366
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   367
        self.write(str(line))
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   368
        self.write(eol or self.eol)
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
    
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
    def __call__ (self, *lines) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
        for line in lines :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   372
            self.writeline(line)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   373
        
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   374
        # TODO: flush
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   375
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   376
    def __str__ (self) :
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   377
        return socket_str(self.sock)
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   378
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   379
class SockStream (object) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   380
    """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   381
        A (TCP) socket connection.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   382
        
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   383
        Supports nonblocking reads and line-oriented protoocls.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   384
    """
7
95d06ed3c395 pvl.socket: move from pvl-irker
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   385
14
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   386
    PORT = None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   387
    EOL = None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   388
    
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   389
    @classmethod
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   390
    def connect (cls, host, port=None, family=None, **opts) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   391
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   392
            Blocking TCP client resolve/connect.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   393
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   394
            Raises ??? if connect fails.
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   395
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   396
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   397
        sock = connect(socket.SOCK_STREAM, host, port or cls.PORT,
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   398
                family=family,
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   399
        )
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   400
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   401
        tcp = cls(sock, **opts)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   402
        log.info("%s", tcp)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   403
        return tcp
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   404
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   405
    def __init__ (self, sock, nonblocking=None) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   406
        # store
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   407
        self.sock = sock
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   408
        
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   409
        # nonblocking mode?
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   410
        if nonblocking :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   411
            self.sock.setblocking(not nonblocking)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   412
        
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   413
        # read/write buffer
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   414
        self.read = ReadStream(sock)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   415
        self.write = WriteStream(sock, eol=self.EOL)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   416
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   417
        # cached endpoint names
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   418
        self._local_name = None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   419
        self._remote_name = None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   420
   
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   421
    def fileno (self) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   422
        return self.sock.fileno()
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   423
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   424
    def __iter__ (self) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   425
        return iter(self.read)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   426
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   427
    def __call__ (self, *args, **kwargs) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   428
        return self.write(*args, **kwargs)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   429
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   430
    @property
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   431
    def local (self) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   432
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   433
            Resolve the local endpoint (host, port)
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   434
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   435
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   436
        if not self._local_name :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   437
            try :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   438
                self._local_name, port = reverse(self.sock.getsockname())
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   439
            except socket.error as ex:
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   440
                return None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   441
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   442
        return self._local_name
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   443
    
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   444
    @property
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   445
    def remote (self) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   446
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   447
            Resolve the remote endpoint (host, port).
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   448
        """
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   449
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   450
        if not self._remote_name :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   451
            try :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   452
                self._remote_name, port = reverse(self.sock.getpeername())
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   453
            except socket.error as ex:
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   454
                return None
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   455
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   456
        return self._remote_name
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   457
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   458
    def __str__ (self) :
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   459
        return "%s" % self.remote
80d9f73f379a pvl.socket: cleanup unused scheme support, making socktype explicit. Add SockStream class
Tero Marttila <terom@paivola.fi>
parents: 7
diff changeset
   460