class TShield::RequestVCR

Module to write and read saved responses

Attributes

vcr_response[R]

Public Class Methods

new(path, options = {}) click to toggle source
Calls superclass method TShield::Request::new
# File lib/tshield/request_vcr.rb, line 19
def initialize(path, options = {})
  super()
  @path = path
  @options = options

  request_configuration = configuration.request
  @options[:timeout] = request_configuration['timeout']
  @options[:verify] = request_configuration['verify_ssl']
  request
end

Public Instance Methods

request() click to toggle source
# File lib/tshield/request_vcr.rb, line 30
def request
  raw_query = @options[:raw_query]
  @path = "#{@path}?#{raw_query}" unless !raw_query || raw_query.empty?

  @url = "#{domain}#{@path}"

  configuration.get_before_filters(domain).each do |filter|
    _method, @url, @options = filter.new.filter(method, @url, @options)
  end

  in_session = find_in_sessions
  if in_session
    # TODO: create concept of global session in vcr
    in_session = nil if in_session == 'global'
    @vcr_response = response(in_session)
    @vcr_response.original = false
  else
    TShield.logger.info("calling original service for request with options #{@options}")
    raw = HTTParty.send(method.to_s, @url, @options)

    original_response = save(raw)
    original_response.original = true
    @vcr_response = original_response
  end

  configuration.get_after_filters(domain).each do |filter|
    @vcr_response = filter.new.filter(@vcr_response)
  end
end
response(session) click to toggle source
# File lib/tshield/request_vcr.rb, line 60
def response(session)
  response_content = saved_content(session)
  TShield::Response.new(response_content['body'],
                        response_content['headers'] || [],
                        response_content['status'] || 200)
end

Private Instance Methods

domain() click to toggle source
# File lib/tshield/request_vcr.rb, line 69
def domain
  @domain ||= configuration.get_domain_for(@path)
end
encode_for_windows_dir(directory) click to toggle source
# File lib/tshield/request_vcr.rb, line 158
def encode_for_windows_dir(directory)
  replace = [['<','%3c'],['>','%3e'],[':','%3a'],['"','%22'],['?','%3f'],[' ','%20'],['*','%2a'],['/','%2f']]
  replace.each do |value|
    directory = directory.gsub(value.first,value.last)
  end
  directory
end
file_exists(session) click to toggle source
# File lib/tshield/request_vcr.rb, line 123
def file_exists(session)
  File.exist?(content_destiny(session))
end
find_in_sessions() click to toggle source
# File lib/tshield/request_vcr.rb, line 127
def find_in_sessions
  in_session = nil

  ([@options[:session]] + (@options[:secondary_sessions] || [])).each do |session|
    if file_exists(session) && configuration.cache_request?(domain)
      in_session = (session || 'global')
      break
    end
    TShield.logger.info("saved response not found in #{session}")
  end
  in_session
end
key() click to toggle source
# File lib/tshield/request_vcr.rb, line 140
def key
  @key ||= Digest::SHA1.hexdigest "#{@url}|#{method}"
end
method() click to toggle source
# File lib/tshield/request_vcr.rb, line 77
def method
  @method ||= @options[:method].downcase
end
name() click to toggle source
# File lib/tshield/request_vcr.rb, line 73
def name
  @name ||= configuration.get_name(domain)
end
safe_dir(url) click to toggle source
# File lib/tshield/request_vcr.rb, line 166
def safe_dir(url)
  if url.size > 225
    path = url.gsub(/(\?.*)/, '')
    params = Digest::SHA1.hexdigest Regexp.last_match(1)
    directory = "#{path.gsub(%r{/}, '-').gsub(/^-/, '')}?#{params}"
  else
    directory = url.gsub(%r{/}, '-').gsub(/^-/, '')
  end
    configuration.windows_compatibility? ? encode_for_windows_dir(directory) : directory
end
save(raw_response) click to toggle source
# File lib/tshield/request_vcr.rb, line 96
def save(raw_response)
  headers = {}

  raw_response.headers.each do |k, v|
    next if k == 'set-cookie'
    headers[k] = v unless configuration.not_save_headers(domain).include? k
  end

  headers = apply_set_cookie_header_values(raw_response, headers)

  content = {
    body: raw_response.body,
    status: raw_response.code,
    headers: headers
  }

  write(content)

  TShield::Response.new(raw_response.body, headers, raw_response.code)
end
saved_content(session) click to toggle source
# File lib/tshield/request_vcr.rb, line 117
def saved_content(session)
  content = JSON.parse(File.open(headers_destiny(session)).read)
  content['body'] = File.open(content_destiny(session)).read unless content['body']
  content
end
write(content) click to toggle source
# File lib/tshield/request_vcr.rb, line 144
def write(content)
  content_file = File.open(content_destiny, 'w')
  content_file.write(content[:body])
  content_file.close

  body = content.delete :body

  headers_file = File.open(headers_destiny, 'w')
  headers_file.write(JSON.pretty_generate(content))
  headers_file.close

  content[:body] = body
end