Module: Protocol::Rack::Body

Defined in:
lib/protocol/rack/body.rb,
lib/protocol/rack/body/streaming.rb,
lib/protocol/rack/body/enumerable.rb,
lib/protocol/rack/body/input_wrapper.rb

Defined Under Namespace

Classes: Enumerable, InputWrapper, Streaming

Constant Summary collapse

CONTENT_LENGTH =
'content-length'

Class Method Summary collapse

Class Method Details

.completion_callback(response_finished, env, status, headers) ⇒ Object



47
48
49
50
51
52
53
# File 'lib/protocol/rack/body.rb', line 47

def self.completion_callback(response_finished, env, status, headers)
	proc do |error|
		response_finished.each do |callback|
			callback.call(env, status, headers, error)
		end
	end
end

.wrap(env, status, headers, body, input = nil) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/protocol/rack/body.rb', line 15

def self.wrap(env, status, headers, body, input = nil)
	# In no circumstance do we want this header propagating out:
	if length = headers.delete(CONTENT_LENGTH)
		# We don't really trust the user to provide the right length to the transport.
		length = Integer(length)
	end
	
	# If we have an Async::HTTP body, we return it directly:
	if body.is_a?(::Protocol::HTTP::Body::Readable)
		# Ignore.
	elsif status == 200 and body.respond_to?(:to_path)
		begin
			# Don't mangle partial responses (206)
			body = ::Protocol::HTTP::Body::File.open(body.to_path).tap do
				body.close if body.respond_to?(:close) # Close the original body.
			end
		rescue Errno::ENOENT
			# If the file is not available, ignore.
		end
	elsif body.respond_to?(:each)
		body = Body::Enumerable.wrap(body, length)
	else
		body = Body::Streaming.new(body, input)
	end
	
	if response_finished = env[RACK_RESPONSE_FINISHED] and response_finished.any?
		body = ::Protocol::HTTP::Body::Completable.new(body, completion_callback(response_finished, env, status, headers))
	end
	
	return body
end