refactor(http): merge server implementation into HTTP extension#6826
refactor(http): merge server implementation into HTTP extension#6826TheHypnoo wants to merge 3 commits into
Conversation
📝 WalkthroughWalkthroughThe HTTP server implementation is consolidated into ChangesHTTP extension consolidation
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
6fef98a to
252884b
Compare
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/perry-ext-http/src/server/http2_session_settings.rs`:
- Around line 45-67: Update the maxHeaderSize/maxHeaderListSize handling in the
settings deserialization method so both fields remain aliases while
maxHeaderSize wins when both keys are present, matching
js_node_http2_get_packed_settings. Avoid the current unconditional ordering that
lets the maxHeaderListSize block overwrite the value; preserve existing behavior
for either key supplied alone.
In `@crates/perry-ext-http/src/server/tls.rs`:
- Around line 188-201: Update the signing-key loading in the TLS server
configuration flow to use the same active CryptoProvider that
ServerConfig::builder() will use, rather than hard-coding
rustls::crypto::ring::default_provider(). Ensure provider installation and key
loading consistently select one provider, preserving the CertifiedKey
construction and existing error mapping.
In `@crates/perry/src/commands/compile/optimized_libs/driver.rs`:
- Around line 500-501: Update the fallback comment near the optimized library
dependency logic to mention perry-ext-http only once, removing the duplicated
“perry-ext-http / perry-ext-http” text while preserving the rest of the
explanation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 2083ccb4-45be-4099-b8a8-f53fe4150c73
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (78)
.github/workflows/test.ymlCargo.tomlchangelog.d/6826-http-server-consolidation.mdcrates/perry-codegen/src/ext_registry.rscrates/perry-codegen/src/lower_call/native_table/http_http2.rscrates/perry-codegen/src/lower_call/native_table/net_events.rscrates/perry-codegen/src/runtime_decls/stdlib_ffi/net_http.rscrates/perry-ext-fastify/Cargo.tomlcrates/perry-ext-fastify/src/cluster_bind.rscrates/perry-ext-fastify/src/context.rscrates/perry-ext-fastify/src/server.rscrates/perry-ext-fastify/src/upgrade.rscrates/perry-ext-http-server/Cargo.tomlcrates/perry-ext-http-server/src/test_async_shims.rscrates/perry-ext-http/Cargo.tomlcrates/perry-ext-http/src/client_overload.rscrates/perry-ext-http/src/force_link.rscrates/perry-ext-http/src/lib.rscrates/perry-ext-http/src/server/cluster_bind.rscrates/perry-ext-http/src/server/dispatch_ext.rscrates/perry-ext-http/src/server/handle_dispatch.rscrates/perry-ext-http/src/server/http2_server.rscrates/perry-ext-http/src/server/http2_server/controls.rscrates/perry-ext-http/src/server/http2_server/dispatch.rscrates/perry-ext-http/src/server/http2_server/pump.rscrates/perry-ext-http/src/server/http2_server/session.rscrates/perry-ext-http/src/server/http2_session_settings.rscrates/perry-ext-http/src/server/http2_settings.rscrates/perry-ext-http/src/server/http2_stream_props.rscrates/perry-ext-http/src/server/https_server.rscrates/perry-ext-http/src/server/mod.rscrates/perry-ext-http/src/server/raw_upgrade.rscrates/perry-ext-http/src/server/request.rscrates/perry-ext-http/src/server/response.rscrates/perry-ext-http/src/server/response_fast.rscrates/perry-ext-http/src/server/response_tests.rscrates/perry-ext-http/src/server/server.rscrates/perry-ext-http/src/server/server/in_flight.rscrates/perry-ext-http/src/server/tls.rscrates/perry-ext-http/src/server/types.rscrates/perry-ext-http/src/server/upgrade.rscrates/perry-ext-http/src/test_async_shims.rscrates/perry-ext-net/Cargo.tomlcrates/perry-ext-net/src/adopt.rscrates/perry-ext-net/src/handle_ids.rscrates/perry-ext-net/src/jsvalue.rscrates/perry-ext-net/src/lib.rscrates/perry-ext-ws/Cargo.tomlcrates/perry-ext-ws/src/lib.rscrates/perry-ffi/src/error.rscrates/perry-ffi/src/handle.rscrates/perry-hir/src/lower/expr_member.rscrates/perry-runtime/Cargo.tomlcrates/perry-runtime/src/buffer/query.rscrates/perry-runtime/src/closure/dynamic_props.rscrates/perry-runtime/src/cluster.rscrates/perry-runtime/src/cluster_sched.rscrates/perry-runtime/src/error.rscrates/perry-runtime/src/lib.rscrates/perry-runtime/src/object/native_module_dispatch/dispatch_q_u.rscrates/perry-runtime/src/symbol/properties.rscrates/perry-runtime/src/value/handle.rscrates/perry-runtime/src/value/tags.rscrates/perry-stdlib/Cargo.tomlcrates/perry-stdlib/src/common/async_bridge.rscrates/perry-stdlib/src/common/dispatch/init.rscrates/perry-stdlib/src/common/dispatch/method_dispatch.rscrates/perry-stdlib/src/tls.rscrates/perry-stdlib/src/ws.rscrates/perry/src/commands/compile/optimized_libs/driver.rscrates/perry/src/commands/stdlib_features.rscrates/perry/well_known_bindings.tomldocs/src/contributing/crate-policy.mdscripts/release_sweep_tiers/tier12_link_smoke.shtest-files/test_issue_1124_http_buffer_body.tstest-files/test_issue_2533_aliased_http_createserver.tstest-files/test_node_http_basic.tsworkspace-architecture.json
💤 Files with no reviewable changes (2)
- crates/perry-ext-http-server/Cargo.toml
- crates/perry-ext-http-server/src/test_async_shims.rs
There was a problem hiding this comment.
Caution
Inline review comments failed to post. This is likely due to GitHub's internal server error or limits when posting large numbers of comments. If you are seeing this consistently it is likely a permissions issue. Please check "Moderation" -> "Code review limits" under your organization settings.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@crates/perry-ext-http/src/server/http2_session_settings.rs`:
- Around line 45-67: Update the maxHeaderSize/maxHeaderListSize handling in the
settings deserialization method so both fields remain aliases while
maxHeaderSize wins when both keys are present, matching
js_node_http2_get_packed_settings. Avoid the current unconditional ordering that
lets the maxHeaderListSize block overwrite the value; preserve existing behavior
for either key supplied alone.
In `@crates/perry-ext-http/src/server/tls.rs`:
- Around line 188-201: Update the signing-key loading in the TLS server
configuration flow to use the same active CryptoProvider that
ServerConfig::builder() will use, rather than hard-coding
rustls::crypto::ring::default_provider(). Ensure provider installation and key
loading consistently select one provider, preserving the CertifiedKey
construction and existing error mapping.
In `@crates/perry/src/commands/compile/optimized_libs/driver.rs`:
- Around line 500-501: Update the fallback comment near the optimized library
dependency logic to mention perry-ext-http only once, removing the duplicated
“perry-ext-http / perry-ext-http” text while preserving the rest of the
explanation.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro Plus
Run ID: 2083ccb4-45be-4099-b8a8-f53fe4150c73
⛔ Files ignored due to path filters (1)
Cargo.lockis excluded by!**/*.lock
📒 Files selected for processing (78)
.github/workflows/test.ymlCargo.tomlchangelog.d/6826-http-server-consolidation.mdcrates/perry-codegen/src/ext_registry.rscrates/perry-codegen/src/lower_call/native_table/http_http2.rscrates/perry-codegen/src/lower_call/native_table/net_events.rscrates/perry-codegen/src/runtime_decls/stdlib_ffi/net_http.rscrates/perry-ext-fastify/Cargo.tomlcrates/perry-ext-fastify/src/cluster_bind.rscrates/perry-ext-fastify/src/context.rscrates/perry-ext-fastify/src/server.rscrates/perry-ext-fastify/src/upgrade.rscrates/perry-ext-http-server/Cargo.tomlcrates/perry-ext-http-server/src/test_async_shims.rscrates/perry-ext-http/Cargo.tomlcrates/perry-ext-http/src/client_overload.rscrates/perry-ext-http/src/force_link.rscrates/perry-ext-http/src/lib.rscrates/perry-ext-http/src/server/cluster_bind.rscrates/perry-ext-http/src/server/dispatch_ext.rscrates/perry-ext-http/src/server/handle_dispatch.rscrates/perry-ext-http/src/server/http2_server.rscrates/perry-ext-http/src/server/http2_server/controls.rscrates/perry-ext-http/src/server/http2_server/dispatch.rscrates/perry-ext-http/src/server/http2_server/pump.rscrates/perry-ext-http/src/server/http2_server/session.rscrates/perry-ext-http/src/server/http2_session_settings.rscrates/perry-ext-http/src/server/http2_settings.rscrates/perry-ext-http/src/server/http2_stream_props.rscrates/perry-ext-http/src/server/https_server.rscrates/perry-ext-http/src/server/mod.rscrates/perry-ext-http/src/server/raw_upgrade.rscrates/perry-ext-http/src/server/request.rscrates/perry-ext-http/src/server/response.rscrates/perry-ext-http/src/server/response_fast.rscrates/perry-ext-http/src/server/response_tests.rscrates/perry-ext-http/src/server/server.rscrates/perry-ext-http/src/server/server/in_flight.rscrates/perry-ext-http/src/server/tls.rscrates/perry-ext-http/src/server/types.rscrates/perry-ext-http/src/server/upgrade.rscrates/perry-ext-http/src/test_async_shims.rscrates/perry-ext-net/Cargo.tomlcrates/perry-ext-net/src/adopt.rscrates/perry-ext-net/src/handle_ids.rscrates/perry-ext-net/src/jsvalue.rscrates/perry-ext-net/src/lib.rscrates/perry-ext-ws/Cargo.tomlcrates/perry-ext-ws/src/lib.rscrates/perry-ffi/src/error.rscrates/perry-ffi/src/handle.rscrates/perry-hir/src/lower/expr_member.rscrates/perry-runtime/Cargo.tomlcrates/perry-runtime/src/buffer/query.rscrates/perry-runtime/src/closure/dynamic_props.rscrates/perry-runtime/src/cluster.rscrates/perry-runtime/src/cluster_sched.rscrates/perry-runtime/src/error.rscrates/perry-runtime/src/lib.rscrates/perry-runtime/src/object/native_module_dispatch/dispatch_q_u.rscrates/perry-runtime/src/symbol/properties.rscrates/perry-runtime/src/value/handle.rscrates/perry-runtime/src/value/tags.rscrates/perry-stdlib/Cargo.tomlcrates/perry-stdlib/src/common/async_bridge.rscrates/perry-stdlib/src/common/dispatch/init.rscrates/perry-stdlib/src/common/dispatch/method_dispatch.rscrates/perry-stdlib/src/tls.rscrates/perry-stdlib/src/ws.rscrates/perry/src/commands/compile/optimized_libs/driver.rscrates/perry/src/commands/stdlib_features.rscrates/perry/well_known_bindings.tomldocs/src/contributing/crate-policy.mdscripts/release_sweep_tiers/tier12_link_smoke.shtest-files/test_issue_1124_http_buffer_body.tstest-files/test_issue_2533_aliased_http_createserver.tstest-files/test_node_http_basic.tsworkspace-architecture.json
💤 Files with no reviewable changes (2)
- crates/perry-ext-http-server/Cargo.toml
- crates/perry-ext-http-server/src/test_async_shims.rs
🛑 Comments failed to post (3)
crates/perry-ext-http/src/server/http2_session_settings.rs (1)
45-67: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
maxHeaderSize/maxHeaderListSizetie-break contradictshttp2_settings.rs's documented rule.Real Node.js treats
maxHeaderSizeas a pure alias of the singlemaxHeaderListSizesetting. This codebase's ownjs_node_http2_get_packed_settings(inhttp2_settings.rs) documents and implements "when both are present Node lets maxHeaderSize win." Here, the two independentif letblocks run unconditionally in fixed order, so when both keys are present in the input,maxHeaderListSize's block (processed second) always overwritesmaxHeaderSize's — the opposite winner from the sibling implementation.🐛 Proposed fix to align the tie-break with the packing path
- if let Some(v) = obj.get("maxHeaderSize").and_then(json_u32) { - self.max_header_size = v; - self.max_header_list_size = v; - } - if let Some(v) = obj.get("maxHeaderListSize").and_then(json_u32) { - self.max_header_list_size = v; - self.max_header_size = v; - } + let max_header = obj.get("maxHeaderSize").and_then(json_u32); + let max_header_list = obj.get("maxHeaderListSize").and_then(json_u32); + if let Some(v) = max_header.or(max_header_list) { + self.max_header_size = v; + self.max_header_list_size = v; + }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.let max_header = obj.get("maxHeaderSize").and_then(json_u32); let max_header_list = obj.get("maxHeaderListSize").and_then(json_u32); if let Some(v) = max_header.or(max_header_list) { self.max_header_size = v; self.max_header_list_size = v; }🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/perry-ext-http/src/server/http2_session_settings.rs` around lines 45 - 67, Update the maxHeaderSize/maxHeaderListSize handling in the settings deserialization method so both fields remain aliases while maxHeaderSize wins when both keys are present, matching js_node_http2_get_packed_settings. Avoid the current unconditional ordering that lets the maxHeaderListSize block overwrite the value; preserve existing behavior for either key supplied alone.crates/perry-ext-http/src/server/tls.rs (1)
188-201: 🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🌐 Web query:
rustls CertifiedKey SigningKey portable across different CryptoProvider ring aws-lc-rs💡 Result:
In rustls, a CertifiedKey is not inherently portable across different CryptoProviders because it contains a SigningKey trait object, which is tied to the specific provider that created or loaded it [1][2][3]. The SigningKey trait is an abstract interface used by rustls to perform private key operations [2][4]. When you load a private key using a CryptoProvider's KeyProvider (e.g., via rustls-ring or rustls-aws-lc-rs), the resulting SigningKey implementation is specific to that provider's internal cryptographic backends (ring or aws-lc-rs) [3][5]. Because these providers use different underlying libraries, they cannot be mixed; a SigningKey object produced by one provider will generally not be recognized or compatible with the expectations of another provider [3][5]. While both rustls-ring and rustls-aws-lc-rs implement the same rustls::crypto::CryptoProvider interface, they serve as interchangeable drop-in replacements at the configuration level, not as interoperable runtime environments for individual objects [5]. If you need to switch providers, you must re-load or re-create your CertifiedKey and SigningKey using the KeyProvider of the new, desired CryptoProvider [1][3]. The CertifiedKey::from_der method explicitly accepts a &CryptoProvider argument to perform this loading/parsing, highlighting that the provider is a necessary context for interpreting the key material [1][6].
Citations:
- 1: https://docs.rs/rustls/latest/rustls/sign/struct.CertifiedKey.html
- 2: https://rustls.dev/src/rustls/crypto/signer.rs.html
- 3: https://docs.rs/rustls/latest/rustls/crypto/struct.CryptoProvider.html
- 4: https://docs.rs/rustls/latest/rustls/sign/trait.SigningKey.html
- 5: https://rustls.dev/src/rustls/lib.rs.html
- 6: https://docs.rs/portable-rustls/latest/portable_rustls/sign/struct.CertifiedKey.html
🏁 Script executed:
#!/bin/bash set -euo pipefail printf 'Tracked relevant manifest/source files:\n' git ls-files 'Cargo.toml' 'crates/*/Cargo.toml' '*.lock' 'crates/perry-ext-http/src/server/tls.rs' | sed -n '1,80p' printf '\nManifest rustls/ring/aws mentions:\n' rg -n 'rustls|aws-lc|ring' Cargo.toml crates/*/Cargo.toml 2>/dev/null || true printf '\nLockfile entries:\n' if [ -f Cargo.lock ]; then rg -n 'name = "rustls"|name = "rustls-ring"|name = "rustls-aws-lc-rs"|name = "aws-lc-rs"' Cargo.lock -A2 -B2 || true fi printf '\ntls.rs relevant source:\n' sed -n '1,260p' crates/perry-ext-http/src/server/tls.rsRepository: PerryTS/perry
Length of output: 22584
🌐 Web query:
rustls 0.23 CertifiedKey from_der provider load_private_key SigningKey trait object provider specific docs💡 Result:
In rustls 0.23, you can use
CertifiedKey::from_derto create aCertifiedKeyfrom a certificate chain and a DER-encoded private key by providing aCryptoProvider[1][2]. TheCryptoProvidercontains akey_providerfield (implementing theKeyProvidertrait) that handles the parsing and loading of private keys into aSigningKeytrait object [3][4][5]. TheCertifiedKey::from_derfunction signature is:pub fn from_der(cert_chain: Vec<CertificateDer<'static>>, key: PrivateKeyDer<'static>, provider: &CryptoProvider) -> Result<Self, Error>[1][2] When this is called, it uses the providedCryptoProvider’skey_providerto invokeload_private_key, which returns anArc<dyn SigningKey>[1][3]. TheSigningKeytrait defines the abstract interface for performing cryptographic signing operations (such aschoose_schemeandalgorithm) used during the TLS handshake [6][7]. Key points for implementation: - KeyProvider Trait:KeyProvider::load_private_keyis designed for loading private keys from DER (e.g., from disk) [3][5]. If you are using hardware security modules (HSMs) or other external key sources, you should consult the "Customising private key usage" section in the Rustls manual, which guides you on implementing a customSigningKeyandSignerrather than relying solely onKeyProvider[7]. - Provider Selection: You can create a customCryptoProviderby delegating elements (likeSigningKeylogic) to existing providers while overriding thekey_providerfield with your own implementation [4][8][9]. - Integration:CertifiedKeyobjects are typically used withinResolvesServerCertorResolvesClientCertimplementations to supply certificates and keys during a TLS handshake [6][7]. For detailed examples of implementing custom signing keys, check thesignermodule in therustls-cngcrate or the official Rustls "custom provider" examples provided in their documentation [7][10].Citations:
- 1: https://docs.rs/rustls/0.23.37/rustls/sign/struct.CertifiedKey.html
- 2: https://docs.rs/rustls/latest/rustls/sign/struct.CertifiedKey.html
- 3: https://docs.rs/rustls/0.23.37/rustls/crypto/trait.KeyProvider.html
- 4: https://docs.rs/rustls/0.23/rustls/crypto/struct.CryptoProvider.html
- 5: https://docs.rs/rustls/latest/rustls/crypto/trait.KeyProvider.html
- 6: https://docs.rs/rustls/latest/rustls/sign/trait.SigningKey.html
- 7: https://docs.rs/rustls/latest/rustls/manual/_03_howto/index.html
- 8: https://docs.rs/rustls/0.23.12/rustls/crypto/struct.CryptoProvider.html
- 9: https://docs.rs/rustls/latest/rustls/crypto/struct.CryptoProvider.html
- 10: https://docs.rs/crate/rustls/0.23.31
🌐 Web query:
rustls-0.23.42 source rustls/certified_key.rs CertifiedKey::from_der load_private_key💡 Result:
In rustls 0.23.42, the CertifiedKey::from_der method is defined in the rustls/src/crypto/signer.rs source file [1][2][3]. It serves to create a new CertifiedKey by processing a certificate chain and a DER-encoded private key [1][2][3]. The implementation of CertifiedKey::from_der follows this logic: 1. It takes the cert_chain (a vector of DER-encoded certificates), the key (a PrivateKeyDer instance), and a reference to a CryptoProvider as inputs [1][2][3]. 2. It calls the load_private_key method on the provider's KeyProvider, passing in the key [1][2][3]. This step handles the actual decoding and validation of the private key material [4][5]. 3. Upon success, it initializes a new CertifiedKey instance using the parsed private key and the provided certificate chain [1][2][3]. 4. It performs a consistency check using keys_match to ensure the private key corresponds to the public key in the end-entity certificate [1][2][3]. If this check returns either an OK result or an InconsistentKeys::Unknown error, the function returns the constructed CertifiedKey [1][2][3]. The KeyProvider trait defines load_private_key as the mechanism for decoding and validating a private signing key from the provided DER format [4][5]. This trait is essential for supporting different crypto backends, and the specific key formats supported (such as PKCS#1, PKCS#8, or SEC1) depend on the underlying CryptoProvider implementation [6][4][5].
Citations:
- 1: https://codebrowser.dev/slint/crates/rustls/src/crypto/signer.rs.html
- 2: https://docs.openvm.dev/docs/openvm/src/rustls/crypto/signer.rs.html
- 3: https://rustdocs.webschool.au/src/rustls/crypto/signer.rs.html
- 4: https://docs.rs/rustls/latest/rustls/crypto/trait.KeyProvider.html
- 5: https://rustls.dev/docs/crypto/trait.KeyProvider.html
- 6: https://docs.rs/rustls/latest/src/rustls/server/builder.rs.html
Load the signing key with the active CryptoProvider.
If
aws-lc-rsis already the process-level default andinstall_default()silently returnsErr,ServerConfig::builder()will use aws-lc-rs’s cipher/key options while this key is loaded withrustls::crypto::ring::default_provider(). RustlsSigningKeyimplementations are provider-specific, so either install one provider unconditionally and use that provider’skey_provider, or use a provider-agnostic parser/API that does not create the signed-cert chain with a different provider’s backend.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/perry-ext-http/src/server/tls.rs` around lines 188 - 201, Update the signing-key loading in the TLS server configuration flow to use the same active CryptoProvider that ServerConfig::builder() will use, rather than hard-coding rustls::crypto::ring::default_provider(). Ensure provider installation and key loading consistently select one provider, preserving the CertifiedKey construction and existing error mapping.crates/perry/src/commands/compile/optimized_libs/driver.rs (1)
500-501: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Remove the duplicated crate name in the fallback comment.
The comment currently says
perry-ext-http / perry-ext-http, which is misleading and grammatically incorrect. Keep a singleperry-ext-httpreference.Proposed fix
- // node:http's server lives in perry-ext-http / - // perry-ext-http, which aren't perry-stdlib deps — so + // node:http's server lives in perry-ext-http, which isn't + // a perry-stdlib dependency — so📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.// node:http's server lives in perry-ext-http, which isn't // a perry-stdlib dependency — so🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@crates/perry/src/commands/compile/optimized_libs/driver.rs` around lines 500 - 501, Update the fallback comment near the optimized library dependency logic to mention perry-ext-http only once, removing the duplicated “perry-ext-http / perry-ext-http” text while preserving the rest of the explanation.
Summary
perry-ext-httpas an internal module.Changes
perry-ext-http::server.perry-ext-http.http,https, andhttp2owned bylibperry_ext_http.a.[workspace.dependencies].changelog.d/6826-http-server-consolidation.md.Architecture impact
The output artifact remains
libperry_ext_http.a.Review size
size:exceptionaccepted by the maintainer: 832 authored additions/deletions, excluding 12,823 high-similarity move lines. The crate removal, dependency migration, module relocation, and ABI retention must land atomically.Test plan
python3 scripts/workspace_architecture.py --self-testpython3 scripts/workspace_architecture.py --check --print-summarycargo metadata --no-deps --format-version 1cargo fmt --all -- --checkgit diff --checkcargo check -p perry-ext-httpcargo test -p perry-ext-http— 68 passedcargo clippy -p perry-ext-http --all-targetscargo clippy -p perry --binsnode_http_webfetch.tsrelease link-and-run smokeperry-ext-http-serverCargo edge or pathThe broad
--filter node_httpselection includes three intentionally long-lived fixtures that do not close their listener, so the parity runner terminates them after 10 seconds. The self-closing parity and Node-suite server fixtures above pass.Scope
This PR does not migrate
perry-ext-httpaway fromperry-runtime, redesignperry-ffi, remove the legacy stdlib HTTP implementation, or change TLS, routing, timeout, pump, or codegen behavior.Next phase
Phase 3 can expand the stable
perry-ffisurface required by HTTP and remove the productionperry-ext-http → perry-runtimedependency while keeping the independently selected HTTP static library.Related issue
n/a — Perry architecture roadmap Phase 2B.
Summary by CodeRabbit
New Features
Bug Fixes
Tests