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:
371:
372: parser.reset
373: data << client.readpartial(Const::CHUNK_SIZE)
374: end
375: end
376: rescue EOFError
377:
378: rescue Errno::ECONNRESET
379:
380: rescue Errno::EPIPE
381:
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