1
2
3
4
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
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
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
58
61
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
78 if not self._s or not hasattr(self._s, "close"):
79 return
80 try:
81 self._s.close()
82 except:
83 pass
84
87
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
99 for line in list(lines):
100 self.send(line, chunked=chunked)
101
102
103
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