rack-proxy
rack-proxy copied to clipboard
Can't get this to work
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.