I have action check_status
in instances_controller
, and I want to check on status code of URL before redirect_to it.
if status_code
is 200 redirect_to it, else go to view page.
This is the pseudo-code of check_status
action:
def check_status
if "http://www.web.com".status_code == 200
redirect_to "http://www.web.com"
else
#DO Nothing, and go to its view
end
end
For example get '/about' => 'instances#check_status'
, and i want to check if (web.com) get status=200
visit (web.com)
You can do this - but beware:
- Your user will have to wait for your response check to complete before they get redirected. If you're checking a slow server, that could be up to 30 seconds before they get sent somewhere else.
- There's no guarantee that the user will get the same result you got when you checked.
Here's some code that uses Ruby's Net::HTTP
module to perform that web request:
require 'net/http'
def check_status(url)
uri = URI(url)
Net::HTTP.start(uri.host, uri.port) do |http|
request = Net::HTTP::Head.new uri.request_uri
response = http.request request
if response == Net::HTTPSuccess
redirect_to url and return
end
end
end
Make sure you're passing in full URLs to this method, complete with an http://
or https://
prefix, or this won't work.
If you were worried about that performance hit, you could cache the results for a short while and check those before returning. That is, when you look up a URL you can save the time of the lookup & the status code retrieved. Then, on the next lookup, if you've checked that domain in the past 24 hours, return the redirect immediately rather than checking it again.
In addition to Alex's answer, you can use curl
tool instead of Net::HTTP
module.
system('curl www.google.com') # => true
system('curl www.google_not_valid.com') # => false
For me just this one is working to check the response
The ==
one gets no match...
response.is_a? Net::HTTPSuccess
来源:https://stackoverflow.com/questions/25220251/check-on-the-status-code-of-url-before-redirect-to-in-controller-rails