| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -2890,6 +2890,19 @@ added: v8.4.0 | |||
| 2890 | 2890 | Returns a [HTTP/2 Settings Object][] containing the deserialized settings from | |
| 2891 | 2891 | the given `Buffer` as generated by `http2.getPackedSettings()`. | |
| 2892 | 2892 | ||
| 2893 | + ### `http2.performServerHandshake(socket[, options])` | ||
| 2894 | + | ||
| 2895 | + <!-- YAML | ||
| 2896 | + added: REPLACEME | ||
| 2897 | + --> | ||
| 2898 | + | ||
| 2899 | + * `socket` {stream.Duplex} | ||
| 2900 | + * `options` {Object} | ||
| 2901 | + * ...: Any [`http2.createServer()`][] option can be provided. | ||
| 2902 | + * Returns: {ServerHttp2Session} | ||
| 2903 | + | ||
| 2904 | + Create an HTTP/2 server session from an existing socket. | ||
| 2905 | + | ||
| 2893 | 2906 | ### `http2.sensitiveHeaders` | |
| 2894 | 2907 | ||
| 2895 | 2908 | <!-- YAML | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -8,6 +8,7 @@ const { | |||
| 8 | 8 | getDefaultSettings, | |
| 9 | 9 | getPackedSettings, | |
| 10 | 10 | getUnpackedSettings, | |
| 11 | + performServerHandshake, | ||
| 11 | 12 | sensitiveHeaders, | |
| 12 | 13 | Http2ServerRequest, | |
| 13 | 14 | Http2ServerResponse, | |
@@ -21,6 +22,7 @@ module.exports = { | |||
| 21 | 22 | getDefaultSettings, | |
| 22 | 23 | getPackedSettings, | |
| 23 | 24 | getUnpackedSettings, | |
| 25 | + performServerHandshake, | ||
| 24 | 26 | sensitiveHeaders, | |
| 25 | 27 | Http2ServerRequest, | |
| 26 | 28 | Http2ServerResponse, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1228,12 +1228,6 @@ class Http2Session extends EventEmitter { | |||
| 1228 | 1228 | constructor(type, options, socket) { | |
| 1229 | 1229 | super(); | |
| 1230 | 1230 | ||
| 1231 | - if (!socket._handle || !socket._handle.isStreamBase) { | ||
| 1232 | - socket = new JSStreamSocket(socket); | ||
| 1233 | - } | ||
| 1234 | - socket.on('error', socketOnError); | ||
| 1235 | - socket.on('close', socketOnClose); | ||
| 1236 | - | ||
| 1237 | 1231 | // No validation is performed on the input parameters because this | |
| 1238 | 1232 | // constructor is not exported directly for users. | |
| 1239 | 1233 | ||
@@ -1245,6 +1239,12 @@ class Http2Session extends EventEmitter { | |||
| 1245 | 1239 | ||
| 1246 | 1240 | socket[kSession] = this; | |
| 1247 | 1241 | ||
| 1242 | + if (!socket._handle || !socket._handle.isStreamBase) { | ||
| 1243 | + socket = new JSStreamSocket(socket); | ||
| 1244 | + } | ||
| 1245 | + socket.on('error', socketOnError); | ||
| 1246 | + socket.on('close', socketOnClose); | ||
| 1247 | + | ||
| 1248 | 1248 | this[kState] = { | |
| 1249 | 1249 | destroyCode: NGHTTP2_NO_ERROR, | |
| 1250 | 1250 | flags: SESSION_FLAGS_PENDING, | |
@@ -1644,7 +1644,7 @@ class ServerHttp2Session extends Http2Session { | |||
| 1644 | 1644 | // not be an issue in practice. Additionally, the 'priority' event on | |
| 1645 | 1645 | // server instances (or any other object) is fully undocumented. | |
| 1646 | 1646 | this[kNativeFields][kSessionPriorityListenerCount] = | |
| 1647 | - server.listenerCount('priority'); | ||
| 1647 | + server ? server.listenerCount('priority') : 0; | ||
| 1648 | 1648 | } | |
| 1649 | 1649 | ||
| 1650 | 1650 | get server() { | |
@@ -3435,6 +3435,11 @@ function getUnpackedSettings(buf, options = kEmptyObject) { | |||
| 3435 | 3435 | return settings; | |
| 3436 | 3436 | } | |
| 3437 | 3437 | ||
| 3438 | + function performServerHandshake(socket, options = {}) { | ||
| 3439 | + options = initializeOptions(options); | ||
| 3440 | + return new ServerHttp2Session(options, socket, undefined); | ||
| 3441 | + } | ||
| 3442 | + | ||
| 3438 | 3443 | binding.setCallbackFunctions( | |
| 3439 | 3444 | onSessionInternalError, | |
| 3440 | 3445 | onPriority, | |
@@ -3458,6 +3463,7 @@ module.exports = { | |||
| 3458 | 3463 | getDefaultSettings, | |
| 3459 | 3464 | getPackedSettings, | |
| 3460 | 3465 | getUnpackedSettings, | |
| 3466 | + performServerHandshake, | ||
| 3461 | 3467 | sensitiveHeaders: kSensitiveHeaders, | |
| 3462 | 3468 | Http2Session, | |
| 3463 | 3469 | Http2Stream, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -17,6 +17,7 @@ let debug = require('internal/util/debuglog').debuglog( | |||
| 17 | 17 | ); | |
| 18 | 18 | const { owner_symbol } = require('internal/async_hooks').symbols; | |
| 19 | 19 | const { ERR_STREAM_WRAP } = require('internal/errors').codes; | |
| 20 | + const { kSession } = require('internal/stream_base_commons'); | ||
| 20 | 21 | ||
| 21 | 22 | const kCurrentWriteRequest = Symbol('kCurrentWriteRequest'); | |
| 22 | 23 | const kCurrentShutdownRequest = Symbol('kCurrentShutdownRequest'); | |
@@ -263,6 +264,14 @@ class JSStreamSocket extends Socket { | |||
| 263 | 264 | cb(); | |
| 264 | 265 | }); | |
| 265 | 266 | } | |
| 267 | + | ||
| 268 | + get [kSession]() { | ||
| 269 | + return this.stream[kSession]; | ||
| 270 | + } | ||
| 271 | + | ||
| 272 | + set [kSession](session) { | ||
| 273 | + this.stream[kSession] = session; | ||
| 274 | + } | ||
| 266 | 275 | } | |
| 267 | 276 | ||
| 268 | 277 | module.exports = JSStreamSocket; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -0,0 +1,48 @@ | |||
| 1 | + 'use strict'; | ||
| 2 | + | ||
| 3 | + const common = require('../common'); | ||
| 4 | + | ||
| 5 | + if (!common.hasCrypto) | ||
| 6 | + common.skip('missing crypto'); | ||
| 7 | + | ||
| 8 | + const assert = require('assert'); | ||
| 9 | + const http2 = require('http2'); | ||
| 10 | + const stream = require('stream'); | ||
| 11 | + const makeDuplexPair = require('../common/duplexpair'); | ||
| 12 | + | ||
| 13 | + // Basic test | ||
| 14 | + { | ||
| 15 | + const { clientSide, serverSide } = makeDuplexPair(); | ||
| 16 | + | ||
| 17 | + const client = http2.connect('http://example.com', { | ||
| 18 | + createConnection: () => clientSide, | ||
| 19 | + }); | ||
| 20 | + | ||
| 21 | + const session = http2.performServerHandshake(serverSide); | ||
| 22 | + | ||
| 23 | + session.on('stream', common.mustCall((stream, headers) => { | ||
| 24 | + assert.strictEqual(headers[':path'], '/test'); | ||
| 25 | + stream.respond({ | ||
| 26 | + ':status': 200, | ||
| 27 | + }); | ||
| 28 | + stream.end('hi!'); | ||
| 29 | + })); | ||
| 30 | + | ||
| 31 | + const req = client.request({ ':path': '/test' }); | ||
| 32 | + req.on('response', common.mustCall()); | ||
| 33 | + req.end(); | ||
| 34 | + } | ||
| 35 | + | ||
| 36 | + // Double bind should fail | ||
| 37 | + { | ||
| 38 | + const socket = new stream.Duplex({ | ||
| 39 | + read() {}, | ||
| 40 | + write() {}, | ||
| 41 | + }); | ||
| 42 | + | ||
| 43 | + http2.performServerHandshake(socket); | ||
| 44 | + | ||
| 45 | + assert.throws(() => { | ||
| 46 | + http2.performServerHandshake(socket); | ||
| 47 | + }, { code: 'ERR_HTTP2_SOCKET_BOUND' }); | ||
| 48 | + } | ||
| Back | FazBrowse Home | New Git URL |
0 commit comments