Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support http2 #36

Open
wants to merge 16 commits into
base: master
Choose a base branch
from
7 changes: 7 additions & 0 deletions .travis.yml
Expand Up @@ -26,6 +26,7 @@ before_install:
- "test $TRAVIS_NODE_VERSION != '0.6' || npm rm --save-dev istanbul"
- "test $TRAVIS_NODE_VERSION != '0.8' || npm rm --save-dev istanbul"
- "test $(echo $TRAVIS_NODE_VERSION | cut -d. -f1) -ge 4 || npm rm --save-dev $(grep -E '\"eslint\\S*\"' package.json | cut -d'\"' -f2)"
- "test -z $(echo $HTTP2_TEST) || npm install --only=dev https://github.com/visionmedia/superagent.git"
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please only install deps from npm.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately, superagent with http2 have not released. I will wait for release.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also what does the only flag do? According to https://docs.npmjs.com/cli/install it only does something if you do not provide a module name.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is my mistake. --only=dev flag does nothing here. I should delete this flag.


# Update Node.js modules
- "test ! -d node_modules || npm prune"
Expand All @@ -37,3 +38,9 @@ script:
- "test -z $(npm -ps ls eslint ) || npm run-script lint"
after_script:
- "test -e ./coverage/lcov.info && npm install coveralls@2 && cat ./coverage/lcov.info | coveralls"
matrix:
include:
- node_js: "9.5"
env: HTTP2_TEST=1
- node_js: "8.9"
env: HTTP2_TEST=1
22 changes: 21 additions & 1 deletion index.js
Expand Up @@ -84,16 +84,36 @@ function typeis (value, types_) {
* or `content-length` headers set.
* http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.3
*
* A http/2 request with DataFrame can have no `content-length` header.
* https://httpwg.org/specs/rfc7540.html
*
* A http/2 request without DataFrame send HeaderFrame with end-stream-flag.
* If nodejs gets end-stream-flag, then nodejs ends readable stream.
* https://github.com/nodejs/node/blob/master/lib/internal/http2/core.js#L301
*
* @param {Object} request
* @return {Boolean}
* @public
*/

function hasbody (req) {
return req.headers['transfer-encoding'] !== undefined ||
return (ishttp2(req) && !req.stream._readableState.ended) ||
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some testing seems like this may have an issue. If you add a req.on('data' listener and read the body, this then returns false for http/2 but true for http/1. The current interface it is expected to be true for both, as hasBody determines if the request has body, regardless of it you happened to have read it already or not.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I checked and happens an issue you said. I address this issue and add a test.

req.headers['transfer-encoding'] !== undefined ||
!isNaN(req.headers['content-length'])
}

/**
* Check if a request is a http2 request.
*
* @param {Object} request
* @return {Boolean}
* @public
*/

function ishttp2 (req) {
return req.httpVersionMajor === 2
}

/**
* Check if the incoming request contains the "Content-Type"
* header field, and it contains any of the give mime `type`s.
Expand Down