about summary refs log tree commit homepage
path: root/lib
diff options
context:
space:
mode:
authorwhy <why@19e92222-5c0b-0410-8929-a290d50e31e9>2006-10-05 04:27:44 +0000
committerwhy <why@19e92222-5c0b-0410-8929-a290d50e31e9>2006-10-05 04:27:44 +0000
commitaf7c7e395537042bbc8a27886d4fcc3fc1ac9835 (patch)
treefa979efb2f2a94f30577897ee986088857f3762d /lib
parent04b3690a2b35f44086c1943b7e5bda9a25189646 (diff)
downloadunicorn-af7c7e395537042bbc8a27886d4fcc3fc1ac9835.tar.gz
git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@357 19e92222-5c0b-0410-8929-a290d50e31e9
Diffstat (limited to 'lib')
-rw-r--r--lib/mongrel/camping.rb23
1 files changed, 19 insertions, 4 deletions
diff --git a/lib/mongrel/camping.rb b/lib/mongrel/camping.rb
index da497a0..c517420 100644
--- a/lib/mongrel/camping.rb
+++ b/lib/mongrel/camping.rb
@@ -33,13 +33,29 @@ module Mongrel
     # the results into something the Mongrel::HttpResponse
     # needs.
     class CampingHandler < Mongrel::HttpHandler
+      attr_reader :files
+      attr_reader :guard
+      @@file_only_methods = ["GET","HEAD"]
+
       def initialize(klass)
+        @files = Mongrel::DirHandler.new("/",false)
+        @guard = Sync.new
         @klass = klass
       end
 
       def process(request, response)
-        controller = @klass.run(request.body, request.params)
+        if response.socket.closed?
+          return
+        end
+
+        controller = nil
+        @guard.synchronize(:EX) {
+          controller = @klass.run(request.body, request.params)
+        }
+
         sendfile, clength = nil
+        get_or_head = @@file_only_methods.include? request.params[Mongrel::Const::REQUEST_METHOD]
+
         response.status = controller.status
         controller.headers.each do |k, v|
           if k =~ /^X-SENDFILE$/i
@@ -54,9 +70,8 @@ module Mongrel
         end
 
         if sendfile
-          response.send_status(File.size(sendfile))
-          response.send_header
-          response.send_file(sendfile)
+          request.params[Mongrel::Const::PATH_INFO] = sendfile
+          @files.process(request, response)
         elsif controller.body.respond_to? :read
           response.send_status(clength)
           response.send_header