traceRequestResponseCycle: function traceRequestResponseCycle()

in packages/core/lib/middleware/mw_utils.js [170:218]


  traceRequestResponseCycle: function traceRequestResponseCycle(req, res) {
    var amznTraceHeader = this.processHeaders(req);
    var name = this.resolveName(req.headers.host);
    var segment = new Segment(name, amznTraceHeader.root, amznTraceHeader.parent);

    if (!res.req) {
      res.req = req;
    }
    this.resolveSampling(amznTraceHeader, segment, res);

    segment.addIncomingRequestData(new IncomingRequestData(req));

    this.middlewareLog('Starting middleware segment', req.url, segment);

    var middlewareLog = this.middlewareLog;
    var didEnd = false;
    var endSegment = function () {
      // ensure `endSegment` is only called once
      // in some versions of node.js 10.x and in all versions of node.js 11.x and higher,
      // the 'finish' and 'close' event are BOTH triggered.
      // Previously, only one or the other was triggered:
      // https://github.com/nodejs/node/pull/20611
      if (didEnd) {
        return;
      }
      didEnd = true;

      if (res.statusCode === 429) {
        segment.addThrottleFlag();
      }

      const cause = coreUtils.getCauseTypeFromHttpStatus(
        res.statusCode
      );

      if (cause) {
        segment[cause] = true;
      }

      segment.http.close(res);
      segment.close();

      middlewareLog('Closed middleware segment successfully', req.url, segment);
    };

    res.on('finish', endSegment);
    res.on('close', endSegment);
    return segment;
  }