module JSONModel::HTTP

Public Class Methods

backend_url() click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 105
def self.backend_url
  if Module.const_defined?(:BACKEND_SERVICE_URL)
    BACKEND_SERVICE_URL
  else
    JSONModel::init_args[:url]
  end
end
current_backend_session() click to toggle source

Returns the session token to be sent to the backend when making requests.

# File lib/aspace_client/jsonmodel_client.rb, line 188
def self.current_backend_session
  # Set by the ApplicationController
  Thread.current[:backend_session]
end
current_backend_session=(val) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 194
def self.current_backend_session=(val)
  Thread.current[:backend_session] = val
end
delete_request(url) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 264
def self.delete_request(url)
  req = Net::HTTP::Delete.new(url.request_uri)

  do_http_request(url, req)
end
do_http_request(url, req, &block) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 215
def self.do_http_request(url, req, &block)
  req['X-ArchivesSpace-Session'] = current_backend_session

  if high_priority?
    req['X-ArchivesSpace-Priority'] = "high"
  end

  response = http_conn.request(url, req, &block)

  if response.code =~ /^4/
    JSONModel::handle_error(ASUtils.json_parse(response.body))
  end
  
  response
end
form_urlencoded(uri, params) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 121
def self.form_urlencoded(uri, params)
  request = Net::HTTP::Post.new(uri)
  request.form_data = params
  request
end
get_json(uri, params = {}) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 172
def self.get_json(uri, params = {})
  uri = URI("#{backend_url}#{uri}")
  uri.query = URI.encode_www_form(params)

  response = get_response(uri)

  if response.is_a?(Net::HTTPSuccess) || response.status == 200
    ASUtils.json_parse(response.body)
  else
    nil
  end
end
get_response(url) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 271
def self.get_response(url)
  req = Net::HTTP::Get.new(url.request_uri)

  do_http_request(url, req)
end
high_priority?() click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 199
def self.high_priority?
  if Thread.current[:request_priority]
    Thread.current[:request_priority] == :high
  else
    JSONModel::init_args[:priority] == :high
  end
end
http_conn() click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 208
def self.http_conn
  @http ||= Net::HTTP::Persistent.new 'jsonmodel_client'
  @http.read_timeout = 1200
  @http
end
multipart_request(uri, params) click to toggle source

We override this in the backend’s spec_helper since Rack::Test::Methods doesn’t support multipart requests.

# File lib/aspace_client/jsonmodel_client.rb, line 116
def self.multipart_request(uri, params)
  Net::HTTP::Post::Multipart.new(uri, params)
end
post_form(uri, params = {}, encoding = :x_www_form_urlencoded) click to toggle source

Perform a HTTP POST request against the backend with form parameters

‘encoding’ is either :x_www_form_urlencoded or :multipart_form_data. The latter is useful if you’re providing a file upload.

# File lib/aspace_client/jsonmodel_client.rb, line 132
def self.post_form(uri, params = {}, encoding = :x_www_form_urlencoded)
  url = URI("#{backend_url}#{uri}")

  req = if encoding == :x_www_form_urlencoded
          self.form_urlencoded(url.request_uri, params)
        elsif encoding == :multipart_form_data
          self.multipart_request(url.request_uri, params)
        else
          raise "Unknown form encoding: #{encoding.inspect}"
        end

  do_http_request(url, req)
end
post_json(url, json) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 243
def self.post_json(url, json)
  req = Net::HTTP::Post.new(url.request_uri)
  req['Content-Type'] = 'text/json'
  req.body = json

  do_http_request(url, req)
end
post_json_file(url, path, &block) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 252
def self.post_json_file(url, path, &block)
  File.open(path) do |fh|
    req = Net::HTTP::Post.new(url.request_uri)
    req['Content-Type'] = 'text/json'
    req['Content-Length'] = File.size(path)
    req.body_stream = fh

    do_http_request(url, req, &block)
  end
end
stream(uri, params = {}, &block) click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 147
def self.stream(uri, params = {}, &block)
  uri = URI("#{backend_url}#{uri}")
  uri.query = URI.encode_www_form(params)

  req = Net::HTTP::Get.new(uri.request_uri)

  req['X-ArchivesSpace-Session'] = current_backend_session

  if high_priority?
    req['X-ArchivesSpace-Priority'] = "high"
  end

  Net::HTTP.start(uri.host, uri.port) do |http|
    http.request(req, nil) do |response|
      if response.code =~ /^4/
        JSONModel::handle_error(ASUtils.json_parse(response.body))
        raise response.body
      end

      block.call(response)
    end
  end
end
with_request_priority(priority) { || ... } click to toggle source
# File lib/aspace_client/jsonmodel_client.rb, line 232
def self.with_request_priority(priority)
  old = Thread.current[:request_priority]
  Thread.current[:request_priority] = priority
  begin
    yield
  ensure
    Thread.current[:request_priority] = old
  end
end