handleCall method
Handles a call to this route. This method is repsonsible for setting
a correct response headers, status code, and write the response body to
request.response
.
Implementation
@override
Future<bool> handleCall(Session session, HttpRequest request) async {
session as MethodCallSession;
var path = Uri.decodeFull(session.uri.path);
try {
// Remove version control string
var dir = serverDirectory;
var base = p.basenameWithoutExtension(path);
var extension = p.extension(path);
var baseParts = base.split('@');
if (baseParts.last.startsWith('v')) {
baseParts.removeLast();
}
base = baseParts.join('@');
if (basePath != null && path.startsWith(basePath!)) {
var requestDir = p.dirname(path);
var middlePath = requestDir.substring(basePath!.length);
if (middlePath.isNotEmpty) {
path = p.join(dir, middlePath, base + extension);
} else {
path = p.join(dir, base + extension);
}
} else {
path = p.join(dir, base + extension);
}
// Set content type.
extension = extension.toLowerCase();
var contentType = _contentTypeMapping[extension];
if (contentType != null) {
request.response.headers.contentType = contentType;
}
// Enforce strong cache control.
request.response.headers.set('Cache-Control', 'max-age=31536000');
var filePath = path.startsWith('/') ? path.substring(1) : path;
filePath = 'web/$filePath';
var fileContents = await File(filePath).readAsBytes();
request.response.add(fileContents);
return true;
} catch (e) {
// Couldn't find or load file.
return false;
}
}