Skip to content
This repository has been archived by the owner on Aug 9, 2021. It is now read-only.

Commit

Permalink
Better POST body handling
Browse files Browse the repository at this point in the history
git-svn-id: http://svn.macosforge.org/repository/ruby/ControlTower/trunk@4295 23306eb0-4c56-4727-a40e-e92c0eb68959
  • Loading branch information
jballanc committed Jun 26, 2010
1 parent 86e0c99 commit bdcc742
Show file tree
Hide file tree
Showing 3 changed files with 11 additions and 14 deletions.
4 changes: 2 additions & 2 deletions ext/CTParser/CTParser.m
Expand Up @@ -124,9 +124,9 @@
}

// If we've been given any part of the body, put it here
NSMutableArray *body = [environment objectForKey:@"rack.input"];
NSMutableData *body = [environment objectForKey:@"rack.input"];
if (body != nil) {
[body addObject:[NSData dataWithBytes:at length:length]];
[body appendData:[NSData dataWithBytes:at length:length]];
}
else {
NSLog(@"Hmm...you seem to have body data but no where to put it. That's probably an error.");
Expand Down
20 changes: 9 additions & 11 deletions lib/control_tower/rack_socket.rb
Expand Up @@ -46,6 +46,7 @@ def open
$stderr.puts "Error: Connection terminated!"
rescue Object => e
$stderr.puts "Error: Problem transmitting data -- #{e.inspect}"
$stderr.puts e.backtrace.join("\n")
ensure
# We should clean up after our tempfile, if we used one.
input = env['rack.input']
Expand Down Expand Up @@ -73,7 +74,7 @@ def close

def prepare_environment
{ 'rack.errors' => $stderr,
'rack.input' => NSMutableArray.alloc.init, # For now, collect the body as an array of NSData's
'rack.input' => NSMutableData.new,
'rack.multiprocess' => false,
'rack.multithread' => @multithread,
'rack.run_once' => false,
Expand Down Expand Up @@ -104,25 +105,22 @@ def parse!(connection, env)
nread = parser.parseData(data, forEnvironment: env, startingAt: nread)
if parser.finished == 1
parsing_headers = false # We're done, now on to receiving the body
content_uploaded = env['rack.input'].first.length
content_length = env['CONTENT_LENGTH'].to_i
content_uploaded = env['rack.input'].length
end
else # Done parsing headers, now just collect request body:
content_uploaded += incoming_bytes.length
env['rack.input'] << incoming_bytes
env['rack.input'].appendData(incoming_bytes)
end
end

if content_length > 1024 * 1024
body = Tempfile.new('control-tower-request-body-')
body_handle = NSFileHandle.alloc.initWithFileDescriptor(body.fileno)
env['rack.input'].each { |upload_data| body_handle.writeData(upload_data) }
body.rewind
env['rack.input'] = body
body_file = Tempfile.new('control-tower-request-body-')
NSFileHandle.alloc.initWithFileDescriptor(body_file.fileno).writeData(env['rack.input'])
body_file.rewind
env['rack.input'] = body_file
else
body = StringIO.new
env['rack.input'].each { |upload_data| body << upload_data.to_str }
env['rack.input'] = body
env['rack.input'] = StringIO.new(NSString.alloc.initWithData(env['rack.input'], encoding: NSASCIIStringEncoding))
end
# Returning what we've got...
return env
Expand Down
1 change: 0 additions & 1 deletion lib/control_tower/server.rb
Expand Up @@ -20,7 +20,6 @@ def start
end

def handle_request(env)
env
wrap_output(*@app.call(env))
end

Expand Down

0 comments on commit bdcc742

Please sign in to comment.