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 ConnectionUnreader(SocketUnreader):
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
88 - def chunk(self):
89 return self.sock.recv(self.mxchunk)
90
91 - def close(self):
92 self.conn.close()
93
94 -class IterUnreader(Unreader):
95 - def __init__(self, iterable, release_fun=None):
96 super(IterUnreader, self).__init__(release_fun=release_fun) 97 self.iter = iter(iterable)
98
99 - def chunk(self):
100 if not self.iter: 101 return "" 102 try: 103 return self.iter.next() 104 except StopIteration: 105 self.iter = None 106 return ""
107