The differences between http2 compatibility API and http[s]
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)