Package restkit :: Package http :: Module unreader
[hide private]
[frames] | no frames]

Source Code for Module restkit.http.unreader

 1  # -*- coding: utf-8 - 
 2  # 
 3  # This file is part of restkit released under the MIT license.  
 4  # See the NOTICE for more information. 
 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  # Classes that can undo reading data from 
15  # a given type of data source. 
16   
17 -class Unreader(object):
18 - def __init__(self, release_fun=None):
19 self.buf = StringIO() 20 self.release_fun = release_fun
21
22 - def chunk(self):
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
54 - def unread(self, data):
55 self.buf.seek(0, os.SEEK_END) 56 self.buf.write(data)
57
58 - def close(self):
59 return None
60
61 - def release(self):
62 if callable(self.release_fun): 63 self.release_fun()
64
65 -class SocketUnreader(Unreader):
66 - def __init__(self, sock, release_fun=None, max_chunk=8192):
67 super(SocketUnreader, self).__init__(release_fun=release_fun) 68 self.sock = sock 69 self.mxchunk = max_chunk
70
71 - def chunk(self):
72 return self.sock.recv(self.mxchunk)
73
74 - def close(self):
75 try: 76 self.sock.close() 77 except socket.error: 78 pass
79
80 -class IterUnreader(Unreader):
81 - def __init__(self, iterable, release_fun=None):
82 super(IterUnreader, self).__init__(release_fun=release_fun) 83 self.iter = iter(iterable)
84
85 - def chunk(self):
86 if not self.iter: 87 return "" 88 try: 89 return self.iter.next() 90 except StopIteration: 91 self.iter = None 92 return ""
93