Skip to content

node:http/https: 89 tests exit non-zero with no output (triage; likely server-hang/framing, partly cascades from #4903) #4909

Description

@proggeramlug

Summary

The largest single bucket in the node:http/https runtime-fail tail (#2132): 89 tests where Perry exits non-zero with no stderr output while Node passes. These need per-test triage — they don't share one captured error, but the test shapes cluster strongly around server lifecycle / response framing / keep-alive / outgoing-message, which suggests a common failure mode: the server hangs or the connection never frames a complete response, the client times out, and the process exits non-zero silently.

Hypothesis to check first: much of this may cascade from #4903 (server.address() undefined → listen(0) never yields a real port → client connects nowhere → hang → non-zero exit). Re-run this bucket after #4903 lands before triaging individually.

Sub-themes by test name:

  • outgoing-message framing/state (test-http-outgoing-*: buffer, end-cork, finish, writableFinished, properties, first-chunk-encoding)
  • keep-alive lifecycle (test-http-keep-alive-*, test-http-server-keep-alive-*)
  • client timeout / abort (test-http-client-timeout-*, test-http-abort-*, test-http-client-race*)
  • server client-error / malformed-request handling (test-http-server-client-error.js, test-http-malformed-request.js, *-smuggling*)
  • https timeout/keepalive (test-https-timeout-server*.js, test-https-keep-alive-drop-requests.js, test-https-server-*)

Failing tests (89)

test-http-1.0.js                              test-http-outgoing-buffer.js
test-http-abort-client.js                     test-http-outgoing-end-cork.js
test-http-abort-queued.js                     test-http-outgoing-end-multiple.js
test-http-agent-remove.js                     test-http-outgoing-finish-writable.js
test-http-agent-reuse-drained-socket-only.js  test-http-outgoing-finish.js
test-http-agent-timeout.js                    test-http-outgoing-finished.js
test-http-allow-content-length-304.js         test-http-outgoing-first-chunk-singlebyte-encoding.js
test-http-automatic-headers.js                test-http-outgoing-properties.js
test-http-blank-header.js                     test-http-outgoing-writableFinished.js
test-http-buffer-sanity.js                    test-http-pipeline-assertionerror-finish.js
test-http-chunk-extensions-limit.js           test-http-request-dont-override-options.js
test-http-chunked-304.js                       test-http-request-smuggling-content-length.js
test-http-chunked-smuggling.js                test-http-res-write-end-dont-take-array.js
test-http-client-agent-end-close-event.js     test-http-response-setheaders.js
test-http-client-error-rawbytes.js            test-http-server-client-error.js
test-http-client-input-function.js            test-http-server-consumed-timeout.js
test-http-client-race-2.js                    test-http-server-delete-parser.js
test-http-client-race.js                      test-http-server-keep-alive-defaults.js
test-http-client-reject-chunked-with-content-length.js  test-http-server-keep-alive-max-requests-null.js
test-http-client-response-timeout.js          test-http-server-keep-alive-timeout.js
test-http-client-timeout-event.js             test-http-server-multiple-client-error.js
test-http-client-timeout-with-data.js         test-http-server-options-incoming-message.js
test-http-connect.js                          test-http-server-options-server-response.js
test-http-createConnection.js                 test-http-server-stale-close.js
test-http-date-header.js                       test-http-server-unconsume.js
test-http-destroyed-socket-write2.js          test-http-server-write-after-end.js
test-http-dummy-characters-smuggling.js       test-http-set-timeout-server.js
test-http-dump-req-when-res-ends.js           test-http-socket-error-listeners.js
test-http-early-hints.js                       test-http-status-message.js
test-http-eof-on-connect.js                   test-http-timeout-client-warning.js
test-http-expect-continue.js                  test-http-upgrade-server2.js
test-http-flush-headers.js                    test-http-wget.js
test-http-flush-response-headers.js           test-http-write-callbacks.js
test-http-full-response.js                    test-http.js
test-http-headers-distinct-proto.js           test-https-agent-abort-controller.js
test-http-highwatermark.js                    test-https-agent-unref-socket.js
test-http-information-processing.js            test-https-drain.js
test-http-invalid-te.js                        test-https-keep-alive-drop-requests.js
test-http-keep-alive-drop-requests.js         test-https-max-header-size-per-stream.js
test-http-keep-alive-max-requests.js          test-https-selfsigned-no-keycertsign-no-crash.js
test-http-keep-alive-pipeline-max-requests.js test-https-server-close-all.js
test-http-malformed-request.js                test-https-server-options-incoming-message.js
test-http-max-header-size.js                  test-https-server-options-server-response.js
                                              test-https-set-timeout-server.js
                                              test-https-timeout-server-2.js
                                              test-https-timeout-server.js

Acceptance

Triage after #4903/#4905/#4906 land (many should clear). For the remainder, capture the actual non-zero exit cause (add stderr) and split into framing/keep-alive/timeout sub-tickets.


Part of #2132. Measured via scripts/node_core_subset.py --api http https vs pinned Node v22 corpus.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugConfirmed defect or regressionparityCompatibility gap with Node.js, ECMAScript, or the supported ecosystem

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions