Parent

Net::Ping::HTTP

The Ping::HTTP class encapsulates methods for HTTP pings.

Attributes

follow_redirect[RW]

By default an http ping will follow a redirect and give you the result of the final URI. If this value is set to false, then it will not follow a redirect and will return false immediately on a redirect.

follow_redirect?[RW]

By default an http ping will follow a redirect and give you the result of the final URI. If this value is set to false, then it will not follow a redirect and will return false immediately on a redirect.

redirect_limit[RW]

The maximum number of redirects allowed. The default is 5.

user_agent[RW]

The user agent used for the HTTP request. The default is nil.

Public Class Methods

new(uri=nil, port=nil, timeout=5) click to toggle source

Creates and returns a new Ping::HTTP object. The default port is the port associated with the URI. The default timeout is 5 seconds.

# File lib/net/ping/http.rb, line 33
def initialize(uri=nil, port=nil, timeout=5)
  @follow_redirect = true
  @redirect_limit  = 5

  port ||= URI.parse(uri).port if uri

  super(uri, port, timeout)
end

Public Instance Methods

ping(host = @host) click to toggle source

Looks for an HTTP response from the URI passed to the constructor. If the result is a kind of Net::HTTPSuccess then the ping was successful and true is returned. Otherwise, false is returned and the Ping::HTTP#exception method should contain a string indicating what went wrong.

If the HTTP#follow_redirect accessor is set to true (which it is by default) and a redirect occurs during the ping, then the HTTP#warning attribute is set to the redirect message, but the return result is still true. If it's set to false then a redirect response is considered a failed ping.

If no file or path is specified in the URI, then '/' is assumed.

# File lib/net/ping/http.rb, line 56
def ping(host = @host)
  super(host)
  bool = false
  uri = URI.parse(host)

  start_time = Time.now

  begin
    response = nil
    uri_path = uri.path.empty? ? '/' : uri.path
    headers = { }
    headers["User-Agent"] = user_agent unless user_agent.nil?
    Timeout.timeout(@timeout) do
      http = Net::HTTP.new(uri.host, uri.port)
      http.use_ssl = (uri.scheme == 'https')
      request = Net::HTTP::Get.new(uri_path)
      response = http.start{ |h| h.request(request) }
    end
  rescue Exception => err
    @exception = err.message
  else
    if response.is_a?(Net::HTTPSuccess)
      bool = true
    else
      if @follow_redirect
        @warning = response.message
        rlimit = 0

        # Any response code in the 300 range is a redirect
        while response.code.to_i >= 300 && response.code.to_i < 400
          if rlimit >= redirect_limit
            @exception = "Redirect limit exceeded"
            break
          end
          redirect = URI.parse(response['location'])
          redirect = uri + redirect if redirect.relative?
          response = Net::HTTP.get_response(redirect.host, redirect.path, @port)
          rlimit += 1
        end

        if response.is_a?(Net::HTTPSuccess)
          bool = true
        else
          @warning = nil
          @exception ||= response.message
        end
      else
        @exception = response.message
      end
    end
  end

  # There is no duration if the ping failed
  @duration = Time.now - start_time if bool

  bool
end
Also aliased as: ping?, pingecho
ping?(host = @host) click to toggle source
Alias for: ping
pingecho(host = @host) click to toggle source
Alias for: ping

[Validate]

Generated with the Darkfish Rdoc Generator 2.