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:
379:
380: parser.reset
381: data << client.readpartial(Const::CHUNK_SIZE)
382: end
383: end
384: rescue EOFError
385:
386: rescue Errno::ECONNRESET
387:
388: rescue Errno::EPIPE
389:
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