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 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
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
57
60
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
77 if not self._s or not hasattr(self._s, "close"):
78 return
79 try:
80 self._s.close()
81 except:
82 pass
83
86
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
98 for line in list(lines):
99 self.send(line, chunked=chunked)
100
101
102
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