# File lib/mongrel.rb, line 347
347:     def process_client(client)
348:       begin
349:         parser = HttpParser.new
350:         params = {}
351:         data = client.readpartial(Const::CHUNK_SIZE)
352: 
353:         while true
354:           nread = parser.execute(params, data)
355:           if parser.finished?
356:             script_name, path_info, handler = @classifier.resolve(params[Const::REQUEST_URI])
357: 
358:             if handler
359:               params[Const::PATH_INFO] = path_info
360:               params[Const::SCRIPT_NAME] = script_name
361:               params[Const::GATEWAY_INTERFACE]=Const::GATEWAY_INTERFACE_VALUE
362:               params[Const::REMOTE_ADDR]=client.peeraddr[3]
363:               params[Const::SERVER_NAME]=@host
364:               params[Const::SERVER_PORT]=@port
365:               params[Const::SERVER_PROTOCOL]=Const::SERVER_PROTOCOL_VALUE
366:               params[Const::SERVER_SOFTWARE]=Const::MONGREL_VERSION
367: 
368:               request = HttpRequest.new(params, data[nread ... data.length], client)
369:               response = HttpResponse.new(client)
370:               handler.process(request, response)
371:             else
372:               client.write(Const::ERROR_404_RESPONSE)
373:             end
374: 
375:             break
376:           else
377:             # gotta stream and read again until we can get the parser to be character safe
378:             # TODO: make this more efficient since this means we're parsing a lot repeatedly
379:             parser.reset
380:             data << client.readpartial(Const::CHUNK_SIZE)
381:           end
382:         end
383:       rescue EOFError
384:         # ignored
385:       rescue Errno::ECONNRESET
386:         # ignored
387:       rescue Errno::EPIPE
388:         # ignored
389:       rescue => details
390:         STDERR.puts "ERROR(#{details.class}): #{details}"
391:         STDERR.puts details.backtrace.join("\n")
392:       ensure
393:         client.close
394:       end
395:     end