Class: CybersourceryTesting::TranslatingProxy
- Inherits:
-
Rack::TranslatingProxy
- Object
- Rack::TranslatingProxy
- CybersourceryTesting::TranslatingProxy
- Defined in:
- lib/cybersourcery_testing/translating_proxy.rb
Instance Method Summary collapse
-
#_response_mapping ⇒ Object
override parent - we need this refreshed with each request, since the test server port changes.
- #call(env) ⇒ Object
- #check_for_cryptic_cybersource_errors(request) ⇒ Object
-
#initialize(app) ⇒ TranslatingProxy
constructor
A new instance of TranslatingProxy.
- #maybe_use_vcr(env) ⇒ Object
- #proxy?(env) ⇒ Boolean
- #request_mapping ⇒ Object
-
#rewrite_response_body(body) ⇒ Object
override parent.
- #set_referrer(request) ⇒ Object
- #super_call ⇒ Object
- #target_host ⇒ Object
Constructor Details
#initialize(app) ⇒ TranslatingProxy
Returns a new instance of TranslatingProxy.
7 8 9 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 7 def initialize(app) @app = app end |
Instance Method Details
#_response_mapping ⇒ Object
override parent - we need this refreshed with each request, since the test server port changes
93 94 95 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 93 def _response_mapping request_mapping.invert end |
#call(env) ⇒ Object
11 12 13 14 15 16 17 18 19 20 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 11 def call(env) if proxy?(env) request = Rack::Request.new(env) set_referrer(request) check_for_cryptic_cybersource_errors(request) maybe_use_vcr(env) else @app.call(env) end end |
#check_for_cryptic_cybersource_errors(request) ⇒ Object
37 38 39 40 41 42 43 44 45 46 47 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 37 def check_for_cryptic_cybersource_errors(request) request.params.each do |k,v| if v.class != String raise "You are attempting to pass a value that is not a String to Cybersource. This will cause Cybersource to throw a generic server error. You passed: #{k}: #{v.to_s}" end if k == 'signed_field_names' && v.length >= 700 raise "You are attempting to pass a signed_fields value to Cybersource that is 700 characters or greater. This will cause Cybersource to throw a generic server error. You passed: #{k}: #{v}" end end end |
#maybe_use_vcr(env) ⇒ Object
49 50 51 52 53 54 55 56 57 58 59 60 61 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 49 def maybe_use_vcr(env) if ENV['CYBERSOURCERY_USE_VCR_IN_TESTS'] VCR.use_cassette( 'cybersourcery', record: :new_episodes, match_requests_on: CybersourceryTesting::Vcr.match_requests_on ) do super_call(env) end else super_call(env) end end |
#proxy?(env) ⇒ Boolean
22 23 24 25 26 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 22 def proxy?(env) # The browser keeps requesting favicon.ico, which throws errors when the request is forwarded # to the Cybersource server. So ony forward POST requests. env['REQUEST_METHOD'] == 'POST' end |
#request_mapping ⇒ Object
67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 67 def request_mapping mappings = { # our proxy the actual Cybersource test server #ENV['CYBERSOURCERY_SOP_PROXY_URL'] => ENV['CYBERSOURCERY_SOP_TEST_URL'], } if @referrer local_response_url = "#{@referrer.scheme}://#{@referrer.host}:#{@referrer.port}#{ENV['CYBERSOURCERY_LOCAL_RESPONSE_PAGE_PATH']}" # local resp page page where Cybersource redirects mappings[local_response_url] = ENV['CYBERSOURCERY_RESPONSE_PAGE_URL'] end mappings end |
#rewrite_response_body(body) ⇒ Object
override parent
84 85 86 87 88 89 90 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 84 def rewrite_response_body(body) # to_s on an array gives a version that has brackets, escape characters, etc. I don't know why # it worked outside the middleware context (as I didn't have this problem with it before). #str = rewrite_string(body.to_s, _response_mapping) str = rewrite_string(body.first, _response_mapping) rewrite_string(str, _response_mapping, URI.method(:encode_www_form_component)) end |
#set_referrer(request) ⇒ Object
28 29 30 31 32 33 34 35 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 28 def set_referrer(request) # We are making @referrer an instance variable for convenience. We need it since the port of # the test server can change with every test run. Conceptually, http_referrer should be part # of env, but env is not an instance variable. We would have to rewrite multiple method # signatures and a bunch of calls in the parent translating_proxy.rb if we put the referrer in # env (we need it in request_mapping(), which is at the end of a chain of calls). @referrer = request.referrer ? URI(request.referrer) : nil end |
#super_call ⇒ Object
5 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 5 alias :super_call :call |
#target_host ⇒ Object
63 64 65 |
# File 'lib/cybersourcery_testing/translating_proxy.rb', line 63 def target_host ENV['CYBERSOURCERY_SOP_TEST_URL'] end |