{"id":50823753,"url":"https://github.com/j0shcap/rhoxy","last_synced_at":"2026-06-13T16:34:51.331Z","repository":{"id":310784806,"uuid":"1041195087","full_name":"j0shcap/rhoxy","owner":"j0shcap","description":"An async HTTP/HTTPS proxy in Rust","archived":false,"fork":false,"pushed_at":"2026-02-26T03:38:10.000Z","size":205,"stargazers_count":0,"open_issues_count":17,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T11:07:10.975Z","etag":null,"topics":["http-proxy","https-proxy","proxy","rust"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/j0shcap.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-08-20T06:02:10.000Z","updated_at":"2026-02-26T03:38:14.000Z","dependencies_parsed_at":"2025-08-20T08:36:42.953Z","dependency_job_id":"0474de93-8d40-4c1e-a92a-6af9f754eca9","html_url":"https://github.com/j0shcap/rhoxy","commit_stats":null,"previous_names":["joshcap20/rhoxy","j0shcap/rhoxy"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/j0shcap/rhoxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j0shcap%2Frhoxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j0shcap%2Frhoxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j0shcap%2Frhoxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j0shcap%2Frhoxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/j0shcap","download_url":"https://codeload.github.com/j0shcap/rhoxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/j0shcap%2Frhoxy/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34292325,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-13T02:00:06.617Z","response_time":62,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["http-proxy","https-proxy","proxy","rust"],"created_at":"2026-06-13T16:34:50.632Z","updated_at":"2026-06-13T16:34:51.326Z","avatar_url":"https://github.com/j0shcap.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# rhoxy\n\n[![Tests](https://github.com/JoshCap20/rhoxy/actions/workflows/test.yml/badge.svg?branch=main)](https://github.com/JoshCap20/rhoxy/actions/workflows/test.yml)\n[![Publish](https://github.com/JoshCap20/rhoxy/actions/workflows/deploy.yml/badge.svg)](https://github.com/JoshCap20/rhoxy/actions/workflows/deploy.yml)\n[![Crates.io](https://img.shields.io/crates/v/rhoxy.svg)](https://crates.io/crates/rhoxy)\n[![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](LICENSE)\n\nAn async HTTP/HTTPS forward proxy built with Rust, Tokio, and reqwest.\n\n## Features\n\n- **HTTP forwarding** — Parses client requests, forwards to upstream servers via a static `reqwest` connection pool, and streams responses back\n- **HTTPS tunneling** — Handles `CONNECT` requests with bidirectional `tokio::io::copy` tunneling\n- **SSRF protection** — Blocks requests to private/loopback addresses with DNS rebinding detection\n- **DoS mitigation** — Bounded line reads, body size limits (10 MiB), header count limits, connection concurrency cap (1024), and per-connection timeouts\n- **Graceful shutdown** — Drains in-flight connections on `Ctrl-C` before exiting\n- **Health endpoint** — Responds to `/health` requests directed at the proxy\n\n## Usage\n\n```\nrhoxy [OPTIONS]\n\nOptions:\n      --host \u003cHOST\u003e  Host to bind to [default: 127.0.0.1]\n  -p, --port \u003cPORT\u003e  Port to listen on [default: 8080]\n      --verbose      Enable debug logging\n  -h, --help         Print help\n  -V, --version      Print version\n```\n\n### Quick start\n\n```bash\n# Start proxy on port 8081 with debug logging\nrhoxy --port 8081 --verbose\n\n# Test with curl\ncurl -x http://127.0.0.1:8081 http://httpbin.org/ip\ncurl -x http://127.0.0.1:8081 https://httpbin.org/ip\n```\n\n### System proxy (macOS)\n\nGo to **System Settings \u003e Wi-Fi \u003e Details \u003e Proxies**, enable **Web Proxy (HTTP)** and **Secure Web Proxy (HTTPS)**, set server to `127.0.0.1` and port to `8081`.\n\n## Installation\n\n### From crates.io\n\n```bash\ncargo install rhoxy\n```\n\n### From source\n\n```bash\ngit clone https://github.com/JoshCap20/rhoxy.git\ncd rhoxy\ncargo build --release\ncargo install --path .\n```\n\n### As a library dependency\n\n```bash\ncargo add rhoxy\n```\n\n## Development\n\n```bash\ncargo run -- --port 8081 --verbose   # Run with debug logging\ncargo test                            # Run all 62 tests\ncargo clippy                          # Lint\ncargo fmt                             # Format\n```\n\n## Architecture\n\n```\nsrc/\n├── main.rs              # CLI, server loop, connection handling\n├── lib.rs               # Shared utilities (line reader, SSRF checks, health)\n├── constants.rs         # All configuration constants\n└── protocol/\n    ├── mod.rs           # Protocol enum and dispatch\n    ├── http.rs          # HTTP forward proxy (reqwest-based)\n    └── https.rs         # HTTPS CONNECT tunnel\n```\n\n**HTTP flow:** Client request → parse headers/body → SSRF check → DNS verification → forward via reqwest connection pool → stream response back\n\n**HTTPS flow:** CONNECT request → drain headers → SSRF check → DNS verification → TCP connect to resolved address → `200 Connection Established` → bidirectional tunnel via `tokio::io::copy`\n\n## License\n\n[MIT](LICENSE)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj0shcap%2Frhoxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fj0shcap%2Frhoxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fj0shcap%2Frhoxy/lists"}