handleCall method

  1. @override
Future<bool> handleCall(
  1. Session session,
  2. HttpRequest request
)
override

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;
  }
}