Thanks for your interest in contributing to urlx, a memory-safe Rust reimplementation of curl.
- Rust 1.85+ (install via rustup)
- Perl (for running the curl test suite)
- Git (with submodule support -- the curl test suite lives in
vendor/curl/)
git clone --recurse-submodules https://github.com/jonwiggins/urlx.git
cd urlx
cargo build --workspace --releaseRust tests:
cargo test --workspacecurl compatibility tests (runs curl's own test suite against urlx):
./scripts/run-curl-tests.sh- Format with
cargo fmtbefore committing. - Lint with
cargo clippy --all-targetsand fix all warnings. - No
unsafecode outside ofcrates/liburlx-ffi/. The core library and CLI must be 100% safe Rust. - No
unwrap()in library code. Use proper error handling withResult. - Every public item needs a doc comment.
We use Conventional Commits:
fix(http): handle chunked encoding edge case (test 123)
feat(ftp): add MLSD command support
chore: update dependencies
docs: clarify TLS backend configuration
Scope names match crate or module names: http, ftp, tls, url, cookie, dns, proxy, auth, ffi, cli, pool, ws, mqtt, smtp, imap.
curl's test suite is the specification. We import curl's own test suite, run it against our binaries, and use failing tests as the work queue. The measure of success is curl's tests passing against urlx.
When working on a failing test:
- Read the test file at
vendor/curl/tests/data/testNNNto understand what it expects. - Make the minimum change to pass the test.
- Verify no regressions by running all previously-passing tests.
- Keep PRs focused on one logical change.
- Reference curl test numbers when applicable.
- Ensure
cargo fmt,cargo clippy, andcargo testall pass. - Run the curl test suite to check for regressions.
See CLAUDE.md for detailed project documentation, architecture, and current status.