1
2
3
4
5
6 import os
7 import socket
8
9 try:
10 from cStringIO import StringIO
11 except ImportError:
12 from StringIO import StringIO
13
14
15
16
19 self.buf = StringIO()
20 self.release_fun = release_fun
21
23 raise NotImplementedError()
24
25 - def read(self, size=None):
26 if size is not None and not isinstance(size, (int, long)):
27 raise TypeError("size parameter must be an int or long.")
28 if size == 0:
29 return ""
30 if size < 0:
31 size = None
32
33 self.buf.seek(0, os.SEEK_END)
34
35 if size is None and self.buf.tell():
36 ret = self.buf.getvalue()
37 self.buf.truncate(0)
38 return ret
39 if size is None:
40 return self.chunk()
41
42 while self.buf.tell() < size:
43 chunk = self.chunk()
44 if not len(chunk):
45 ret = self.buf.getvalue()
46 self.buf.truncate(0)
47 return ret
48 self.buf.write(chunk)
49 data = self.buf.getvalue()
50 self.buf.truncate(0)
51 self.buf.write(data[size:])
52 return data[:size]
53
55 self.buf.seek(0, os.SEEK_END)
56 self.buf.write(data)
57
60
62 if callable(self.release_fun):
63 self.release_fun()
64
66 - def __init__(self, sock, release_fun=None, max_chunk=8192):
70
72 return self.sock.recv(self.mxchunk)
73
75 try:
76 self.sock.close()
77 except socket.error:
78 pass
79
81 - def __init__(self, iterable, release_fun=None):
84
86 if not self.iter:
87 return ""
88 try:
89 return self.iter.next()
90 except StopIteration:
91 self.iter = None
92 return ""
93