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 25 self._s.connect((host, port)) 26 27 if is_ssl: 28 self._s = ssl.wrap_socket(self._s, **ssl_args) 29 30 self.pool = pool 31 self.extra_headers = extra_headers 32 self.is_ssl = is_ssl 33 self.backend_mod = backend_mod 34 self.host = host 35 self.port = port 36 self._connected = True 37 self._life = time.time() 38 self._released = False
39
40 - def matches(self, **match_options):
41 target_host = match_options.get('host') 42 target_port = match_options.get('port') 43 return target_host == self.host and target_port == self.port
44
45 - def is_connected(self):
46 if self._connected: 47 try: 48 r, _, _ = self.backend_mod.Select([self._s], [], [], 0.0) 49 if not r: 50 return True 51 except (ValueError, select.error,): 52 return False 53 self.close() 54 return False
55
56 - def handle_exception(self, exception):
57 raise
58
59 - def get_lifetime(self):
60 return self._life
61
62 - def invalidate(self):
63 self.close() 64 self._connected = False 65 self._life = -1
66
67 - def release(self, should_close=False):
68 if self._released: 69 return 70 71 self._released = True 72 if should_close: 73 self.close() 74 else: 75 self.pool.release_connection(self)
76
77 - def close(self):
78 if not self._s or not hasattr(self._s, "close"): 79 return 80 try: 81 self._s.close() 82 except: 83 pass
84
85 - def socket(self):
86 return self._s
87
88 - def send_chunk(self, data):
89 chunk = "".join(("%X\r\n" % len(data), data, "\r\n")) 90 self._s.sendall(chunk)
91
92 - def send(self, data, chunked=False):
93 if chunked: 94 return self.send_chunk(data) 95 96 return self._s.sendall(data)
97
98 - def sendlines(self, lines, chunked=False):
99 for line in list(lines): 100 self.send(line, chunked=chunked)
101 102 103 # TODO: add support for sendfile api
104 - def sendfile(self, data, chunked=False):
105 """ send a data from a FileObject """ 106 107 if hasattr(data, 'seek'): 108 data.seek(0) 109 110 while True: 111 binarydata = data.read(CHUNK_SIZE) 112 if binarydata == '': 113 break 114 self.send(binarydata, chunked=chunked)
115 116
117 - def recv(self, size=1024):
118 return self._s.recv(size)
119