handleCall method

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

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

    // TODO: Correctly set headers for more types
    extension = extension.toLowerCase();
    if (extension == '.js') {
      request.response.headers.contentType =
          ContentType('text', 'javascript');
    } else if (extension == '.css') {
      request.response.headers.contentType = ContentType('text', 'css');
    } else if (extension == '.png') {
      request.response.headers.contentType = ContentType('image', 'png');
    } else if (extension == '.jpg') {
      request.response.headers.contentType = ContentType('image', 'jpeg');
    } else if (extension == '.svg') {
      request.response.headers.contentType = ContentType('image', 'svg+xml');
    } else if (extension == '.ttf') {
      request.response.headers.contentType =
          ContentType('application', 'x-font-ttf');
    } else if (extension == '.woff') {
      request.response.headers.contentType =
          ContentType('application', 'x-font-woff');
    } else if (extension == '.mp3') {
      request.response.headers.contentType = ContentType('audio', 'mpeg');
    }

    // 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) {
    return false;
  }
}