code: def backport_makefile(self, mode="r", buffering=None, encoding=None,
                        errors=None, newline=None):
      
      if not set(mode) <= {"r", "w", "b"}:
          raise ValueError(
              "invalid mode %r (only r, w, b allowed)" % (mode,)
          )
      writing = "w" in mode
      reading = "r" in mode or not writing
      assert reading or writing
      binary = "b" in mode
      rawmode = ""
      if reading:
          rawmode += "r"
      if writing:
          rawmode += "w"
      raw = SocketIO(self, rawmode)
      self._makefile_refs += 1
      if buffering is None:
          buffering = -1
      if buffering < 0:
          buffering = io.DEFAULT_BUFFER_SIZE
      if buffering == 0:
          if not binary:
              raise ValueError("unbuffered streams must be binary")
          return raw
      if reading and writing:
          buffer = io.BufferedRWPair(raw, raw, buffering)
      elif reading:
          buffer = io.BufferedReader(raw, buffering)
      else:
          assert writing
          buffer = io.BufferedWriter(raw, buffering)
      if binary:
          return buffer
      text = io.TextIOWrapper(buffer, encoding, errors, newline)
      text.mode = mode
      return text
docs: Backport of ``socket.makefile`` from Python 3.5.