# RackTest assumes all requests to be local.
# Braintree requests need to go out to a different server though.
# So we use a middleware to catch these and send them out again.

class BraintreeTestApp
  def initialize(app)
    @app = app
  end

  def call(env)
    @env = env
    config = Braintree::Configuration.instantiate
    if request.path =~ /\/merchants\/#{config.merchant_id}\/transparent_redirect_requests$/
      #proxy post to braintree
      uri = URI.parse(config.protocol + "://" + config.server + ":" +
        config.port.to_s + request.path)
      http = Net::HTTP.new(uri.host, uri.port)
      res = http.post(uri.path, request.body.read)

      if res.code == "303"
        header_hash = res.header.to_hash
        header_hash["location"].first.gsub!("http://localhost:3000/", "http://www.example.com/")
        [303, {"location" => header_hash["location"].first}, ""]
      else
        raise "unexpected response from Braintree: expected a 303"
      end
    else
      @app.call(env)
    end
  end

  def request
    @request = Rack::Request.new(@env)
  end
end