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