# and eliminates the need to address them.
else: # There is more to read in the chunk.
chunk[:end] = buf[start:]
- chunk[end:] = sock.recv(remaining - end)
+ chunk[end:] = sock.recv(max(0, remaining - end))
sock.recv(2) # Read the trailing CRLF pair. Throw it away.
return chunk
res, ptr = json_decoder.raw_decode(buf)
buf = buf[ptr:]
yield wrap_response(res, self.handle.headers)
- timer = time.time()
continue
except ValueError as e:
- if self.block: pass
+ if self.block and not self.timeout: pass
else: yield None
try:
buf = buf.lstrip() # Remove any keep-alive delimiters to detect hangups.
- if self.timeout:
+ if self.timeout and not buf: # This is a non-blocking read.
ready_to_read = select.select([sock], [], [], self.timeout)
- if ready_to_read[0]:
- buf += recv_chunk(sock).decode('utf-8') # This is a non-blocking read.
- if time.time() - timer > self.timeout:
- yield {'timeout': True}
- else: yield {'timeout': True}
- else:
- buf += recv_chunk(sock).decode('utf-8')
- if not buf and self.block:
+ if not ready_to_read[0] and time.time() - timer > self.timeout:
+ yield {'timeout': True}
+ continue
+ timer = time.time()
+ buf += recv_chunk(sock).decode('utf-8')
+ if not buf:
yield {'hangup': True}
break
except SSLError as e: