OLD | NEW |
(Empty) | |
| 1 # -*- coding: utf-8 -*- |
| 2 """ |
| 3 backports.makefile |
| 4 ~~~~~~~~~~~~~~~~~~ |
| 5 |
| 6 Backports the Python 3 ``socket.makefile`` method for use with anything that |
| 7 wants to create a "fake" socket object. |
| 8 """ |
| 9 import io |
| 10 |
| 11 from socket import SocketIO |
| 12 |
| 13 |
| 14 def backport_makefile(self, mode="r", buffering=None, encoding=None, |
| 15 errors=None, newline=None): |
| 16 """ |
| 17 Backport of ``socket.makefile`` from Python 3.5. |
| 18 """ |
| 19 if not set(mode) <= set(["r", "w", "b"]): |
| 20 raise ValueError( |
| 21 "invalid mode %r (only r, w, b allowed)" % (mode,) |
| 22 ) |
| 23 writing = "w" in mode |
| 24 reading = "r" in mode or not writing |
| 25 assert reading or writing |
| 26 binary = "b" in mode |
| 27 rawmode = "" |
| 28 if reading: |
| 29 rawmode += "r" |
| 30 if writing: |
| 31 rawmode += "w" |
| 32 raw = SocketIO(self, rawmode) |
| 33 self._makefile_refs += 1 |
| 34 if buffering is None: |
| 35 buffering = -1 |
| 36 if buffering < 0: |
| 37 buffering = io.DEFAULT_BUFFER_SIZE |
| 38 if buffering == 0: |
| 39 if not binary: |
| 40 raise ValueError("unbuffered streams must be binary") |
| 41 return raw |
| 42 if reading and writing: |
| 43 buffer = io.BufferedRWPair(raw, raw, buffering) |
| 44 elif reading: |
| 45 buffer = io.BufferedReader(raw, buffering) |
| 46 else: |
| 47 assert writing |
| 48 buffer = io.BufferedWriter(raw, buffering) |
| 49 if binary: |
| 50 return buffer |
| 51 text = io.TextIOWrapper(buffer, encoding, errors, newline) |
| 52 text.mode = mode |
| 53 return text |
OLD | NEW |