Question

I have a scenario where I'm doing a post in Sinatra via Typhoeus in app.rb. It looks like this:

post "/send-data" do
  ...
  request = Typhoeus::Request.new("http://localhost:4000/renders",
                              :method         => :post,
                              :headers        => { :Accept => "text/html" },
                              :followlocation => true,
                              :timeout        => 100, # milliseconds
                              :params         => params )

  # Run the request via Hydra.
  hydra = Typhoeus::Hydra.new
  hydra.queue(request)
  hydra.run
  ...
end

When I post to 'send-data' Typhoeus successfully does it's post and pushes the user to the view of the created record (http://localhost:4000/renders/34634646464), which is a rails app.

The problem is that the user is never redirected away from /send-data, so if you refresh the page it tries to do the post again. I guess this makes sense, but I really need the user to be redirected to the final (url) location of the record. In other words, the new record can be seen, but this method of redirecting does not actually move the user off of the sinatra app.

What would be the best way to handle this? The only one I can think of off the top of my head is to not use 'followlocation', but rather have the /send-data controller action do the redirect after getting the response location fron Typhoeus.

Was it helpful?

Solution

I tried my suggestion and it works... and does not look too bad.

request = Typhoeus::Request.new("http://localhost:4000/renders.json",
                            :method         => :post,
                            :headers        => { :Accept => "json" },
                            :timeout        => 100, # milliseconds
                            :params         => params )

hydra = Typhoeus::Hydra.new
hydra.queue(request)
hydra.run

response = request.response
redirect response.headers_hash['Location']

I did have to make a change on my rails server. The rails create action responds with json and 'Location' is it's return value. 'Location'is the location of where the newly created record resides. Then I just do a Sinatra redirect which will redirect to the new record on the rails app.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top