@@ -121,14 +121,31 @@ def _recv_into(self, buf, size=0):
121121 return read_size
122122 return self .socket .recv_into (buf , size )
123123
124+ @staticmethod
125+ def _find (buf , needle , start , end ):
126+ if hasattr (buf , "find" ):
127+ return buf .find (needle , start , end )
128+ result = - 1
129+ i = start
130+ while i < end :
131+ j = 0
132+ while j < len (needle ) and i + j < end and buf [i + j ] == needle [j ]:
133+ j += 1
134+ if j == len (needle ):
135+ result = i
136+ break
137+ i += 1
138+
139+ return result
140+
124141 def _readto (self , first , second = b"" ):
125142 buf = self ._receive_buffer
126143 end = self ._received_length
127144 while True :
128- firsti = buf . find ( first , 0 , end )
145+ firsti = self . _find ( buf , first , 0 , end )
129146 secondi = - 1
130147 if second :
131- secondi = buf . find ( second , 0 , end )
148+ secondi = self . _find ( buf , second , 0 , end )
132149
133150 i = - 1
134151 needle_len = 0
@@ -318,7 +335,12 @@ def json(self):
318335 if not self ._raw :
319336 self ._raw = _RawResponse (self )
320337
321- obj = json .load (self ._raw )
338+ try :
339+ obj = json .load (self ._raw )
340+ except OSError :
341+ # <5.3.1 doesn't piecemeal load json from any object with readinto so load the whole
342+ # string.
343+ obj = json .loads (self ._raw .read ())
322344 if not self ._cached :
323345 self ._cached = obj
324346 self .close ()
0 commit comments