1 """Class returned by TLSConnection.makefile()."""
4 """This class provides a file object interface to a
5 L{tlslite.TLSConnection.TLSConnection}.
7 Call makefile() on a TLSConnection to create a FileObject instance.
9 This class was copied, with minor modifications, from the
10 _fileobject class in socket.py. Note that fileno() is not
13 default_bufsize = 16384 #TREV: changed from 8192
15 def __init__(self, sock, mode='rb', bufsize=-1):
17 self.mode = mode # Not actually used in this version
19 bufsize = self.default_bufsize
20 self.bufsize = bufsize
21 self.softspace = False
25 self._rbufsize = self.default_bufsize
27 self._rbufsize = bufsize
28 self._wbufsize = bufsize
29 self._rbuf = "" # A string
30 self._wbuf = [] # A list of strings
33 return self._sock is not None
34 closed = property(_getclosed, doc="True if the file is closed")
39 for result in self._sock._decrefAsync(): #TREV
48 # close() may fail if __init__ didn't complete
53 buffer = "".join(self._wbuf)
55 self._sock.sendall(buffer)
58 # raise NotImplementedError() #TREV
60 def write(self, data):
61 data = str(data) # XXX Should really reject non-string non-buffers
64 self._wbuf.append(data)
65 if (self._wbufsize == 0 or
66 self._wbufsize == 1 and '\n' in data or
67 self._get_wbuf_len() >= self._wbufsize):
70 def writelines(self, list):
71 # XXX We could do better here for very long lists
72 # XXX Should really reject non-string non-buffers
73 self._wbuf.extend(filter(None, map(str, list)))
74 if (self._wbufsize <= 1 or
75 self._get_wbuf_len() >= self._wbufsize):
78 def _get_wbuf_len(self):
84 def read(self, size=-1):
92 if self._rbufsize <= 1:
93 recv_size = self.default_bufsize
95 recv_size = self._rbufsize
97 data = self._sock.recv(recv_size)
101 return "".join(buffers)
103 # Read until size bytes or EOF seen, whichever comes first
106 self._rbuf = data[size:]
113 left = size - buf_len
114 recv_size = max(self._rbufsize, left)
115 data = self._sock.recv(recv_size)
121 self._rbuf = data[left:]
122 buffers[-1] = data[:left]
125 return "".join(buffers)
127 def readline(self, size=-1):
130 # Read until \n or EOF, whichever comes first
131 if self._rbufsize <= 1:
132 # Speed up unbuffered case
135 recv = self._sock.recv
141 return "".join(buffers)
145 self._rbuf = data[nl:]
152 data = self._sock.recv(self._rbufsize)
159 self._rbuf = data[nl:]
160 buffers[-1] = data[:nl]
162 return "".join(buffers)
164 # Read until size bytes or \n or EOF seen, whichever comes first
165 nl = data.find('\n', 0, size)
168 self._rbuf = data[nl:]
172 self._rbuf = data[size:]
179 data = self._sock.recv(self._rbufsize)
183 left = size - buf_len
184 nl = data.find('\n', 0, left)
187 self._rbuf = data[nl:]
188 buffers[-1] = data[:nl]
192 self._rbuf = data[left:]
193 buffers[-1] = data[:left]
196 return "".join(buffers)
198 def readlines(self, sizehint=0):
202 line = self.readline()
207 if sizehint and total >= sizehint:
217 line = self.readline()