https://github.com/ncr/rack-proxy
A request/response rewriting HTTP proxy. A Rack app.
https://github.com/ncr/rack-proxy
Keywords from Contributors
crash-reporting activerecord rubygems activejob mvc sidekiq background-jobs rack jobs error-monitoring
Last synced: about 1 hour ago
JSON representation
Repository metadata
A request/response rewriting HTTP proxy. A Rack app.
- Host: GitHub
- URL: https://github.com/ncr/rack-proxy
- Owner: ncr
- License: mit
- Created: 2010-01-07T10:53:34.000Z (over 16 years ago)
- Default Branch: master
- Last Pushed: 2026-09-16T10:21:32.000Z (9 days ago)
- Last Synced: 2026-09-17T20:35:52.564Z (8 days ago)
- Language: Ruby
- Homepage:
- Size: 534 KB
- Stars: 285
- Watchers: 4
- Forks: 100
- Open Issues: 0
- Releases: 5
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Contributing: CONTRIBUTING.md
- Funding: .github/FUNDING.yml
- License: LICENSE
- Security: SECURITY.md
- Agents: AGENTS.md
- Claude: CLAUDE.md
README.md
Rack::Proxy
A request/response rewriting HTTP proxy for Rack. Run it standalone as a tiny reverse proxy, or mount it as middleware and subclass it to rewrite requests and responses in flight.
- Streams by default — response bodies are relayed chunk by chunk straight off the backend socket, so large responses never buffer in memory.
- Safe by default — TLS verification on (
VERIFY_PEER), Host-derived backends refused unless explicitly opted in, hop-by-hop headers stripped in both directions, backend failures mapped to502instead of raising. - Small — two files on top of plain
Net::HTTP; the only runtime dependency is Rack.
Typical uses:
- an authenticating/authorizing gateway in front of a trusting internal backend
- serving another app from the same origin to avoid CORS complications
- subdomain- or path-based routing to multiple internal services
- redirecting awkward legacy paths (e.g.
.phppages) to another app - inserting or stripping headers that are required — or problematic — for certain clients
Contents
- Installation
- Quick start
- How it works
- Options
- Security considerations
- Recipes
- Upgrading
- Header keys and underscores
- Compatibility notes
- Development
Installation
Requires Ruby >= 3.0 and Rack 2.x or 3.x. Add to your Gemfile:
gem "rack-proxy", "~> 2.0"
Quick start
A standalone reverse proxy is one line of config.ru:
require "rack-proxy"
run Rack::Proxy.new(backend: "http://localhost:8080")
As middleware, subclass it and decide per request: call super to proxy, or hand the request to the rest of your app:
class ApiProxy < Rack::Proxy
def perform_request(env)
if env["PATH_INFO"].start_with?("/api/")
env["HTTP_HOST"] = "api.internal.example" # most backends route on Host
super
else
@app.call(env)
end
end
end
# Rails (config/initializers/proxy.rb):
Rails.application.config.middleware.use ApiProxy, backend: "https://api.internal.example"
# Any Rack app (config.ru or Sinatra):
use ApiProxy, backend: "https://api.internal.example"
How it works
Every request runs through a three-step pipeline:
call(env) → rewrite_env(env) → perform_request(env) → rewrite_response([status, headers, body])
Override the steps you need:
rewrite_env(env)— modify the request before it is forwarded (HTTP_HOST, path, headers, …). Return the env.rewrite_response(triplet)— post-process the backend's[status, headers, body]. Return the triplet. If you change the body, delete or recalculateContent-Length(headers["content-length"] = nil) or clients may receive truncated responses.perform_request(env)— take over routing:superproxies the request,@app.call(env)passes it through to the wrapped app (middleware mode).backend_allowed?(backend)— per-request allowlist hook, consulted for every request; returnfalseto refuse with502. See Security considerations.
Two request-scoped overrides can also be set in env (e.g. from rewrite_env):
env["rack.backend"]— a URI (or URI-parseable string) overriding:backendfor this request.env["http.read_timeout"]— override:read_timeoutfor this request.
Options
Pass options when instantiating (Rack::Proxy.new(backend: ...)) or mounting middleware (use ApiProxy, backend: ...).
Routing and mode
:backend— URI (or URI-parseable string) of the backend host/port/scheme to proxy to. If not set, the destination is derived from the incoming request'sHost— which is refused by default since 1.0; see:allow_dynamic_backend.:allow_dynamic_backend— opt in (true) to deriving the destination from the client-suppliedHostheader when no:backendis configured. Off by default (such requests get502), because a bare dynamic proxy is an open proxy. Combine with abackend_allowed?allowlist.:streaming— stream the backend response as it arrives (defaulttrue). Set tofalseto buffer the whole response before returning it (also recommended underwebmock/vcr— see Compatibility notes).
TLS
:ssl_verify_none— skip TLS certificate verification. Verification is on by default (VERIFY_PEER) — see Upgrading.:verify_mode— explicitOpenSSL::SSL::VERIFY_*constant; wins overssl_verify_none.:ca_file— path to a PEM CA bundle used to verify the backend certificate (prefer this over disabling verification for private CAs).:cert_store— anOpenSSL::X509::Storeused to verify the backend certificate.:cert/:key— client certificate and key for mutual TLS to the backend.:min_version/:max_version— TLS protocol range (e.g.:TLS1_2), mapped toNet::HTTP#min_version=/#max_version=.:ssl_version— deprecated; pins an exact protocol (forbids TLS 1.3). Use:min_version/:max_version.
Timeouts and limits
:read_timeout— per-read timeout in seconds (default60).:open_timeout— connection-open timeout in seconds.:write_timeout— per-write timeout in seconds.:max_response_length— cap (in bytes) on the backend response body. Oversized declared lengths are refused before reading the body, and each chunk is checked before buffering or forwarding it. Non-streaming responses return502on overflow; streaming responses abort if overflow is discovered after sending the headers. HEAD/304 representation lengths do not count as body bytes.
Request shaping
:username/:password— HTTP Basic credentials sent to the backend.:strip_credentials— whentrue, drop the client'sCookieandAuthorizationheaders instead of forwarding them — see Security considerations. The strip applies afterrewrite_env, so a credential injected there is stripped too; attach a proxy-owned credential with:username/:passwordinstead.:replace_x_forwarded_for— whentrue, discard the client-suppliedX-Forwarded-Forchain and forward only this hop'sREMOTE_ADDR(default appends to the chain) — see Security considerations.
Debugging
:logger— any object responding to#<<(e.g.$stdout, aStringIO, or a RubyLogger). Wired toNet::HTTP#set_debug_outputso the HTTP wire-level conversation is written to the sink.
Security considerations
rack-proxy forwards attacker-influenced requests to a backend and relays the backend's response. Configure and subclass it with that in mind.
-
SSRF / open proxy — safe by default since 1.0. If you do not set
:backend, the destination host/port/scheme would be derived from the incoming request'sHost/X-Forwarded-Hostheader — meaning a client could steer the proxy at any host, including cloud metadata endpoints (169.254.169.254), loopback, and private ranges. Such requests are now refused with502unless you passallow_dynamic_backend: true. When you do opt in, pin an allowlist on top by overridingbackend_allowed?(backend)(consulted for every request, static backends included):class MyProxy < Rack::Proxy ALLOWED = %w[api.internal.example.com].freeze def backend_allowed?(backend) ALLOWED.include?(backend.host) end end MyProxy.new(allow_dynamic_backend: true)A refused backend is answered with
502(with a hint in the:loggeroutput). -
Credential forwarding. All incoming
HTTP_*headers are forwarded, includingAuthorizationandCookie. Don't proxy to a different trust domain with credentials attached — passstrip_credentials: trueto drop both (or do finer-grained filtering inrewrite_env). Over anhttp://backend these travel in cleartext. -
X-Forwarded-For. rack-proxy appends
REMOTE_ADDRto any inboundX-Forwarded-For. If your clients are not behind a trusted proxy, the inbound value is attacker-controlled; passreplace_x_forwarded_for: trueto forward only the directly-connected peer's address when the backend trusts that header. -
TLS verification defaults to
VERIFY_PEER. For private-CA backends use:ca_file/:cert_storerather thanssl_verify_none: true. -
Resource limits. Use
:max_response_lengthplus:open_timeout/:write_timeout/:read_timeoutto bound memory and stalls against a hostile or slow backend. -
Hop-by-hop headers (Connection, TE, Transfer-Encoding, Proxy-Authorization, …) are stripped from both the forwarded request and the response.
To report a vulnerability, see SECURITY.md.
Recipes
The snippets below (also in examples/ in the repository) are meant to be copied into your app — e.g. into app/middleware/ or lib/ — and adapted. They are not shipped in the gem and cannot be required from it.
Rewrite the Host and add a response header
From examples/forward_host.rb:
class ForwardHost < Rack::Proxy
def rewrite_env(env)
env["HTTP_HOST"] = "example.com"
env
end
def rewrite_response(triplet)
_, headers, _ = triplet
# example of inserting an additional header
headers["X-Foo"] = "Bar"
# if you rewrite env, it appears that content-length isn't calculated correctly
# resulting in only partial responses being sent to users
# you can remove it or recalculate it here
headers["content-length"] = nil
triplet
end
end
# config/initializers/proxy.rb
Rails.application.config.middleware.use ForwardHost, backend: "http://example.com"
Proxy to a backend with a self-signed certificate
From examples/trusting_proxy.rb:
class TrustingProxy < Rack::Proxy
def rewrite_env(env)
env["HTTP_HOST"] = "self-signed.badssl.com"
env
end
def rewrite_response(triplet)
_, headers, _ = triplet
# if you rewrite env, it appears that content-length isn't calculated correctly
# resulting in only partial responses being sent to users
# you can remove it or recalculate it here
headers["content-length"] = nil
triplet
end
end
# Mount it with an explicit backend (dynamic Host-derived backends are refused
# by default since 1.0). Pass ssl_verify_none: true to skip TLS verification.
Rails.application.config.middleware.use TrustingProxy,
backend: "https://self-signed.badssl.com",
ssl_verify_none: true
For a backend signed by a private CA, prefer ca_file: "/path/to/ca.pem" over disabling verification.
Mount an external service under a path (Rails)
From examples/example_service_proxy.rb:
###
# This is an example of how to use Rack-Proxy in a Rails application.
#
# Setup:
# 1. rails new test_app
# 2. cd test_app
# 3. install Rack-Proxy in `Gemfile`
# a. `gem 'rack-proxy', '~> 2.0'`
# 4. install gem: `bundle install`
# 5. copy the class into your app and mount it from `config/initializers/proxy.rb`
# 6. run: `SERVICE_URL=http://guides.rubyonrails.org rails server`
# 7. open in browser: `http://localhost:3000/example_service`
#
###
ENV["SERVICE_URL"] ||= "http://guides.rubyonrails.org"
class ExampleServiceProxy < Rack::Proxy
def perform_request(env)
request = Rack::Request.new(env)
# use rack proxy for anything hitting our host app at /example_service
if %r{^/example_service}.match?(request.path)
backend = URI(ENV["SERVICE_URL"])
# most backends required host set properly, but rack-proxy doesn't set this for you automatically
# even when a backend host is passed in via the options
env["HTTP_HOST"] = backend.host
# This is the only path that needs to be set currently on Rails 5 & greater
env["PATH_INFO"] = ENV["SERVICE_PATH"] || "/configuring.html"
# don't send your sites cookies to target service, unless it is a trusted internal service that can parse all your cookies
env["HTTP_COOKIE"] = ""
super
else
@app.call(env)
end
end
end
Proxy only matching requests (e.g. .php) as middleware
From examples/rack_php_proxy.rb:
###
# Open http://localhost:3000/test.php to trigger proxy
###
class RackPhpProxy < Rack::Proxy
def perform_request(env)
request = Rack::Request.new(env)
if %r{\.php}.match?(request.path)
env["HTTP_HOST"] = ENV["HTTP_HOST"] ? URI(ENV["HTTP_HOST"]).host : "localhost"
ENV["PHP_PATH"] ||= "/manual/en/tutorial.firstpage.php"
# Rails 3 & 4
env["REQUEST_PATH"] = ENV["PHP_PATH"] || "/php/#{request.fullpath}"
# Rails 5 and above
env["PATH_INFO"] = ENV["PHP_PATH"] || "/php/#{request.fullpath}"
env["content-length"] = nil
super
else
@app.call(env)
end
end
def rewrite_response(triplet)
_, headers, _ = triplet
# if you proxy depending on the backend, it appears that content-length isn't calculated correctly
# resulting in only partial responses being sent to users
# you can remove it or recalculate it here
headers["content-length"] = nil
triplet
end
end
Mount it in Rails (config/application.rb):
config.middleware.use RackPhpProxy, backend: "http://php.net"
or in Sinatra / any Rack app:
class MyAwesomeSinatra < Sinatra::Base
use RackPhpProxy, backend: "http://php.net"
end
Requests matching the condition are proxied; everything else runs through your application as usual. See the tests for more examples.
Local TLS-terminating proxy
Useful when an external integration (OAuth callbacks, webhooks) insists on talking HTTPS to your dev machine: terminate TLS locally and forward the decrypted traffic to your app running on plain HTTP.
# config.ru
require "rack-proxy"
class ForwardProto < Rack::Proxy
def rewrite_env(env)
env["HTTP_X_FORWARDED_HOST"] = env["SERVER_NAME"]
env["HTTP_X_FORWARDED_PROTO"] = env["rack.url_scheme"]
env
end
end
run ForwardProto.new(backend: "http://localhost:8080")
Generate a key/certificate pair for your dev hostname and serve the proxy over TLS, e.g. with puma:
puma -b 'ssl://0.0.0.0:9292?key=keys/domain.key&cert=keys/domain.crt' config.ru
Point the dev hostname at yourself (127.0.0.1 debug.your_app.com in /etc/hosts), and make sure your app honors X-Forwarded-Host / X-Forwarded-Proto from this trusted hop (e.g. server.forward-headers-strategy: framework in Spring Boot, or Rails' default config.action_dispatch handling).
Client TLS certificates (mutual TLS)
When a third-party API authenticates clients with TLS certificates, terminate the client's request and re-sign the outgoing connection:
# config.ru
cert = OpenSSL::X509::Certificate.new(File.read("./certs/client.crt"))
key = OpenSSL::PKey.read(File.read("./certs/key.pem"))
use TLSProxy, backend: "https://client-tls-auth-api.com",
cert: cert, key: key, min_version: :TLS1_2
# tls_proxy.rb
class TLSProxy < Rack::Proxy
def rewrite_env(env)
env["HTTP_HOST"] = "client-tls-auth-api.com:443"
env
end
end
Upgrading
1.x → 2.0.0
2.0.0 hardens HTTP framing and response limits. Ruby and Rack requirements are unchanged.
- Automatic transport retries are disabled in both modes. Non-streaming requests previously inherited Net::HTTP's retry behavior. If your application needs retries, use an explicit policy that considers whether the operation is safe to replay and provides a fresh request body for each attempt.
- Response hooks follow Rack's types. Statuses are integers in both modes. On Rack 3, repeated headers such as
Set-Cookieare arrays of strings; update hooks that split these values on newlines. Rack 2 still uses newline-separated strings. - Framing errors fail explicitly. Malformed request lengths and incomplete uploads return
400. Ambiguous backend framing returns502. A truncated backend body returns502before headers are sent, or raises during streaming so the server aborts the transfer. Uploads withoutCONTENT_LENGTHare forwarded with chunked encoding; backends must support HTTP/1.1 chunked requests. - Response limits apply before buffering.
max_response_lengthnow bounds non-streaming accumulation. HEAD and 304 representation lengths do not count toward the body cap.
Update your Gemfile to gem "rack-proxy", "~> 2.0" and run bundle update rack-proxy. Existing explicit backend and TLS options continue to work.
0.8.x → 1.0.0
1.0.0 is a breaking release; the full list is in CHANGELOG.md. The changes most likely to need action:
Host-derived backends now require an explicit opt-in. If you rely on the destination being derived from the request's Host header (no :backend option — this includes every subclass that routes by rewriting env["HTTP_HOST"]), such requests now return 502. Restore the behavior explicitly, ideally with an allowlist:
class MyProxy < Rack::Proxy
def backend_allowed?(backend)
%w[api.internal.example.com].include?(backend.host)
end
end
MyProxy.new(allow_dynamic_backend: true)
Deployments with a fixed :backend (or that set env["rack.backend"] in rewrite_env) need no change.
Backend failures return 502 instead of raising. If you rescued OpenSSL::SSL::SSLError, Errno::ECONNREFUSED, timeouts, etc. around the proxy, inspect the response status instead. Malformed request URIs map to 400 and unknown HTTP methods to 501.
require "rack_proxy_examples/..." is gone. The examples are copy-paste snippets in examples/ now — copy the class into your app and mount it yourself.
net_http_hacked is gone. The library streams via the public Net::HTTP API; if external code called begin_request_hacked/end_request_hacked, vendor the old file from a 0.8.x release and plan a migration.
Other behavior changes to be aware of: hop-by-hop request headers (including Proxy-Authorization) are no longer forwarded; gzip bodies are forwarded still-compressed in streaming: false mode (inflate in rewrite_response if you inspect body text); body-less POST/PUT sends Content-Length: 0; Ruby >= 3.0 and Rack 2.x–3.x are required.
0.7.x → 0.8.0
TLS certificate verification is now on by default. Prior versions silently used OpenSSL::SSL::VERIFY_NONE whenever the backend was HTTPS, which disabled certificate checks. 0.8.0 defaults to VERIFY_PEER to match Ruby's Net::HTTP.
If you proxy to a backend with a self-signed or otherwise untrusted certificate, you'll now get an OpenSSL::SSL::SSLError unless you opt out explicitly:
Rack::Proxy.new(ssl_verify_none: true) # or
Rack::Proxy.new(verify_mode: OpenSSL::SSL::VERIFY_NONE)
For internal services with a private CA, prefer setting ca_file/cert_store over disabling verification altogether.
Header keys and underscores
Per the standard Rack/CGI convention, header names received by your proxy are exposed in the env with underscores (HTTP_X_CUSTOM_HEADER), and rack-proxy rewrites them with dashes (X-Custom-Header) when forwarding. This conversion is lossy: by the time a request reaches rack-proxy, the upstream web server (nginx, Apache, Caddy, Puma) has already collapsed both X-Custom-Header and X_Custom_Header into the same env key, and rack-proxy cannot recover the original spelling (see #96).
If you need underscore-style headers preserved end-to-end, configure your fronting web server (e.g. underscores_in_headers on; in nginx, or HTTPProtocolOptions in Apache) — rack-proxy is not the right layer to fix this.
Compatibility notes
The streaming response path (the default) streams straight off the backend socket via Net::HTTP. Historically it relied on private net/http internals and did not work at all under webmock, vcr, or fakeweb; it now uses only the public Net::HTTP#request API, but those libraries still replace the real network layer, so behavior under them is not guaranteed. In tests that stub HTTP, prefer streaming: false.
Development
bundle install
bundle exec rake test # full suite, fully offline, ~2-3s
LIVE=1 bundle exec rake test # additionally runs real-internet smoke tests
bundle exec standardrb # style check (CI-blocking)
Bug reports and pull requests are welcome — see CONTRIBUTING.md for the workflow and CLAUDE.md for the invariants every change must preserve. Release history lives in CHANGELOG.md.
License
Released under the MIT License.
Owner metadata
- Name: Jacek Becela
- Login: ncr
- Email:
- Kind: user
- Description:
- Website: http://trixbrix.eu
- Location: Poland
- Twitter:
- Company: @trixbrix
- Icon url: https://avatars.githubusercontent.com/u/5796?v=4
- Repositories: 42
- Last ynced at: 2023-04-09T21:57:37.735Z
- Profile URL: https://github.com/ncr
GitHub Events
Total
- Create event: 5
- Fork event: 3
- Issue comment event: 1
- Issues event: 3
- Pull request event: 2
- Push event: 2
- Watch event: 4
Last Year
- Create event: 5
- Fork event: 1
- Issue comment event: 1
- Pull request event: 2
- Push event: 2
- Watch event: 3
Committers metadata
Last synced: about 20 hours ago
Total Commits: 204
Total Committers: 54
Avg Commits per committer: 3.778
Development Distribution Score (DDS): 0.446
Commits in past year: 46
Committers in past year: 4
Avg Commits per committer in past year: 11.5
Development Distribution Score (DDS) in past year: 0.13
| Name | Commits | |
|---|---|---|
| Jacek Becela | j****a@g****m | 113 |
| Rada Bogdan Raul | r****e@y****m | 10 |
| dependabot[bot] | 4****] | 8 |
| André Laszlo | l****o@k****o | 5 |
| Andrey Dolgikh | l****r@y****u | 5 |
| Ben Marchant | b****t@h****m | 4 |
| Whitney Young | w****g@f****m | 3 |
| Rick Fletcher | f****h@p****m | 3 |
| Vladimir Temnikov | v****v@a****m | 2 |
| Olle Jonsson | o****n@g****m | 2 |
| Nicholas Hemsley | n****s@g****m | 2 |
| Jake Worth | j****e@j****m | 2 |
| Mikdiet | m****t@g****m | 2 |
| sbopr | s****t@x****m | 2 |
| Danny Guinther | d****y@b****m | 2 |
| Tim Case | t****m@2****t | 1 |
| Steve Hull | s****e@t****m | 1 |
| Raul E Rangel | R****l@d****m | 1 |
| Matt Colyer | m****t@s****m | 1 |
| Exoth | y****o@a****u | 1 |
| Dan Mayer | d****r@o****m | 1 |
| Bevan Loon | b****n@d****k | 1 |
| sandip mondal | s****5@y****n | 1 |
| Beth Skurrie | b****h@b****m | 1 |
| Bill Abresch | b****h@a****m | 1 |
| Filippos Vasilakis | v****l@g****m | 1 |
| Geoff Longman | g****n@g****m | 1 |
| John Bachir | j****b | 1 |
| rssdev10 | r****0@g****m | 1 |
| pex | r****t@f****t | 1 |
| and 24 more... | ||
Committer domains:
- janraasch.com: 1
- jaredbeck.com: 1
- javan.us: 1
- pohorecki.pl: 1
- krh.me: 1
- aboutsource.net: 1
- talbott.ws: 1
- mac.com: 1
- planetargon.com: 1
- sequra.es: 1
- newrelic.com: 1
- farbenmeer.net: 1
- adaptly.com: 1
- bethesque.com: 1
- yahoo.co.in: 1
- digital.cabinet-office.gov.uk: 1
- offgrid-electric.com: 1
- aviasales.ru: 1
- smallbatchinc.com: 1
- disney.com: 1
- taskrabbit.com: 1
- 2drops.net: 1
- backupify.com: 1
- xbridge.com: 1
- jakeworth.com: 1
- activeplatform.com: 1
- pobox.com: 1
- fadingred.com: 1
- yandex.ru: 1
- kisi.io: 1
Issue and Pull Request metadata
Last synced: 1 day ago
Total issues: 40
Total pull requests: 83
Average time to close issues: over 1 year
Average time to close pull requests: 5 months
Total issue authors: 37
Total pull request authors: 51
Average comments per issue: 1.73
Average comments per pull request: 1.22
Merged pull request: 70
Bot issues: 0
Bot pull requests: 14
Past year issues: 0
Past year pull requests: 19
Past year average time to close issues: N/A
Past year average time to close pull requests: about 4 hours
Past year issue authors: 0
Past year pull request authors: 4
Past year average comments per issue: 0
Past year average comments per pull request: 0.42
Past year merged pull request: 19
Past year bot issues: 0
Past year bot pull requests: 4
Top Issue Authors
- jp (2)
- nhemsley (2)
- ioquatix (2)
- tleish (1)
- ndbroadbent (1)
- pravi (1)
- shomid (1)
- amitfriedman12 (1)
- rahulbir (1)
- jonleighton (1)
- glongman (1)
- timwis (1)
- Silex (1)
- vladimirtemnikov (1)
- jjb (1)
Top Pull Request Authors
- dependabot[bot] (14)
- ncr (13)
- nhemsley (4)
- mikdiet (2)
- olleolleolle (2)
- binaryseed (2)
- rfletcher (2)
- bmarchant (1)
- danmayer (1)
- glongman (1)
- vasilakisfil (1)
- jjb (1)
- kaspergrubbe (1)
- voikya (1)
- psyho (1)
Top Issue Labels
- help needed (2)
Top Pull Request Labels
- dependencies (14)
- ruby (3)
- github_actions (1)
Package metadata
- Total packages: 9
-
Total downloads:
- rubygems: 359,573,276 total
- Total docker downloads: 1,109,225,848
- Total dependent packages: 48 (may contain duplicates)
- Total dependent repositories: 124,808 (may contain duplicates)
- Total versions: 166
- Total maintainers: 1
gem.coop: rack-proxy
A Rack app that provides request/response rewriting proxy capabilities with streaming.
- Homepage: https://github.com/ncr/rack-proxy
- Documentation: http://www.rubydoc.info/gems/rack-proxy/
- Licenses: MIT
- Latest release: 2.0.1 (published 9 days ago)
- Last Synced: 2026-09-24T17:32:14.111Z (1 day ago)
- Versions: 53
- Dependent Packages: 0
- Dependent Repositories: 0
- Downloads: 179,786,638 Total
- Docker Downloads: 554,612,924
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 0.082%
- Downloads: 0.156%
- Docker downloads count: 0.173%
- Maintainers (1)
rubygems.org: rack-proxy
A Rack app that provides request/response rewriting proxy capabilities with streaming.
- Homepage: https://github.com/ncr/rack-proxy
- Documentation: http://www.rubydoc.info/gems/rack-proxy/
- Licenses: MIT
- Latest release: 2.0.1 (published 9 days ago)
- Last Synced: 2026-09-24T17:32:14.207Z (1 day ago)
- Versions: 53
- Dependent Packages: 48
- Dependent Repositories: 124,808
- Downloads: 179,786,638 Total
- Docker Downloads: 554,612,924
-
Rankings:
- Dependent repos count: 0.108%
- Downloads: 0.156%
- Docker downloads count: 0.21%
- Dependent packages count: 0.55%
- Average: 1.208%
- Forks count: 2.708%
- Stargazers count: 3.515%
- Maintainers (1)
ubuntu-24.04: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Licenses: mit
- Latest release: 0.7.7-1 (published 8 months ago)
- Last Synced: 2026-08-29T06:29:00.639Z (28 days ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 4.315%
- Forks count: 7.516%
- Stargazers count: 9.744%
proxy.golang.org: github.com/ncr/rack-proxy
- Homepage:
- Documentation: https://pkg.go.dev/github.com/ncr/rack-proxy#section-documentation
- Licenses: mit
- Latest release: v2.0.1+incompatible (published 9 days ago)
- Last Synced: 2026-09-24T17:32:16.321Z (1 day ago)
- Versions: 54
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent packages count: 4.638%
- Average: 4.794%
- Dependent repos count: 4.95%
debian-13: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Documentation: https://packages.debian.org/trixie/ruby-rack-proxy
- Licenses: mit
- Latest release: 0.7.7-1 (published 8 months ago)
- Last Synced: 2026-03-14T18:08:03.490Z (7 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
ubuntu-24.10: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Licenses: mit
- Latest release: 0.7.7-1 (published 8 months ago)
- Last Synced: 2026-08-02T12:13:47.896Z (about 2 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
debian-12: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Documentation: https://packages.debian.org/bookworm/ruby-rack-proxy
- Licenses: mit
- Latest release: 0.7.4-1 (published 7 months ago)
- Last Synced: 2026-03-13T23:45:02.715Z (7 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
ubuntu-23.04: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Licenses: mit
- Latest release: 0.7.4-1 (published 8 months ago)
- Last Synced: 2026-09-18T12:28:11.022Z (7 days ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
ubuntu-23.10: ruby-rack-proxy
- Homepage: https://github.com/ncr/rack-proxy
- Licenses: mit
- Latest release: 0.7.6-2 (published 7 months ago)
- Last Synced: 2026-07-28T07:01:48.253Z (about 2 months ago)
- Versions: 1
- Dependent Packages: 0
- Dependent Repositories: 0
-
Rankings:
- Dependent repos count: 0.0%
- Dependent packages count: 0.0%
- Average: 100%
Dependencies
- rake >= 0
- power_assert 0.2.6
- rack 2.2.3
- rack-proxy 0.7.2
- rack-test 0.5.6
- rake 13.0.6
- test-unit 3.1.5
- rack-test >= 0 development
- test-unit >= 0 development
- rack >= 0
- actions/checkout v7 composite
- ruby/setup-ruby v1 composite
- actions/checkout v7 composite
- ruby/setup-ruby v1 composite
- rubygems/release-gem v1 composite
Score: 30.74926969417023