sendResponse method
Future
sendResponse(
- Request request,
- Response response,
- RequestContext req,
- ResponseContext res, {
- 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);
});
}