Repository navigation
The differences between http2 compatibility API and http[s] #29829
Copy link
Copy link
Closed as not planned
Labels
httpIssues and PRs related to the http subsystem.Issues and PRs related to the http subsystem.http2Issues and PRs related to the http2 subsystem.Issues and PRs related to the http2 subsystem.httpsIssues and PRs related to the https subsystem.Issues and PRs related to the https subsystem.staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.Issues and PRs marked stale due to inactivity and scheduled for automatic closure.
Description
Thanks to the efforts of making the compatibility API, differences between http[s] and http2 modules seldom annoy developers.
But, some http2 compatibility API still behaves differently and lacks some APIs from http[s] and it causes breakages to ecosystems for http[s](e.g. expressjs/express#3730).
In order to expose the differences, I've been translating test cases for http[s] to test cases for http2 at my repo. The following is a list of the differences currently founded by translated test cases.
I'm not sure all the differences have to be fixed. I thought if they should not be fixed, documenting the differences is good for the developer.
Differences between http and http2 compatibility API
-
http2.Http2ServerRequestdoes not havereq.connection.bytesWritten. test:parallel/test-http-byteswritten.js,parallel/test-https-byteswritten.js - If
http2.Http2ServerRequest.pauseis called,http2.Http2ServerRequest.socketnever emit 'data' event. test:parallel/test-http-dump-req-when-res-ends.js -
http2.Http2ServerResponse.writeHeadwith 'HTTP/1 Connection specific headers'(e.g. "Transfer-Encoding":"chunked") causes error:ERR_HTTP2_INVALID_CONNECTION_HEADERS. test:parallel/test-http-head-request.js -
http2.Http2ServerResponsedoes not haveres.writeProcessing. test:parallel/test-http-information-processing.js -
http2.Http2ServerResponse.writeHeadwith a spaced header name does not cause error. test:parallel/test-http-invalidheaderfield.js -
http2.Http2ServerRequestdoes not havereq.connection.parser. test:parallel/test-http-highwatermark.js,parallel/test-http-server-keepalive-end.js -
http2.Http2ServerResponse.endcalls callback before satisfying condition of 'finish' events. test:parallel/test-http-outgoing-finish.js -
http2.Http2ServerResponse.getHeadersreturns headers which is not initialized byObject.create(null)
test:parallel/test-http-mutable-headers.js -
http2.Http2ServerResponsedoes not haveres.writableHighWaterMark. test:parallel/test-http-outgoing-properties.js related issue:http: OutgoingMessage streamlike #28969 -
http2.Http2ServerResponsedoes not haveres.writableLength. test:parallel/test-http-outgoing-properties.js related issue:http: OutgoingMessage streamlike #28969 -
http2.Http2ServerResponsedoes not haveres.writableFinished. test:parallel/test-http-outgoing-writableFinished.js related issue:http2 compat missing writableFinished #29230 -
http2.Http2ServerRequest.headersreturns headers which is initialized byObject.create(null)
test:parallel/test-http-raw-headers.js -
http2.Http2ServerResponse.removeHeadercannot remove a header nodejs automatically adds(e.g. 'date'). test:parallel/test-http-remove-header-stays-removed.js -
http2.Http2ServerResponse.writeafterhttp2.Http2ServerResponse.endreturnsfalse. test:parallel/test-http-res-write-after-end.js -
http2.Http2ServerResponse.writeafterhttp2.Http2ServerResponse.enddoes not emmit 'error'. test:parallel/test-http-res-write-after-end.js,parallel/test-http-server-write-after-end.js Fixed by http2: make http2/compat.write more http/1 compliant #30964 -
http2.Http2ServerResponse.writewith array input does not cause an error. test:parallel/test-http-res-write-after-end.js -
http2.Http2ServerResponse.endwith array input does not cause an error. test:parallel/test-http-res-write-after-end.js -
http2.Http2ServerResponse's error code start with 'ERR_HTTP2'. test:parallel/test-http-response-add-header-after-sent.js,parallel/test-http-response-remove-header-after-sent.js,parallel/test-http-response-statuscode.js,parallel/test-http-write-head.js -
http2.Http2ServerResponse.setHeaderandhttp2.Http2ServerResponse.writeHeadwith multiple value of 'content-length' causes an error. test:parallel/test-http-response-multi-content-length.js -
http2.Http2ServerResponse.setHeaderandhttp2.Http2ServerResponse.writeHeadwith multiple value of 'content-type' or other headers expected single value causes an error. test:parallel/test-http-response-multiheaders.js -
http2.Http2ServerResponse.writeHeadwith invalid character does not cause error. test:parallel/test-http-response-splitting.js -
http2.Http2ServerResponsesending 'Trailer' header without 'transfer encoding: chunked' does not cause error. test:parallel/test-http-server-de-chunked-trailer.js -
http2.Http2ServerResponse.writeHeadcannot set multiple value of header with nested array. test:parallel/test-http-set-cookies.js -
http2.Http2ServerResponse.setTimeoutdoes not pass a socket to cb function. test:parallel/test-http-set-timeout-server.js -
http2.Http2ServerResponse.writeHeadwith invalid status message does not cause an error. test:parallel/test-http-status-reason-invalid-chars.js -
stream.pipe(http2.Http2ServerResponse)eventually emmits both 'finish' and 'close' events. test:parallel/test-http-writable-true-after-close.js -
http2.Http2ServerResponse.enddoes not execute callback whenhttp2.Http2ServerResponse.endhas already been called. test:parallel/test-http-outgoing-end-multiple.js related PR:[x] http2: compat ERR_STREAM_ALREADY_FINISHED #29229 - After
http2.Http2ServerRequest.connection.setTimeoutis called, 'timeout' event is not emitted. test:parallel/test-http-set-timeout.js -
http2.Http2ServerResponse.finishedturn true without callingend.
http2: make compat finished match http/1 #24347 -
http2.Http2ServerResponse.writethrow err when connection is invalid. http1 do nothing then.
HTTP2 compatibility layer issues with invalid streams #29529 - compat mode
http2.Http2Serveremitserrorwhen a connection is unexpectedly closed. In that case,http1.Serveremitsaborted. http2: sessionError vs aborted #28267 -
http2.Http2ServerResponse.write(data)afterhttp2.Http2ServerResponse.writeHead()
with status 304 or 204 cause error. Fix usage of undocumented _implicitHeader expressjs/compression#128 (comment)
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
httpIssues and PRs related to the http subsystem.Issues and PRs related to the http subsystem.http2Issues and PRs related to the http2 subsystem.Issues and PRs related to the http2 subsystem.httpsIssues and PRs related to the https subsystem.Issues and PRs related to the https subsystem.staleIssues and PRs marked stale due to inactivity and scheduled for automatic closure.Issues and PRs marked stale due to inactivity and scheduled for automatic closure.
Activity
ronag commentedon Dec 14, 2019
I think you can add #24347 to the list as well.
ronag commentedon Dec 14, 2019
Really good work! I would be interested in helping sorting some of this.
ronag commentedon Dec 14, 2019
@sogaani I would like to suggest we put your tests in under tests/known_issues so that we might sort them out later? @addaleax would you agree?
ronag commentedon Dec 14, 2019
Here is another one that might be worth to add to the list, #29529
sogaani commentedon Dec 15, 2019
@ronag Thank you for looking at this issue. I added 2 issues you mentioned.
I'm glad to make pull request to put my tests at this repo if it is OK.
ronag commentedon Dec 17, 2019
@addaleax Some guidance here? Would it make sense to add @sogaani's test in e.g. known_issues? Sorting all these out will probably take a while and I'd like to avoid losing this excellent work.
ronag commentedon Jan 16, 2020
@sogaani: Another candidate for the list #28267
ronag commentedon Jan 26, 2020
@sogaani: Just wanted to give a quick ping that I'm still interested in helping sorting these out over time (a little swamped at the moment). But please do continue updating the list if you find more differences.
sogaani commentedon Jan 27, 2020
@ronag Thank you for mentioning the difference. I added :)
ronag commentedon Apr 17, 2020
@rexagod: If you are looking for tasks there is plenty to pick from here.
rexagod commentedon Apr 17, 2020
Awesome! Thank you for pointing me here, @ronag!
65 remaining items
szmarczak commentedon Jul 7, 2020
Also I think it would be nice to have
http2stream.bytesWritten.http2: use `Object.create(null)` for `getHeaders`
http2: add type checks for Http2ServerResponse.end
http2: add writable* properties to compat api
http: don't throw on `Uint8Array`s for `http.ServerResponse#write`
http2: do not modify explicity set date headers
krokowski0x commentedon Feb 26, 2021
@sogaani any updates on this? I wanted to help out with the http/2 in express proposal but this one seems to be a blocker
markb-trustifi commentedon May 16, 2024
Isn't the 102 status code is totally deprecated and will not be added to HTTP/2 standard?
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/102#browser_compatibility
Maybe it should be replaced with multiple
res.write()?http2: comment on usage of `Object.create(null)`
http: don't throw on `Uint8Array`s for `http.ServerResponse#write`
github-actions commentedon Jun 27, 2026
This issue has been marked as stale due to 210 days of inactivity.
It will be automatically closed in 30 days if no further activity occurs. If this is still relevant, please leave a comment or update it to keep it open.
github-actions commentedon Jul 28, 2026
This issue has been automatically closed after 30 days of inactivity following its stale status (no activity for a total of 120 days).
If this is still relevant, feel free to reopen it or leave a comment with additional details so we can continue the discussion.