pvl/socket.py
author Tero Marttila <terom@paivola.fi>
Sun, 13 Jan 2013 13:04:51 +0200
changeset 139 515b74c6b456
parent 132 a54950a8e4ec
child 144 9966d35a63df
permissions -rw-r--r--
pvl.syslog.SyslogSource: close + __str__
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) :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   128
    peer = sock.getpeername()
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   129
    
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   130
    # lookup scheme
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   131
    for scheme, (family, socktype) in URL :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   132
        if family and family != sock.family :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   133
            continue
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   134
        elif socktype and socktype != sock.type :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   135
            continue
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   136
        else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   137
            break
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   138
    else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   139
        scheme = None
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   140
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   141
    host, port = reverse(peer)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   142
    
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   143
    if scheme :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   144
        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
   145
    else :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   146
        return "{host}:{port}".format(host=host, port=port)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   147
132
a54950a8e4ec version: 0.4.0
Tero Marttila <terom@paivola.fi>
parents: 120
diff changeset
   148
# XXX: SIGPIPE
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
   149
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
   150
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   151
        Call the given function, which read/writes on a nonblocking file, and return None if it would have blocked.
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   152
    """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   153
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
    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
   155
        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
   156
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   157
    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
   158
        # 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
   159
        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
   160
            # 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
   161
            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
   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
        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
   164
            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
   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
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
   167
    """
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
        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
   169
    """
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
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   171
    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
   172
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   173
    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
   174
        """
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
            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
   176
        """
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
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
        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
   179
        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
   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
    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
   182
        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
   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
    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
   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
            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
   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
            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
   189
            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
   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
        
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
        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
   193
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   194
        log.debug("%s: %s", self, buf)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   195
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   196
        if buf is None :
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   197
            return None
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   198
        elif buf :
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   199
            return buf
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   200
        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
   201
            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
   202
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
    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
   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
            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
   206
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   207
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   208
        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
   209
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   210
    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
   211
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   212
            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
   213
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
            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
   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
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
        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
   218
            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
   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
        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
   221
            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
   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
        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
   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
    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
   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
            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
   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
            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
   230
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
            Returns None if there is no line available.
139
515b74c6b456 pvl.syslog.SyslogSource: close + __str__
Tero Marttila <terom@paivola.fi>
parents: 132
diff changeset
   232
515b74c6b456 pvl.syslog.SyslogSource: close + __str__
Tero Marttila <terom@paivola.fi>
parents: 132
diff changeset
   233
            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
   234
        """
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
        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
   237
            # 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
   238
            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
   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
            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
   241
                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
   242
            
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
            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
   244
        
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   245
        # 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
   246
        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
   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
        # 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
   249
        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
   250
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   251
        log.debug("%s: %s", self, line)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   252
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
   253
        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
   254
    
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
    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
   256
        """
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
            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
   258
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
            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
   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
            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
   262
        """
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
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   264
        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
   265
            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
   266
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
            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
   268
                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
   269
            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
   270
                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
   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
    __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
   273
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   274
    def __str__ (self) :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   275
        return socket_str(self.sock)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   276
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
   277
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
   278
    """
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
        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
   280
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
        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
   282
    """
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
    
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
    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
   285
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
    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
   287
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   288
            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
   289
        """
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
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
        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
   292
        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
   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
    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
   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
            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
   297
        """
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
        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
   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
        # eof on write?
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   302
        if send is None :
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   303
            return None
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   304
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   305
        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
   306
            # 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
   307
            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
   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
        else :
120
d342506c3ef3 pvl.socket: fix recv/send None
Tero Marttila <terom@paivola.fi>
parents: 118
diff changeset
   310
            # 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
   311
            # 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
   312
            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
   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
    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
   315
        """
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   316
            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
   317
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   318
            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
   319
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
            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
   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
89b7385d19ba pvl.irk: split off url/socket stuff into pvl.socket, clarify Irk __call__/__iter__ iterface
Tero Marttila <terom@paivola.fi>
parents:
diff changeset
   323
        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
   324
            # 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
   325
            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
   326
                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
   327
                
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
                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
   329
                    # 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
   330
                    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
   331
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
                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
   333
                    # 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
   334
                    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
   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 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
   337
            # 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
   338
            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
   339
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
        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
   341
            # 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
   342
            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
   343
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
        # 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
   345
        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
   346
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
    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
   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
            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
   350
        """
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
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   352
        log.debug("%s: %s", self, line)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   353
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   354
        self.write(str(line))
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   355
        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
   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
    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
   358
        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
   359
            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
   360
        
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
        # TODO: flush
118
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   362
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   363
    def __str__ (self) :
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   364
        return socket_str(self.sock)
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   365
4f9bcf1e53e0 pvl.socket: better logging
Tero Marttila <terom@paivola.fi>
parents: 116
diff changeset
   366