ncr / rack-proxy

A request/response rewriting HTTP proxy. A Rack app.
MIT License
269 stars 94 forks source link

Can't get this to work #56

Open jxc876 opened 8 years ago

jxc876 commented 8 years ago

I can't get a simple app to work with this, ex: I want to proxy /api to github.api

# app.rb

require 'sinatra'
require 'rack/proxy'

class SimpleProxy < Rack::Proxy

    def perform_request(env)
        request = Rack::Request.new(env)
        puts request.path
        if request.path =~ %r{/api}
            env["HTTP_HOST"] = "https://api.github.com"
            env["REQUEST_PATH"] = "/users/octocat"
            super(env)
        else
            @app.call(env)
        end
    end
end

class MyApp < Sinatra::Application
  use SimpleProxy, {ssl_verify_none: true}

    get '/sinatra' do
      'inside sinatra'
    end
end
# config.ru

require_relative 'app'
run Rack::URLMap.new('/' => MyApp)
rackup -p 3000
GET localhost:3000/api
...
/api
NoMethodError: undefined method `join' for #<String:0x0000000271aed8>
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/show_exceptions.rb:37:in `rescue in call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/show_exceptions.rb:21:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:180:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:2004:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1469:in `block in call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1778:in `synchronize'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:1469:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/urlmap.rb:66:in `block in call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/urlmap.rb:50:in `each'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/urlmap.rb:50:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/tempfile_reaper.rb:15:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/lint.rb:49:in `_call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/lint.rb:37:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/showexceptions.rb:24:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:217:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/chunked.rb:54:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'
127.0.0.1 - - [10/Aug/2016:17:46:00 -0500] "GET /api HTTP/1.1" 500 68585 0.1990
...

Tried moving the use SimpleProxy, {ssl_verify_none: true} to my config.ru but that just resulted in a different error:

SocketError: getaddrinfo: Name or service not known
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:879:in `initialize'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:879:in `open'

        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:879:in `block in connect'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/timeout.rb:74:in `timeout'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:878:in `connect'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:863:in `do_start'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/net/http.rb:858:in `start'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-proxy-0.6.0/lib/rack/http_streaming_response.rb:70:in `session'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-proxy-0.6.0/lib/rack/http_streaming_response.rb:59:in `response'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-proxy-0.6.0/lib/rack/http_streaming_response.rb:29:in `headers'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-proxy-0.6.0/lib/rack/proxy.rb:120:in `perform_request'
        /tmp/proxy/app.rb:12:in `perform_request'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-proxy-0.6.0/lib/rack/proxy.rb:57:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/tempfile_reaper.rb:15:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/lint.rb:49:in `_call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/lint.rb:37:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/showexceptions.rb:24:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/commonlogger.rb:33:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/sinatra-1.4.4/lib/sinatra/base.rb:217:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/chunked.rb:54:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/content_length.rb:15:in `call'
        /tmp/proxy/vendor/bundle/ruby/2.2.0/gems/rack-1.6.4/lib/rack/handler/webrick.rb:88:in `service'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:138:in `service'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/httpserver.rb:94:in `run'
        /home/mike/.rvm/rubies/ruby-2.2.1/lib/ruby/2.2.0/webrick/server.rb:294:in `block in start_thread'

Not sure what I'm doing wrong, I'm expecting:

{
  "login": "octocat",
  "id": 583231,
  "avatar_url": "https://avatars.githubusercontent.com/u/583231?v=3",
  "gravatar_id": "",
  "url": "https://api.github.com/users/octocat",
  "html_url": "https://github.com/octocat",
...

Not sure what I'm doing wrong.