Rodrigo Rosenfeld Rosas
2014-Jan-19 01:16 UTC
Help understanding the request dispatch workflow for live streaming
Hello, I'm trying to understand why we're experiencing some issues
regarding Live streaming in our servers (it works in our development
machines).
So, I'm taking a look at ActionPack source-code to understand how
dispatching works...
It seems, the entry point is the #dispatch method in
ActionController::Metal.
Then it calls #process(name) and finally #to_a, which seems to return
the Rack response.
First, I couldn't understand how "response" is defined. Will it
always
be nil unless I'm using a responds_to block? Who fills in the @responses
hash in MimeType?
Since we include ActionController::Live and we're using HTTP 1.1 for the
nginx proxy, we expect this #process to take place:
def process(name)
# ...
# This processes the action in a child thread. It lets us return the
# response code and headers back up the rack stack, and still process
# the body in parallel with sending data to the client
Thread.new {
#...
begin
super(name)
rescue => e
# ...
ensure
@_response.commit!
end
}
@_response.await_commit
end
It seems the response is only committed on response.stream.close
(Live::Buffer), which calls @response.commit!
So, I don't quite follow the comment in the code. It says it starts a
new thread so that it returns the response body to the rack stack, but
to me it seems that it only happens in #to_a, but #to_a would only be
called after #process returns, right? But to me it seems like
@_response.await_commit will block until close is called in the buffer,
right?
Could someone please explain me how Rails interacts with Rack. In other
words, how does Rails send Rack the expected [status, headers, body] array?
http://rack.rubyforge.org/doc/SPEC.html
" A Rack application is a Ruby object (not a class) that responds to
call. It takes exactly one argument, the environment and returns an
Array of exactly three values: The status, the headers, and the body."
this is the implementation of to_a:
def to_a #:nodoc:
response ? response.to_a : [status, headers, response_body]
end
How do I know if response is set? And in the case it's set, what class
would it be? How is this related to ActionDispatch::Response or its
inherited ActionController::Live::Response?
Any help is welcomed.
Thanks in advance,
Rodrigo.
--
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Core" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to rubyonrails-core+unsubscribe@googlegroups.com.
To post to this group, send email to rubyonrails-core@googlegroups.com.
Visit this group at http://groups.google.com/group/rubyonrails-core.
For more options, visit https://groups.google.com/groups/opt_out.