summary refs log tree commit homepage
diff options
context:
space:
mode:
authorEric Wong <normalperson@yhbt.net>2009-07-01 13:32:33 -0700
committerEric Wong <normalperson@yhbt.net>2009-07-01 13:35:27 -0700
commitec14a20474575e77a23b713ee8fcda1e71b1d018 (patch)
tree596f6dd814beffd9a7ee04ffa2000c6b6471370d
parent563d03f649ef31d2aec3505cbbed1e015493b8fc (diff)
This gives the app ability to deny clients with 417 instead of
blindly making the decision for the underlying application.  Of
course, apps must be made aware of this.
-rw-r--r--lib/unicorn.rb10
-rw-r--r--lib/unicorn/app/inetd.rb4
-rw-r--r--lib/unicorn/http_request.rb3
3 files changed, 13 insertions, 4 deletions
diff --git a/lib/unicorn.rb b/lib/unicorn.rb
index a2893fd..281aa7d 100644
--- a/lib/unicorn.rb
+++ b/lib/unicorn.rb
@@ -444,7 +444,15 @@ module Unicorn
     # once a client is accepted, it is processed in its entirety here
     # in 3 easy steps: read request, call app, write app response
     def process_client(app, client)
-      HttpResponse.write(client, app.call(REQUEST.read(client)))
+      response = app.call(env = REQUEST.read(client))
+
+      if 100 == response.first.to_i
+        client.write(Const::EXPECT_100_RESPONSE)
+        env.delete(Const::HTTP_EXPECT)
+        response = app.call(env)
+      end
+
+      HttpResponse.write(client, response)
     # if we get any error, try to write something back to the client
     # assuming we haven't closed the socket, but don't get hung up
     # if the socket is already closed or broken.  We'll always ensure
diff --git a/lib/unicorn/app/inetd.rb b/lib/unicorn/app/inetd.rb
index 43a23eb..c3b8bbc 100644
--- a/lib/unicorn/app/inetd.rb
+++ b/lib/unicorn/app/inetd.rb
@@ -97,6 +97,10 @@ module Unicorn::App
     end
 
     def call(env)
+      expect = env[Unicorn::Const::HTTP_EXPECT] and
+        /\A100-continue\z/i =~ expect and
+          return [ 100, {} , [] ]
+
       [ 200, { 'Content-Type' => 'application/octet-stream' },
        CatBody.new(env, @cmd) ]
     end
diff --git a/lib/unicorn/http_request.rb b/lib/unicorn/http_request.rb
index 3df9120..ad1e23f 100644
--- a/lib/unicorn/http_request.rb
+++ b/lib/unicorn/http_request.rb
@@ -89,9 +89,6 @@ module Unicorn
     # returns a Rack environment if successful
     def handle_body(socket)
       PARAMS[Const::RACK_INPUT] = if (body = PARAMS.delete(:http_body))
-        if 0 == body.size && /\A100-continue\z/i =~ PARAMS[Const::HTTP_EXPECT]
-          socket.write(Const::EXPECT_100_RESPONSE)
-        end
         length = PARAMS[Const::CONTENT_LENGTH].to_i
 
         if te = PARAMS[Const::HTTP_TRANSFER_ENCODING]