pub package Null Safety CI GitHub Tag New Commits Last Commits Pull Requests Code size License

Shelf middleware to GZIP encoding responses, with compression level and compression scope by content-type.


import 'dart:async' show runZonedGuarded;
import 'dart:io';

import 'package:path/path.dart' show join, dirname;
import 'package:shelf/shelf.dart' as shelf;
import 'package:shelf/shelf_io.dart' as shelf_io;
import 'package:shelf_gzip/shelf_gzip.dart';
import 'package:shelf_static/shelf_static.dart';

void main() {
  // Assumes the server lives in bin/ and that `pub build` ran
  var pathToBuild =
  join(dirname(Platform.script.toFilePath()), '..', 'build/web');
  var staticHandler =
  createStaticHandler(pathToBuild, defaultDocument: 'index.html');

  var portEnv = Platform.environment['PORT'];
  var port = portEnv == null ? 9999 : int.parse(portEnv);

  runZonedGuarded(() async {
    var handler = const shelf.Pipeline()

    await shelf_io.serve(handler, '', port);

    print("Serving $pathToBuild on port $port");
  }, (e, stackTrace) => print('Server error: $e $stackTrace'));

When not compress

The gzip encoding won't be applied if:

  • The Content-Type is for an already compressed type. See isAlreadyCompressedContentType.
  • A small response body (length < 512) will not benefit from being compressed.

Compression Level

The default gzip encoder compression level is set to 4, since this is the recommended level for live compression (not stored file compression). A level 4 compression has the best trade off for text/code content and CPU usage.

  • The original default gzip encoder compression level is 6.

Features and bugs

Please file feature requests and bugs at the issue tracker.



BSD-3-Clause License


shelf support for gzip encoding responses.