sendResponse method

Future sendResponse(
  1. Request request,
  2. Response response,
  3. RequestContext req,
  4. ResponseContext res, {
  5. bool ignoreFinalizers = false,
})

Sends a response.

Implementation

Future sendResponse(Request request, Response response, RequestContext req,
    ResponseContext res,
    {bool ignoreFinalizers = false}) {
  //app.logger.fine("Calling SendResponse");
  Future<void> cleanup(_) {
    if (!app.environment.isProduction && req.container!.has<Stopwatch>()) {
      var sw = req.container!.make<Stopwatch>();
      app.logger.fine(
          "${res.statusCode} ${req.method} ${req.uri} (${sw.elapsedMilliseconds} ms)");
    }
    return req.close();
  }

  // TODO: Debugging header
  /*
  for (var key in res.headers.keys) {
    app.logger.fine("Response header key: $key");
  }
  */

  if (!res.isBuffered) {
    //if (res.isOpen) {
    return res.close().then(cleanup);
    //}
    //return Future.value();
  }

  //app.logger.fine("Calling finalizers");

  var finalizers = ignoreFinalizers == true
      ? Future.value()
      : Future.forEach(app.responseFinalizers, (dynamic f) => f(req, res));

  return finalizers.then((_) {
    //if (res.isOpen) res.close();

    for (var key in res.headers.keys) {
      app.logger.fine("Response header key: $key");
      setHeader(response, key, res.headers[key] ?? '');
    }

    setContentLength(response, res.buffer?.length ?? 0);
    setChunkedEncoding(response, res.chunked ?? true);

    var outputBuffer = res.buffer?.toBytes() ?? <int>[];

    if (res.encoders.isNotEmpty) {
      var allowedEncodings = req.headers
          ?.value('accept-encoding')
          ?.split(',')
          .map((s) => s.trim())
          .where((s) => s.isNotEmpty)
          .map((str) {
        // Ignore quality specifications in accept-encoding
        // ex. gzip;q=0.8
        if (!str.contains(';')) return str;
        return str.split(';')[0];
      });

      if (allowedEncodings != null) {
        for (var encodingName in allowedEncodings) {
          var key = encodingName;

          Converter<List<int>, List<int>>? encoder;
          if (res.encoders.containsKey(encodingName)) {
            encoder = res.encoders[encodingName];
          } else if (encodingName == '*') {
            encoder = res.encoders[key = res.encoders.keys.first];
          }

          if (encoder != null) {
            setHeader(response, 'content-encoding', key);
            outputBuffer =
                res.encoders[key]?.convert(outputBuffer) ?? <int>[];
            setContentLength(response, outputBuffer.length);
            break;
          }
        }
      }
    }

    setStatusCode(response, res.statusCode);
    addCookies(response, res.cookies);
    writeToResponse(response, outputBuffer);
    return closeResponse(response).then(cleanup);
  });
}