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
79
81 - def __init__(self, connection, release_fun=None, max_chunk=8192):
82 fun = lambda: release_fun(connection)
83 super(SocketUnreader, self).__init__(release_fun=fun)
84 self.conn = connection
85 self.sock = connection.socket()
86 self.mxchunk = max_chunk
87
89 return self.sock.recv(self.mxchunk)
90
93
95 - def __init__(self, iterable, release_fun=None):
98
100 if not self.iter:
101 return ""
102 try:
103 return self.iter.next()
104 except StopIteration:
105 self.iter = None
106 return ""
107