Skip to content

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

@proggeramlug

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

    bugSomething isn't workingparityNode.js compatibility / parity gaps

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions