[macruby-changes] [4392] ControlTower/trunk
source_changes at macosforge.org
source_changes at macosforge.org
Thu Jul 29 12:08:56 PDT 2010
Revision: 4392
http://trac.macosforge.org/projects/ruby/changeset/4392
Author: joshua.ballanco at apple.com
Date: 2010-07-29 12:08:54 -0700 (Thu, 29 Jul 2010)
Log Message:
-----------
Adding support for X-Sendfile headers
Modified Paths:
--------------
ControlTower/trunk/lib/control_tower/rack_socket.rb
Added Paths:
-----------
ControlTower/trunk/sample/body_content.txt
ControlTower/trunk/sample/x_sendfile.ru
Modified: ControlTower/trunk/lib/control_tower/rack_socket.rb
===================================================================
--- ControlTower/trunk/lib/control_tower/rack_socket.rb 2010-07-29 08:26:05 UTC (rev 4391)
+++ ControlTower/trunk/lib/control_tower/rack_socket.rb 2010-07-29 19:08:54 UTC (rev 4392)
@@ -40,7 +40,7 @@
'rack.run_once' => false,
'rack.version' => VERSION }
resp = nil
- x_sendfile_header = "X-Sendfile"
+ x_sendfile_header = 'X-Sendfile'
x_sendfile = nil
begin
request_data = parse!(connection, env)
@@ -48,6 +48,14 @@
request_data['REMOTE_ADDR'] = connection.addr[3]
status, headers, body = @app.call(request_data)
+ # If there's an X-Sendfile header, we'll use sendfile(2)
+ if headers.has_key?(x_sendfile_header)
+ x_sendfile = headers[x_sendfile_header]
+ x_sendfile = ::File.open(x_sendfile, 'r') unless x_sendfile.kind_of? IO
+ x_sendfile_size = x_sendfile.stat.size
+ headers['Content-Length'] = x_sendfile_size
+ end
+
# Unless somebody's already set it for us (or we don't need it), set the Content-Length
unless (status == -1 ||
(status >= 100 and status <= 199) ||
@@ -68,9 +76,6 @@
resp = "HTTP/1.1 #{status}\r\n"
headers.each do |header, value|
- if header == x_sendfile_header
- x_sendfile = value
- else
resp << "#{header}: #{value}\r\n"
end
resp << "\r\n"
@@ -78,8 +83,10 @@
# Start writing the response
connection.write resp
- # Finish writing out the body
- if body.respond_to?(:each)
+ # Write the body
+ if x_sendfile
+ connection.sendfile(x_sendfile, 0, x_sendfile_size)
+ elsif body.respond_to?(:each)
body.each do |chunk|
connection.write chunk
end
Added: ControlTower/trunk/sample/body_content.txt
===================================================================
--- ControlTower/trunk/sample/body_content.txt (rev 0)
+++ ControlTower/trunk/sample/body_content.txt 2010-07-29 19:08:54 UTC (rev 4392)
@@ -0,0 +1 @@
+You should get this as a response...
Added: ControlTower/trunk/sample/x_sendfile.ru
===================================================================
--- ControlTower/trunk/sample/x_sendfile.ru (rev 0)
+++ ControlTower/trunk/sample/x_sendfile.ru 2010-07-29 19:08:54 UTC (rev 4392)
@@ -0,0 +1,10 @@
+# NOTE: Your cwd needs to be the sample/ directory when you start ControlTower
+class FileSender
+ def call(env)
+ headers = { 'Content-Type' => 'text/plain',
+ 'X-Sendfile' => ::File.expand_path('../body_content.txt', __FILE__) }
+ [200, headers, "You shouldn't get this body..."]
+ end
+end
+
+run FileSender.new
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.macosforge.org/pipermail/macruby-changes/attachments/20100729/f7e2d3a7/attachment.html>
More information about the macruby-changes
mailing list