process_client

in lib/puma/server.rb [471:558]


    def process_client(client, buffer)
      begin

        clean_thread_locals = @options[:clean_thread_locals]
        close_socket = true

        requests = 0

        while true
          case handle_request(client, buffer)
          when false
            return
          when :async
            close_socket = false
            return
          when true
            return unless @queue_requests
            buffer.reset

            ThreadPool.clean_thread_locals if clean_thread_locals

            requests += 1

            check_for_more_data = @status == :run

            if requests >= MAX_FAST_INLINE
              
              
              
              
              check_for_more_data = false
            end

            unless client.reset(check_for_more_data)
              close_socket = false
              client.set_timeout @persistent_timeout
              @reactor.add client
              return
            end
          end
        end

      
      rescue ConnectionError
        

      
      rescue MiniSSL::SSLError => e
        lowlevel_error(e, client.env)

        ssl_socket = client.io
        addr = ssl_socket.peeraddr.last
        cert = ssl_socket.peercert

        close_socket = true

        @events.ssl_error self, addr, cert, e

      
      rescue HttpParserError => e
        lowlevel_error(e, client.env)

        client.write_error(400)

        @events.parse_error self, client.env, e

      
      rescue StandardError => e
        lowlevel_error(e, client.env)

        client.write_error(500)

        @events.unknown_error self, e, "Read"

      ensure
        buffer.reset

        begin
          client.close if close_socket
        rescue IOError, SystemCallError
          Thread.current.purge_interrupt_queue if Thread.current.respond_to? :purge_interrupt_queue
          
        rescue StandardError => e
          @events.unknown_error self, e, "Client"
        end
      end
    end