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