A buffered socket that supports unrecv. Allow putting back data back to the socket for the next recv() call.
| 79 | |
| 80 | |
| 81 | class BufferedSocket: |
| 82 | |
| 83 | """A buffered socket that supports unrecv. |
| 84 | |
| 85 | Allow putting back data back to the socket for the next recv() call. |
| 86 | """ |
| 87 | |
| 88 | def __init__(self, sock): |
| 89 | self.sock = sock |
| 90 | self._buf = b'' |
| 91 | |
| 92 | def fileno(self): |
| 93 | return self.sock.fileno() |
| 94 | |
| 95 | def Recv(self, bufsize, flags=0): |
| 96 | if self._buf: |
| 97 | if len(self._buf) >= bufsize: |
| 98 | ret = self._buf[:bufsize] |
| 99 | self._buf = self._buf[bufsize:] |
| 100 | return ret |
| 101 | ret = self._buf |
| 102 | self._buf = b'' |
| 103 | return ret + self.sock.recv(bufsize - len(ret), flags) |
| 104 | return self.sock.recv(bufsize, flags) |
| 105 | |
| 106 | def UnRecv(self, buf): |
| 107 | self._buf = buf + self._buf |
| 108 | |
| 109 | def Send(self, *args, **kwargs): |
| 110 | return self.sock.send(*args, **kwargs) |
| 111 | |
| 112 | def RecvBuf(self): |
| 113 | """Only recive from buffer.""" |
| 114 | ret = self._buf |
| 115 | self._buf = b'' |
| 116 | return ret |
| 117 | |
| 118 | def Close(self): |
| 119 | self.sock.close() |
| 120 | |
| 121 | |
| 122 | class TLSSettings: |