Package restkit :: Module conn
[hide private]
[frames] | no frames]

Source Code for Module restkit.conn

  1  # -*- coding: utf-8 - 
  2  # 
  3  # This file is part of restkit released under the MIT license. 
  4  # See the NOTICE for more information. 
  5   
  6  import logging 
  7  import select 
  8  import socket 
  9  import ssl 
 10  import time 
 11   
 12  from socketpool import Connector 
 13   
 14  CHUNK_SIZE = 16 * 1024 
 15  MAX_BODY = 1024 * 112 
 16  DNS_TIMEOUT = 60 
 17   
 18   
19 -class Connection(Connector):
20
21 - def __init__(self, host, port, pool=None, is_ssl=False, 22 extra_headers=[], backend_mod=None, **ssl_args):
23 self._s = backend_mod.Socket(socket.AF_INET, socket.SOCK_STREAM) 24 self._s.connect((host, port)) 25 26 if is_ssl: 27 self._s = ssl.wrap_socket(self._s, **ssl_args) 28 29 self.pool = pool 30 self.extra_headers = extra_headers 31 self.is_ssl = is_ssl 32 self.host = host 33 self.port = port 34 self._connected = True 35 self._life = time.time() 36 self._released = False
37
38 - def matches(self, **match_options):
39 target_host = match_options.get('host') 40 target_port = match_options.get('port') 41 return target_host == self.host and target_port == self.port
42
43 - def is_connected(self):
44 if self._connected: 45 try: 46 r, _, _ = select.select([self._s], [], [], 0) 47 if not r: 48 return True 49 except (ValueError, select.error,): 50 51 return False 52 self.close() 53 return False
54
55 - def handle_exception(self, exception):
56 raise
57
58 - def get_lifetime(self):
59 return self._life
60
61 - def invalidate(self):
62 self.close() 63 self._connected = False 64 self._life = -1
65
66 - def release(self, should_close=False):
67 if self._released: 68 return 69 70 self._released = True 71 if should_close: 72 self.close() 73 else: 74 self.pool.release_connection(self)
75
76 - def close(self):
77 if not self._s or not hasattr(self._s, "close"): 78 return 79 try: 80 self._s.close() 81 except: 82 pass
83
84 - def socket(self):
85 return self._s
86
87 - def send_chunk(self, data):
88 chunk = "".join(("%X\r\n" % len(data), data, "\r\n")) 89 self._s.sendall(chunk)
90
91 - def send(self, data, chunked=False):
92 if chunked: 93 return self.send_chunk(data) 94 95 return self._s.sendall(data)
96
97 - def sendlines(self, lines, chunked=False):
98 for line in list(lines): 99 self.send(line, chunked=chunked)
100 101 102 # TODO: add support for sendfile api
103 - def sendfile(self, data, chunked=False):
104 """ send a data from a FileObject """ 105 106 if hasattr(data, 'seek'): 107 data.seek(0) 108 109 while True: 110 binarydata = data.read(CHUNK_SIZE) 111 if binarydata == '': 112 break 113 self.send(binarydata, chunked=chunked)
114 115
116 - def recv(self, size=1024):
117 return self._s.recv(size)
118