about summary refs log tree commit homepage
path: root/lib/mongrel/http_request.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/mongrel/http_request.rb')
-rw-r--r--lib/mongrel/http_request.rb53
1 files changed, 21 insertions, 32 deletions
diff --git a/lib/mongrel/http_request.rb b/lib/mongrel/http_request.rb
index c8d4ce4..2416b04 100644
--- a/lib/mongrel/http_request.rb
+++ b/lib/mongrel/http_request.rb
@@ -1,45 +1,27 @@
 
 module Mongrel
   #
-  # When a handler is found for a registered URI then this class is constructed
-  # and passed to your HttpHandler::process method.  You should assume that
-  # *one* handler processes all requests.  Included in the HttpRequest is a
-  # HttpRequest.params Hash that matches common CGI params, and a HttpRequest.body
-  # which is a string containing the request body (raw for now).
-  #
   # The HttpRequest.initialize method will convert any request that is larger than
   # Const::MAX_BODY into a Tempfile and use that as the body.  Otherwise it uses
   # a StringIO object.  To be safe, you should assume it works like a file.
-  #
-  # The HttpHandler.request_notify system is implemented by having HttpRequest call
-  # HttpHandler.request_begins, HttpHandler.request_progress, HttpHandler.process during
-  # the IO processing.  This adds a small amount of overhead but lets you implement
-  # finer controlled handlers and filters.
-  #
+  #
   class HttpRequest
     attr_reader :body, :params
 
     # You don't really call this.  It's made for you.
     # Main thing it does is hook up the params, and store any remaining
     # body data into the HttpRequest.body attribute.
-    def initialize(params, socket, dispatchers)
+    def initialize(params, socket)
       @params = params
       @socket = socket
-      @dispatchers = dispatchers
       content_length = @params[Const::CONTENT_LENGTH].to_i
       remain = content_length - @params.http_body.length
-      
-      # tell all dispatchers the request has begun
-      @dispatchers.each do |dispatcher|
-        dispatcher.request_begins(@params)
-      end unless @dispatchers.nil? || @dispatchers.empty?
 
       # Some clients (like FF1.0) report 0 for body and then send a body.  This will probably truncate them but at least the request goes through usually.
       if remain <= 0
         # we've got everything, pack it up
         @body = StringIO.new
         @body.write @params.http_body
-        update_request_progress(0, content_length)
       elsif remain > 0
         # must read more data to complete body
         if remain > Const::MAX_BODY
@@ -58,14 +40,25 @@ module Mongrel
       @body.rewind if @body
     end
 
-    # updates all dispatchers about our progress
-    def update_request_progress(clen, total)
-      return if @dispatchers.nil? || @dispatchers.empty?
-      @dispatchers.each do |dispatcher|
-        dispatcher.request_progress(@params, clen, total)
-      end
+    # returns an environment which is rackable
+    # http://rack.rubyforge.org/doc/files/SPEC.html
+    # copied directly from racks mongrel handler
+    def env
+      env = params.clone
+      env.delete "HTTP_CONTENT_TYPE"
+      env.delete "HTTP_CONTENT_LENGTH"
+      env["SCRIPT_NAME"] = "" if env["SCRIPT_NAME"] == "/"
+      env.update({"rack.version" => [0,1],
+              "rack.input" => @body,
+              "rack.errors" => STDERR,
+
+              "rack.multithread" => true,
+              "rack.multiprocess" => false, # ???
+              "rack.run_once" => false,
+
+              "rack.url_scheme" => "http",
+            })
     end
-    private :update_request_progress
 
     # Does the heavy lifting of properly reading the larger body requests in
     # small chunks.  It expects @body to be an IO object, @socket to be valid,
@@ -78,15 +71,11 @@ module Mongrel
 
         remain -= @body.write(@params.http_body)
 
-        update_request_progress(remain, total)
-
         # then stream out nothing but perfectly sized chunks
         until remain <= 0 or @socket.closed?
           # ASSUME: we are writing to a disk and these writes always write the requested amount
           @params.http_body = read_socket(Const::CHUNK_SIZE)
           remain -= @body.write(@params.http_body)
-
-          update_request_progress(remain, total)
         end
       rescue Object => e
         STDERR.puts "#{Time.now}: Error reading HTTP body: #{e.inspect}"
@@ -152,4 +141,4 @@ module Mongrel
       return params
     end
   end
-end \ No newline at end of file
+end