staticFiles method

Route staticFiles (String path, dynamic directory, { Map<String, String> pathRegEx, int statusCode: 200, String mimeType, String charset: kDefaultCharset, ResponseProcessor responseProcessor, bool stripPrefix: true, Future<Response> directoryLister(Directory directory) })

Serves requests for static files at path from directory

stripPrefix parameter determines if the matched part of the path shall be discarded while locating the target file.

When stripPrefix is true, the behaviour is similar to 'alias' in Nginx.

With path '/static/*', the target file will be located inside directory in the following way:

/static/html/index.html -> html/index.html

When stripPrefix is false, the behavior is similar to 'root' in Nginx.

With path '/static/*', the target file will be located inside directory in the following way:

/static/html/index.html -> static/html/index.html

Example: final server = Jaguar(); server.staticFiles('/static/*', 'static'); await server.serve();

Implementation

Route staticFiles(String path, directory,
    {Map<String, String> pathRegEx,
    int statusCode: 200,
    String mimeType,
    String charset: kDefaultCharset,
    ResponseProcessor responseProcessor,
    bool stripPrefix: true,
    Future<Response> directoryLister(Directory directory)}) {
  if (directory is String) directory = Directory(directory);

  final Directory dir = directory;
  if (!dir.existsSync())
    throw Exception('Directory ${dir.path} does not exist!');

  Route route;
  int skipCount;
  route = this.get(path, (ctx) async {
    Iterable<String> segs = ctx.pathSegments;
    if (stripPrefix) segs = segs.skip(skipCount);

    String path = p.join(dir.path, p.joinAll(segs));
    var file = File(path);

    if (!await file.exists()) {
      final fileDir = Directory(path);

      if (!await fileDir.exists()) return Builtin404ErrorResponse();

      path = p.join(path, 'index.html');
      file = File(path);

      if (!await file.exists()) {
        if (directoryLister != null) return directoryLister(fileDir);
        return Builtin404ErrorResponse();
      }
    }

    return StreamResponse(await file.openRead(),
        mimeType: MimeTypes.ofFile(file));
  },
      pathRegEx: pathRegEx,
      statusCode: statusCode,
      mimeType: mimeType,
      charset: charset,
      responseProcessor: responseProcessor);

  if (stripPrefix) {
    if (route.pathSegments.isNotEmpty)
      skipCount = route.pathSegments.length - 1;
  }
  return route;
}