@@ -121,14 +121,31 @@ def _recv_into(self, buf, size=0):
121
121
return read_size
122
122
return self .socket .recv_into (buf , size )
123
123
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
+
124
141
def _readto (self , first , second = b"" ):
125
142
buf = self ._receive_buffer
126
143
end = self ._received_length
127
144
while True :
128
- firsti = buf . find ( first , 0 , end )
145
+ firsti = self . _find ( buf , first , 0 , end )
129
146
secondi = - 1
130
147
if second :
131
- secondi = buf . find ( second , 0 , end )
148
+ secondi = self . _find ( buf , second , 0 , end )
132
149
133
150
i = - 1
134
151
needle_len = 0
@@ -318,7 +335,12 @@ def json(self):
318
335
if not self ._raw :
319
336
self ._raw = _RawResponse (self )
320
337
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 ())
322
344
if not self ._cached :
323
345
self ._cached = obj
324
346
self .close ()
0 commit comments