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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions