lib/blacklight/solr/repository.rb in blacklight-7.22.2 vs lib/blacklight/solr/repository.rb in blacklight-7.23.0
- old
+ new
@@ -56,34 +56,44 @@
# @overload find(params)
# @param [Hash] parameters for RSolr::Client#send_and_receive
# @return [Blacklight::Solr::Response] the solr response object
def send_and_receive(path, solr_params = {})
benchmark("Solr fetch", level: :debug) do
- res = if solr_params[:json].present?
- connection.send_and_receive(
- path,
- data: { params: solr_params.to_hash.except(:json) }.merge(solr_params[:json]).to_json,
- method: :post,
- headers: { 'Content-Type' => 'application/json' }
- )
- else
- key = blacklight_config.http_method == :post ? :data : :params
- connection.send_and_receive(path, { key => solr_params.to_hash, method: blacklight_config.http_method })
- end
-
+ res = connection.send_and_receive(path, build_solr_request(solr_params))
solr_response = blacklight_config.response_model.new(res, solr_params, document_model: blacklight_config.document_model, blacklight_config: blacklight_config)
Blacklight.logger&.debug("Solr query: #{blacklight_config.http_method} #{path} #{solr_params.to_hash.inspect}")
Blacklight.logger&.debug("Solr response: #{solr_response.inspect}") if defined?(::BLACKLIGHT_VERBOSE_LOGGING) && ::BLACKLIGHT_VERBOSE_LOGGING
solr_response
end
+ rescue *defined_rsolr_timeout_exceptions => e
+ raise Blacklight::Exceptions::RepositoryTimeout, "Timeout connecting to Solr instance using #{connection.inspect}: #{e.inspect}"
rescue Errno::ECONNREFUSED => e
+ # intended for and likely to be a RSolr::Error:ConnectionRefused, specifically.
raise Blacklight::Exceptions::ECONNREFUSED, "Unable to connect to Solr instance using #{connection.inspect}: #{e.inspect}"
rescue RSolr::Error::Http => e
raise Blacklight::Exceptions::InvalidRequest, e.message
end
+ # @return [Hash]
+ # @!visibility private
+ def build_solr_request(solr_params)
+ if solr_params[:json].present?
+ {
+ data: { params: solr_params.to_hash.except(:json) }.merge(solr_params[:json]).to_json,
+ method: :post,
+ headers: { 'Content-Type' => 'application/json' }
+ }
+ else
+ key = blacklight_config.http_method == :post ? :data : :params
+ {
+ key => solr_params.to_hash,
+ method: blacklight_config.http_method
+ }
+ end
+ end
+
private
##
# @return [String]
def suggest_handler_path
@@ -94,8 +104,22 @@
blacklight_config.autocomplete_suggester
end
def build_connection
RSolr.connect(connection_config.merge(adapter: connection_config[:http_adapter]))
+ end
+
+ # RSolr 2.4.0+ has a RSolr::Error::Timeout that we'd like to treat specially
+ # instead of lumping into RSolr::Error::Http. Before that we can not rescue
+ # specially, so return an empty array.
+ #
+ # @return [Array<Exception>] that can be used, with a splat, as argument
+ # to a ruby rescue
+ def defined_rsolr_timeout_exceptions
+ if defined?(RSolr::Error::Timeout)
+ [RSolr::Error::Timeout]
+ else
+ []
+ end
end
end
end