Parent

Class/Module Index [+]

Quicksearch

Chef::SolrQuery::SolrHTTPRequest

Public Class Methods

escape(s) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 85
def self.escape(s)
  s.to_s.gsub(/([^ a-zA-Z0-9_.-]+)/) {
    '%'+$1.unpack('H2'*$1.size).join('%').upcase
  }.tr(' ', '+')
end
http_client() click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 42
def self.http_client
  @http_client ||= begin
    uri = URI.parse(solr_url)
    http_client = Net::HTTP.new(uri.host, uri.port)
    http_client.use_ssl = true if uri.port == 443
    http_client
  end
end
new(method, url, headers=nil) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 91
def initialize(method, url, headers=nil)
  args = headers ? [url, headers] : url
  @request = CLASS_FOR_METHOD[method].new(*args)
  yield @request if block_given?
end
select(params={}) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 62
def self.select(params={})
  url = "#{url_prefix}/select?#{url_join(params)}"
  Chef::Log.debug("Sending #{url} to Solr")
  request = new(:GET, url)
  json_response = request.run("Search Query to Solr '#{solr_url}#{url}'")
  Chef::JSONCompat.from_json(json_response)
end
solr_url() click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 38
def self.solr_url
  @solr_url || Chef::Config[:solr_url]
end
solr_url=(solr_url) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 32
def self.solr_url=(solr_url)
  @solr_url = solr_url
  @http_client = nil
  @url_prefix = nil
end
update(doc) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 70
def self.update(doc)
  url = "#{url_prefix}/update"
  Chef::Log.debug("POSTing document to SOLR:\n#{doc}")
  request = new(:POST, url, TEXT_XML) { |req| req.body = doc.to_s }
  request.run("POST to Solr '#{solr_url}#{url}', data: #{doc}")
end
url_join(params_hash={}) click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 77
def self.url_join(params_hash={})
  params = params_hash.inject("") do |param_str, params|
    param_str << "#{params[0]}=#{escape(params[1])}&"
  end
  params.chop! # trailing &
  params
end
url_prefix() click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 51
def self.url_prefix
  @url_prefix ||= begin
    uri = URI.parse(solr_url)
    if uri.path == ""
      "/solr"
    else
      uri.path.gsub(%{/$}, '')
    end
  end
end

Public Instance Methods

http_client() click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 97
def http_client
  self.class.http_client
end
request_failed!(response, description='HTTP call') click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 122
def request_failed!(response, description='HTTP call')
  Chef::Log.fatal("#{description} failed (#{response.class} #{response.code} #{response.message})")
  response.error!
rescue Timeout::Error, Errno::EINVAL, EOFError, Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError, Net::ProtocolError, Errno::ECONNREFUSED, Errno::ECONNRESET, Errno::ETIMEDOUT => e
  Chef::Log.debug(e.backtrace.join("\n"))
  raise Chef::Exceptions::SolrConnectionError, "#{e.class.name}: #{e.to_s}"
end
run(description="HTTP Request to Solr") click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 105
def run(description="HTTP Request to Solr")
  response = http_client.request(@request)
  request_failed!(response, description) unless response.kind_of?(Net::HTTPSuccess)
  response.body
rescue NoMethodError => e
  # http://redmine.ruby-lang.org/issues/show/2708
  # http://redmine.ruby-lang.org/issues/show/2758
  if e.to_s =~ /#{Regexp.escape(%q|undefined method 'closed?' for nil:NilClass|)}/
    Chef::Log.fatal("#{description} failed.  Chef::Exceptions::SolrConnectionError exception: Errno::ECONNREFUSED (net/http undefined method closed?) attempting to contact #{solr_url}")
    Chef::Log.debug("Rescued error in http connect, treating it as Errno::ECONNREFUSED to hide bug in net/http")
    Chef::Log.debug(e.backtrace.join("\n"))
    raise Chef::Exceptions::SolrConnectionError, "Errno::ECONNREFUSED: Connection refused attempting to contact #{solr_url}"
  else
    raise
  end
end
solr_url() click to toggle source
# File lib/chef/solr_query/solr_http_request.rb, line 101
def solr_url
  self.class.solr_url
end

[Validate]

Generated with the Darkfish Rdoc Generator 2.