code: def read_chunks(self):
          
  
          if self.reading_chunks and self.got_chunk:
              # we got on the fast-path and directly read from the buffer.
              # if we continue to recurse, this is going to blow up the stack.
              # so instead return
              #
              # NOTE: This actually is unnecessary as long as tornado guarantees that
              #       ioloop.add_callback always gets dispatched via the main io loop
              #       and they don't introduce a fast-path similar to read_XY
              logger.debug("Fast-Path detected, returning...")
              return
  
          while not self.got_request:
              self.reading_chunks = True
              self.got_chunk = False
              # chunk starts with length, so read it. This will then subsequently also read the chunk
              self.httpstream.read_until("\r\n", self._chunk_length)
              self.reading_chunks = False
  
              if self.got_chunk:
                  # the previous read hit the fast path and read from the buffer
                  # instead of going through the main polling loop. This means we 
                  # should iteratively issue the next request
                  logger.debug("Fast-Path detected, iterating...")
                  continue
              else:
                  break
  
          # if we arrive here, we read the complete request or
          # the ioloop has scheduled another call to read_chunks
          return
docs: Read chunks from the HTTP client