Skip to content

http2: exception on stream destroy #16543

@fcicq

Description

@fcicq

Version: 8.8.1
Platform: 64bit linux
Subsystem: http2

I'm trying to write a simple nghttpx clone, so you see stream.respond & pipe there.
I was finding the right way to destroy the httpres and the stream.
I'm sorry that I don't know how to reliable reproduce this.

exceptions found:

internal/http2/core.js:1355
const handle = session[kHandle];
                          ^

TypeError: Cannot read property 'Symbol(handle)' of undefined
    at ServerHttp2Stream._write (internal/http2/core.js:1355:27)
    at doWrite (_stream_writable.js:387:12)
    at clearBuffer (_stream_writable.js:514:7)
    at onwrite (_stream_writable.js:439:7)
    at WriteWrap.afterDoStreamWrite [as oncomplete] (internal/http2/core.js:1157:9)
    at Immediate.finishStreamDestroy [as _onImmediate] (internal/http2/core.js:1534:12)
    at runCallback (timers.js:789:20)
    at tryOnImmediate (timers.js:747:5)
    at processImmediate [as _immediateCallback] (timers.js:718:5)

and this
(maybe caused by stream.rstStream(http2.constants.NGHTTP2_CONNECT_ERROR);)

internal/http2/core.js:1377
    const handle = session[kHandle];
                          ^

TypeError: Cannot read property 'Symbol(handle)' of undefined
    at ServerHttp2Stream._writev (internal/http2/core.js:1377:27)
    at doWrite (_stream_writable.js:385:12)
    at clearBuffer (_stream_writable.js:491:5)
    at onwrite (_stream_writable.js:439:7)
    at WriteWrap.afterDoStreamWrite [as oncomplete] (internal/http2/core.js:1157:9)
    at Immediate.finishStreamDestroy [as _onImmediate] (internal/http2/core.js:1534:12)
    at runCallback (timers.js:789:20)
    at tryOnImmediate (timers.js:747:5)
    at processImmediate [as _immediateCallback] (timers.js:718:5)

snippet:

const server = http2.createServer();

server.on('stream', (stream, headers) => {
 // ... here is the request
var httpreq = http.request(parsed, function(httpres) {
    httpres.headers[':status'] = httpres.statusCode;
    delete httpres.headers['connection'];
    delete httpres.headers['keep-alive'];
    delete httpres.headers['proxy-connection'];
    delete httpres.headers['host'];
    delete httpres.headers['upgrade'];
    delete httpres.headers['transfer-encoding'];
    // Note: this is issue 16452
    if (httpres.headers['set-cookie'] && httpres.headers['set-cookie'].length ==
 1) {
      httpres.headers['set-cookie'] = httpres.headers['set-cookie'][0];
    }
    stream.respond(httpres.headers);
    httpres.pipe(stream, {end: true});
});
  httpreq.on('error', (error) => {
    if (!stream.headersSent && !stream.destroyed) {
      stream.respond({':status': 502});
      stream.end('502 Error');
    } else if (!stream.destroyed) {
      httpreq.abort();
      stream.destroy();
    }
  });
  stream.on('error', (error) => {
    httpreq.abort();
  });
  stream.on('aborted', () => { httpreq.abort() });
  stream.on('streamClosed', () => { httpreq.abort() });
  stream.pipe(httpreq, {end: true});
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    http2Issues or PRs related to the http2 subsystem.

    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