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