Repository navigation
Conversation
Quest-Claim: 7d05b32b3c5a0ec2
Collaborator
Author
|
Closing: the maintainer dropped this quest on 2026-11-07 (let projects pull rind rather than send them patches). moq-dev/rind#471 deletes it with the others. (Written by Claude Opus 5.5 with high) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Claims quest/m2/adoption/librespot.md.
Problem
librespot's rustls features always compile ring, so spotifyd, ncspot, and other apps on its crates can't swap in another rustls provider without also building ring. The quest's goal is a merged upstream PR that lets them pick.
On
dev(99b6088), ring comes in three ways under eitherrustls-tls-*feature:librespot-coreturns on hyper-rustls'sringfeature.librespot-oauthuses reqwest'srustls-tls-*features andoauth2/rustls-tls, both of which turn on reqwest's ring.hyper-proxy20.1.0 (last release January 2024) brings in hyper-rustls 0.26, rustls 0.22, and webpki 0.22, all tied to ring. This is a second rustls stack beside 0.23.tokio-tungstenite is already provider-neutral. At runtime, librespot already uses an installed default provider; the cost is building ring at all.
Approach
The upstream change is prepared and tested but not posted, since it goes outside the moq-dev and kixelated orgs. Nothing lands in rind from this PR. It stays a draft to hold the claim until the maintainer decides on posting.
Two commits, per librespot's CONTRIBUTING (one major change per commit):
core: replace hyper-proxy2 with hyper-http-proxy. hyper-http-proxy is hyper-proxy2's maintained fork (1.2.0, 2026-08-12, about 8.4M recent downloads) with the same API. It uses hyper-rustls withdefault-features = falseand gets its provider fromClientConfig::builder(). This drops seven crates fromCargo.lock.core, oauth: add rustls features without a crypto provider. Addsrustls-tls-native-roots-no-providerandrustls-tls-webpki-roots-no-providerto core, oauth, audio, connect, discovery, metadata and playback, named after reqwest's features. The existingrustls-tls-*features become<x>-no-providerplus ring (hyper-rustls/ring,reqwest/rustls-tls-*), so their behaviour is unchanged.with_native_roots()andwith_webpki_roots()shorthands without its ring or aws-lc-rs feature. A ring-free build caught this.http_client.rsnow builds theClientConfigthe way those shorthands do (ClientConfig::builder()andConfigBuilderExt), which needsrustlsas a direct optional dependency of core. It was already in the tree.oauth2/rustls-tlsis dropped: it only turned onreqwest/rustls-tls(ring with webpki roots) on top of the reqwest features already set.cargo hackdiscovery step excludes the new features, or--each-featurewould pair them withnative-tlsand hit the mutual-exclusioncompile_error!.AI policy. librespot has no written AI policy (CONTRIBUTING.md, SECURITY.md, PR and issue templates checked). It has no ban like Servo's, so the quest goes ahead. Maintainer kingosticks has complained about "walls of AI text" (librespot-org/librespot#1649) and "competing LLMs" (librespot-org/librespot#1725). The draft below is therefore short, plain, and discloses the AI help in one line.
Choices made without asking:
librespotcrate (the binary) gets no-no-providerfeatures. A binary built that way has no provider. Downstream apps depend on the sub-crates (spotifyd and ncspot do), and those all get the features.HttpClientalreadyunwrap()s client creation (librespot-org/librespot#1811 is changing that separately).Validation
On librespot
devat99b6088, patch head1f01f2f:Upstream CI equivalents with
RUSTFLAGS=-D warnings, in a nix shell with ALSA and cargo-hack:cargo fmt --all -- --checkcargo build --locked --workspace --examplescargo test --locked --workspace: all passcargo hack check --each-featurestep as patched, excludingwith-dns-sd, which needs the Avahi compat librarycargo clippyforlibrespotwith each ofnative-tls,rustls-tls-native-rootsandrustls-tls-webpki-roots(plusrodio-backend,with-libmdns)cargo clippyfor core, oauth, connect, playback and discovery with each-no-providerfeatureUpstream's
--each-featureaudio-backend sweep was not run: it needs every audio system library, and the patch doesn't touch audio.A downstream test app on the patched crates fetches
https://apresolve.spotify.comthroughlibrespot_core::http_client::HttpClient, both directly and through a local HTTP CONNECT proxy (exercising hyper-http-proxy's TLS tunnel), then builds areqwest::Clientthe way librespot-oauth does:rustls-tls-native-roots-no-providerwith rind-rustls 0.23.0 (crates.io) installed: passes, and no ring, aws-lc-rs or aws-lc-sys appears incargo tree -e normal,build.rustls-tls-native-roots(ring, unchanged path), no provider installed: passes.native-tls: passes.-no-providerwith nothing installed: panics with rustls's "Call CryptoProvider::install_default() before this point" message, as intended.Codex review of the upstream branch (
quest review --base origin/dev --size S), recorded under Review.Not run: an armv7 or aarch64 build (the quest's Raspberry Pi motivation). The patch has no architecture-specific code, and rind's own CI covers those targets.
Impact
None on rind's API or wire format. Upstream gains two opt-in features per crate. Existing features, defaults and MSRV (1.85) are unchanged. hyper-http-proxy declares 1.70.
Alternatives
client-proxyTunnelunder hyper-rustls'sHttpsConnector. That needs no new crate but rewrites the proxy code. librespot-org/librespot#1768 (open, SOCKS5 support) already rewrites it with its own connector. Note that #1768 setsrustls = { features = ["ring"] }, so if it lands first, its connector needs the same provider-neutral treatment.rustls-tls-*features provider-neutral and add arustls-ringfeature. Fewer feature names, but downstream apps built on today's features would panic at runtime. Rejected.Upstream PR draft
To post from a fork of librespot-org/librespot, against
dev. Reword freely; it is written to read as the poster's own.Upstream change
Against
librespot-org/librespot@99b6088(dev), two commits, withCargo.lockleft out. To apply:git amthe patch.cargo checkonce. It rewritesCargo.lock, dropping hyper-proxy2, hyper-rustls 0.26, rustls 0.22, rustls-native-certs 0.7, rustls-pemfile, rustls-webpki 0.102, tokio-rustls 0.25 and webpki 0.22, and adding hyper-http-proxy and core'srustlsentry.--locked.librespot-upstream.patch
Waiting
Maintainer: decide whether and how to post the upstream PR above. An agent can't: it is outward-facing outside moq-dev and kixelated, and the text should be the poster's own words. Options:
Done when the upstream PR is open. The quest then waits on
librespot-org/librespot: review and merge <PR URL>.Models
Size: S
Implementer: Claude Code, claude-opus-5-5, high effort
Review
No rind change, so
quest reviewon this branch has nothing to review. The upstream librespot branch was reviewed instead: Codex, gpt-6.1-sol, medium effort, session01a1b52b-0158-7170-aee1-c0fe1f6a1d29, round 1. Head1f01f2f45c226b6d72328e6676455cc49d5b153bagainst base99b6088bf3ea028f90192676ac1a337fa4b2ed12(origin/dev). Score 10/10, 0 findings: "No actionable regressions were found in the specified merge-base-to-head diff after tracing TLS feature propagation and the replacement proxy connector". Codex ran no builds; the validation above covers that. Record skipped (no upstream PR), so it is written here by hand.Suggested follow-ups
-no-providerfeatures. spotifyd is what Raspberry Pi users actually run, and it is where rind's armv7 and aarch64 speed reaches them. Block it on this quest.(Written by Claude Opus 5.5 with high)