1
2
3
4
5
6 import array
7 import socket
8
9 CHUNK_SIZE = (16 * 1024)
10 MAX_BODY = 1024 * (80 + 32)
11
12 try:
13 import ssl
14 _ssl_wrap_socket = ssl.wrap_socket
15 except ImportError:
17 ssl_sock = socket.ssl(sock, key_file, cert_file)
18 return ssl_sock
19
20 if not hasattr(socket, '_GLOBAL_DEFAULT_TIMEOUT'):
21 _GLOBAL_DEFAULT_TIMEOUT = object()
22 else:
23 _GLOBAL_DEFAULT_TIMEOUT = socket._GLOBAL_DEFAULT_TIMEOUT
24
27 msg = "getaddrinfo returns an empty list"
28 host, port = address
29 for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
30 af, socktype, proto, canonname, sa = res
31 sock = None
32 try:
33 sock = socket.socket(af, socktype, proto)
34 if timeout is not _GLOBAL_DEFAULT_TIMEOUT:
35 sock.settimeout(timeout)
36 sock.connect(sa)
37 if ssl:
38 sock = _ssl_wrap_socket(sock, key_file, cert_file)
39 return sock
40 except socket.error, msg:
41 if sock is not None:
42 sock.close()
43 raise socket.error, msg
44
45
46 -def recv(sock, length, buf=None):
47 tmp_buf = array.array("c", '\0' * length)
48 l = sock.recv_into(tmp_buf, length)
49
50 if not buf:
51 return tmp_buf[:l]
52
53 return buf + tmp_buf[:l]
54
56 try:
57 sock.close()
58 except socket.error:
59 pass
60
62 chunk = "".join(("%X\r\n" % len(data), data, "\r\n"))
63 sock.sendall(chunk)
64
65 -def send(sock, data, chunked=False):
69
70
72 timeout = sock.gettimeout()
73 if timeout != 0.0:
74 try:
75 sock.setblocking(0)
76 return send(sock, data, chunked)
77 finally:
78 sock.setblocking(1)
79 else:
80 return send(sock, data, chunked)
81
83 for line in list(lines):
84 send(sock, line, chunked)
85
87 if hasattr(data, 'seek'):
88 data.seek(0)
89
90 while True:
91 binarydata = data.read(CHUNK_SIZE)
92 if binarydata == '': break
93 send(sock, binarydata, chunked)
94