Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

unreader.py 2.0KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. # -*- coding: utf-8 -
  2. #
  3. # This file is part of gunicorn released under the MIT license.
  4. # See the NOTICE for more information.
  5. import os
  6. from gunicorn import six
  7. # Classes that can undo reading data from
  8. # a given type of data source.
  9. class Unreader(object):
  10. def __init__(self):
  11. self.buf = six.BytesIO()
  12. def chunk(self):
  13. raise NotImplementedError()
  14. def read(self, size=None):
  15. if size is not None and not isinstance(size, six.integer_types):
  16. raise TypeError("size parameter must be an int or long.")
  17. if size is not None:
  18. if size == 0:
  19. return b""
  20. if size < 0:
  21. size = None
  22. self.buf.seek(0, os.SEEK_END)
  23. if size is None and self.buf.tell():
  24. ret = self.buf.getvalue()
  25. self.buf = six.BytesIO()
  26. return ret
  27. if size is None:
  28. d = self.chunk()
  29. return d
  30. while self.buf.tell() < size:
  31. chunk = self.chunk()
  32. if not len(chunk):
  33. ret = self.buf.getvalue()
  34. self.buf = six.BytesIO()
  35. return ret
  36. self.buf.write(chunk)
  37. data = self.buf.getvalue()
  38. self.buf = six.BytesIO()
  39. self.buf.write(data[size:])
  40. return data[:size]
  41. def unread(self, data):
  42. self.buf.seek(0, os.SEEK_END)
  43. self.buf.write(data)
  44. class SocketUnreader(Unreader):
  45. def __init__(self, sock, max_chunk=8192):
  46. super(SocketUnreader, self).__init__()
  47. self.sock = sock
  48. self.mxchunk = max_chunk
  49. def chunk(self):
  50. return self.sock.recv(self.mxchunk)
  51. class IterUnreader(Unreader):
  52. def __init__(self, iterable):
  53. super(IterUnreader, self).__init__()
  54. self.iter = iter(iterable)
  55. def chunk(self):
  56. if not self.iter:
  57. return b""
  58. try:
  59. return six.next(self.iter)
  60. except StopIteration:
  61. self.iter = None
  62. return b""