pvl/socket.py
author Tero Marttila <terom@paivola.fi>
Sun, 10 Feb 2013 13:20:29 +0200
changeset 205 f7658198c224
parent 144 9966d35a63df
permissions -rw-r--r--
pvl.verkko.hosts: refactor RealtimeHandler to use HostsTable
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     1
"""
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     2
    A simple TCP client in the kind of syslog.fifo/file.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     3
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     4
    Interface: fileno(), __iter__, __call__
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     5
"""
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     6
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     7
# XXX: absolute import plz
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     8
socket = __import__('socket')
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
     9
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    10
import select
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    11
import errno
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    12
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    13
import urlparse
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    14
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    15
import logging; log = logging.getLogger('pvl.socket')
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    16
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    17
# order matters!
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    18
URL = (
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    19
    # scheme    family              socktype
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    20
    ( 'unix',   (socket.AF_UNIX,    None                )   ), # socktype is given
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    21
    ( 'tcp',    (0,                 socket.SOCK_STREAM  )   ), # AF_UNSPEC
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    22
    ( 'udp',    (0,                 socket.SOCK_DGRAM   )   ), # AF_UNSPEC
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    23
)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    24
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    25
URL_SCHEMES = dict(URL)
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    26
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    27
def parse (str, port=None, scheme='tcp', unix=socket.SOCK_DGRAM) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    28
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    29
        Parse given string into (AF_*, SOCK_*, host, port).
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    30
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    31
        For AF_UNIX, the path is in host, and port is empty, and the socktype is the given unix=... value.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    32
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    33
   
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    34
    family, socktype = URL_SCHEMES[scheme]
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    35
    url = urlparse.urlparse(str)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    36
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    37
    # TODO: UNIX?
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    38
    if url.scheme and url.netloc :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    39
        # proper url
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    40
        family, socktype = URL_SCHEMES[url.scheme]
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    41
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    42
        return family, socktype, url.hostname, url.port or port
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    43
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    44
    elif url.scheme and url.path :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    45
        # host:port
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    46
        return family, socktype, url.scheme, int(url.path)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    47
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    48
    elif url.path :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    49
        # host
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    50
        return family, socktype, url.path, port
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    51
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    52
    else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    53
        raise ValueError("unparseable connect URL: %s", str)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    54
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    55
def connect (str, *args, **kwargs) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    56
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    57
        Returns a connected socket for given parse()'d string.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    58
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    59
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    60
    family, socktype, host, port = parse(str, *args, **kwargs)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    61
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    62
    if family == socket.AF_UNIX :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    63
        raise ValueError("XXX: AF_UNIX is not yet supported", str)
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
    64
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    65
    else : # AF_UNSPEC
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    66
        return connect_inet(host, port, family=family, socktype=socktype)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    67
 
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    68
def connect_inet (host=None, port=None, family=socket.AF_UNSPEC, socktype=socket.SOCK_STREAM) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    69
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    70
        Return a TCP/UDP socket connected to the given host/port using getaddrinfo.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    71
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    72
        TODO: timeout?
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    73
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    74
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    75
    log.debug("%s:%s: family=%s, socktype=%s", host, port, family, socktype)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    76
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    77
    if host :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    78
        flags = socket.AI_CANONNAME
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    79
    else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    80
        flags = 0
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    81
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    82
    addrinfo = socket.getaddrinfo(host, port, family, socktype, 0, flags)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    83
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    84
    if not addrinfo :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    85
        raise Exception("getaddrinfo: %s:%s: no results" % (host, port))
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    86
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    87
    for af, st, proto, name, addr in addrinfo :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    88
        try :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    89
            sock = socket.socket(af, st, proto)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    90
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    91
        except socket.error as error :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    92
            log.warning("%s:%s: socket: %s", host, port, error)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    93
            continue
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    94
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    95
        log.debug("%s:%s: socket: %s", host, port, sock)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    96
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    97
        try :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    98
            sock.connect(addr)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
    99
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   100
        except socket.error as error :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   101
            log.warning("%s:%s: connect: %s", host, port, error)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   102
            continue
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   103
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   104
        log.debug("%s:%s: connect", host, port)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   105
        log.info("%s", name)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   106
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   107
        return sock
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   108
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   109
    else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   110
        raise Exception("Unable to connect: %s:%s: %s" % (host, port, error))
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   111
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   112
def reverse (sockaddr, numeric_host=False, numeric_port=True) :
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   113
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   114
        Resolve given sockaddr, returning (host, port).
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   115
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   117
    flags = 0
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   118
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   119
    if numeric_host :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   120
        flags |= socket.NI_NUMERICHOST
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   121
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   122
    if numeric_port :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   123
        flags |= socket.NI_NUMERICSERV
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   124
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   125
    return socket.getnameinfo(sockaddr, flags)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   126
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   127
def socket_str (sock) :
144
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   128
    # get connected peer
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   129
    try :
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   130
        peer = sock.getpeername()
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   131
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   132
    except socket.error as ex :
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   133
        # fails if socket is not connected XXX: even after EOF on read..?
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   134
        return str(ex)
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   135
    
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   136
    # lookup scheme
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   137
    for scheme, (family, socktype) in URL :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   138
        if family and family != sock.family :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   139
            continue
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   140
        elif socktype and socktype != sock.type :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   141
            continue
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   142
        else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   143
            break
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   144
    else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   145
        scheme = None
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   146
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   147
    host, port = reverse(peer)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   148
    
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   149
    if scheme :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   150
        return "{scheme}://{host}:{port}".format(scheme=scheme, host=host, port=port)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   151
    else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   152
        return "{host}:{port}".format(host=host, port=port)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   153
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   154
def nonblocking (call, *args, **kwargs) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   155
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   156
        Call the given function, which read/writes on a nonblocking file, and return None if it would have blocked.
144
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   157
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   158
        Raises EOFError on SIGPIPE/EPIPE.
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   159
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   160
        # XXX: does python handle SIGPIPE for us?
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   161
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   162
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   163
    try :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   164
        return call(*args, **kwargs)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   165
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   166
    except socket.error as ex :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   167
        # block?
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   168
        if ex.errno == errno.EAGAIN or ex.errno == errno.EWOULDBLOCK:
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   169
            # empty
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   170
            return None
144
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   171
        
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   172
        elif ex.errno == errno.EPIPE :
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   173
            # XXX: write-eof?
9966d35a63df pvl.socket: Raise EOFError on write() EPIPE, fix socket_str when not connected
Tero Marttila <terom@paivola.fi>
parents: 139
diff changeset
   174
            raise EOFError()
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   175
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   176
        else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   177
            raise
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   178
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   179
class ReadStream (object) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   180
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   181
        Buffered stream, supporting non-blocking/line-based reads.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   182
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   183
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   184
    BLOCK=512
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   185
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   186
    def __init__ (self, sock, buffer=None) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   187
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   188
            TODO: buffer    - maximum line length
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   189
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   190
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   191
        self.sock = sock
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   192
        self._buf = ''
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   193
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   194
    def fileno (self) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   195
        return self.sock.fileno()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   196
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   197
    def _read (self, block=BLOCK) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   198
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   199
            Read up to n bytes from socket.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   200
            
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   201
            Returns None if we would block.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   202
            Raises EOFError on EOF.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   203
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   204
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   205
        buf = nonblocking(self.sock.recv, block)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   206
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   207
        log.debug("%s: %s", self, buf)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   208
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   209
        if buf is None :
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   210
            return None
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   211
        elif buf :
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   212
            return buf
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   213
        else :
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   214
            raise EOFError()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   215
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   216
    def peek (self) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   217
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   218
            Peek at data in buffer.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   219
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   220
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   221
        return self._buf
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   222
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   223
    def read (self) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   224
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   225
            Read and return any available input.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   226
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   227
            Returns None if blocking.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   228
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   229
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   230
        if self._buf :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   231
            buf, self._buf = self._buf, ''
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   232
            
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   233
        else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   234
            buf = self._read()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   235
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   236
        return buf
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   237
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   238
    def readline (self) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   239
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   240
            Read and return next waiting line from input.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   241
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   242
            Line is returned without trailing '\r\n' or '\n'.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   243
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   244
            Returns None if there is no line available.
139
515b74c6b456 pvl.syslog.SyslogSource: close + __str__
Tero Marttila <terom@paivola.fi>
parents: 132
diff changeset
   245
515b74c6b456 pvl.syslog.SyslogSource: close + __str__
Tero Marttila <terom@paivola.fi>
parents: 132
diff changeset
   246
            XXX: trailing data in buf when _read() raises EOFError?
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   247
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   248
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   249
        while '\n' not in self._buf :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   250
            # read chunk
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   251
            read = self._read()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   252
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   253
            if read is None :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   254
                return None
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   255
            
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   256
            self._buf += read
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   257
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   258
        # split out one line
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   259
        line, self._buf = self._buf.split('\n', 1)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   260
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   261
        # in case we had \r\n
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   262
        line = line.rstrip('\r')
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   263
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   264
        log.debug("%s: %s", self, line)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   265
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   266
        return line
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   267
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   268
    def readlines (self) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   269
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   270
            Read any available input, yielding lines.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   271
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   272
            Returns None if thre is no more input available.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   273
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   274
            Raises EOFError in the socket was closed.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   275
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   276
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   277
        while True :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   278
            line = self.readline()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   279
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   280
            if line is None :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   281
                return
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   282
            else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   283
                yield line
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   284
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   285
    __iter__ = readlines
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   286
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   287
    def __str__ (self) :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   288
        return socket_str(self.sock)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   289
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   290
class WriteStream (object) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   291
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   292
        Writable stream, supporting non-blocking/buffered writes.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   293
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   294
        XXX: buffering is completely untested
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   295
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   296
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   297
    EOL = '\n'
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   298
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   299
    def __init__ (self, sock, buffer=None) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   300
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   301
            TODO:   buffer  - maximum outgoing buffer length
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   302
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   303
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   304
        self.sock = sock
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   305
        self._buf = buffer
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   306
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   307
    def _write (self, buf) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   308
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
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.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   310
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   311
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   312
        send = nonblocking(self.sock.send, buf)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   313
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   314
        # eof on write?
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   315
        if send is None :
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   316
            return None
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   317
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   318
        elif send :
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   319
            # ok, message (partially) written
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   320
            return send
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   321
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   322
        else :
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   323
            # XXX: zero-length send? how do we handle this? What does it actually mean?
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   324
            # handle as a wouldblock...
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   325
            return None
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   326
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   327
    def write (self, data) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   328
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   329
            Write given data to socket.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   330
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   331
            TODO: buffer small chunks -> select writable -> write?
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   332
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   333
            Buffers if not able to write, or raises EOFError (hah!)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   334
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   335
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   336
        if not self._buf :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   337
            # write directly
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   338
            while data :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   339
                write = self._write(data)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   340
                
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   341
                if write :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   342
                    # remaining data
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   343
                    data = data[write:]
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   344
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   345
                else :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   346
                    # cannot write more
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   347
                    break
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   348
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   349
        if not data :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   350
            # sent
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   351
            return
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   352
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   353
        if self._buf is None :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   354
            # no write buffering, and socket buffer full!
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   355
            raise EOFError()
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   356
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   357
        # append to outgoing buffer
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   358
        self._buf += data
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   359
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   360
    def writeline (self, line, eol=EOL) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   361
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   362
            Write out line.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   363
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   364
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   365
        log.debug("%s: %s", self, line)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   366
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   367
        self.write(str(line))
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   368
        self.write(eol)
116
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   369
    
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   370
    def __call__ (self, *lines) :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   371
        for line in lines :
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   372
            self.writeline(line)
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   373
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   374
        # TODO: flush
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   375
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   376
    def __str__ (self) :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   377
        return socket_str(self.sock)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   378
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   379