Enable and fix some more lints
diff --git a/analysis_options.yaml b/analysis_options.yaml
index c2977b5..69009d3 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -7,8 +7,11 @@
 linter:
   rules:
     - avoid_bool_literals_in_conditional_expressions
+    - avoid_catching_errors
     - avoid_classes_with_only_static_members
     - avoid_function_literals_in_foreach_calls
+    - avoid_private_typedef_functions
+    - avoid_redundant_argument_values
     - avoid_renaming_method_parameters
     - avoid_returning_null
     - avoid_returning_null_for_future
@@ -16,6 +19,7 @@
     - avoid_returning_this
     - avoid_single_cascade_in_expression_statements
     - avoid_unused_constructor_parameters
+    - avoid_void_async
     - await_only_futures
     - camel_case_types
     - cancel_subscriptions
@@ -30,21 +34,34 @@
     - invariant_booleans
     - iterable_contains_unrelated_type
     - join_return_with_assignment
+    - lines_longer_than_80_chars
     - list_remove_unrelated_type
     - literal_only_boolean_expressions
+    - missing_whitespace_between_adjacent_strings
     - no_adjacent_strings_in_list
+    - no_runtimeType_toString
     - non_constant_identifier_names
     - only_throw_errors
     - overridden_fields
     - package_api_docs
     - package_names
     - package_prefixed_library_names
+    - prefer_asserts_in_initializer_lists
     - prefer_const_constructors
+    - prefer_const_declarations
+    - prefer_expression_function_bodies
     - prefer_final_locals
+    - prefer_function_declarations_over_variables
     - prefer_initializing_formals
+    - prefer_inlined_adds
     - prefer_interpolation_to_compose_strings
+    - prefer_is_not_operator
     - prefer_null_aware_operators
+    - prefer_relative_imports
     - prefer_typing_uninitialized_variables
+    - prefer_void_to_null
+    - provide_deprecation_message
+    - sort_pub_dependencies
     - test_types_in_equals
     - throw_in_finally
     - unnecessary_await_in_return
@@ -52,6 +69,9 @@
     - unnecessary_getters_setters
     - unnecessary_lambdas
     - unnecessary_null_aware_assignments
+    - unnecessary_overrides
     - unnecessary_parenthesis
     - unnecessary_statements
+    - unnecessary_string_interpolations
+    - use_string_buffers
     - void_checks
diff --git a/lib/src/authentication_challenge.dart b/lib/src/authentication_challenge.dart
index e4b6619..9b554e8 100644
--- a/lib/src/authentication_challenge.dart
+++ b/lib/src/authentication_challenge.dart
@@ -33,79 +33,77 @@
   /// challenges.
   ///
   /// Throws a [FormatException] if the header is invalid.
-  static List<AuthenticationChallenge> parseHeader(String header) {
-    return wrapFormatException('authentication header', header, () {
-      final scanner = StringScanner(header);
-      scanner.scan(whitespace);
-      final challenges = parseList(scanner, () {
-        final scheme = _scanScheme(scanner, whitespaceName: '" " or "="');
+  static List<AuthenticationChallenge> parseHeader(String header) =>
+      wrapFormatException('authentication header', header, () {
+        final scanner = StringScanner(header);
+        scanner.scan(whitespace);
+        final challenges = parseList(scanner, () {
+          final scheme = _scanScheme(scanner, whitespaceName: '" " or "="');
 
-        // Manually parse the inner list. We need to do some lookahead to
-        // disambiguate between an auth param and another challenge.
-        final params = <String, String>{};
+          // Manually parse the inner list. We need to do some lookahead to
+          // disambiguate between an auth param and another challenge.
+          final params = <String, String>{};
 
-        // Consume initial empty values.
-        while (scanner.scan(',')) {
-          scanner.scan(whitespace);
-        }
-
-        _scanAuthParam(scanner, params);
-
-        var beforeComma = scanner.position;
-        while (scanner.scan(',')) {
-          scanner.scan(whitespace);
-
-          // Empty elements are allowed, but excluded from the results.
-          if (scanner.matches(',') || scanner.isDone) continue;
-
-          scanner.expect(token, name: 'a token');
-          final name = scanner.lastMatch[0];
-          scanner.scan(whitespace);
-
-          // If there's no "=", then this is another challenge rather than a
-          // parameter for the current challenge.
-          if (!scanner.scan('=')) {
-            scanner.position = beforeComma;
-            break;
+          // Consume initial empty values.
+          while (scanner.scan(',')) {
+            scanner.scan(whitespace);
           }
 
-          scanner.scan(whitespace);
+          _scanAuthParam(scanner, params);
 
-          if (scanner.scan(token)) {
-            params[name] = scanner.lastMatch[0];
-          } else {
-            params[name] =
-                expectQuotedString(scanner, name: 'a token or a quoted string');
+          var beforeComma = scanner.position;
+          while (scanner.scan(',')) {
+            scanner.scan(whitespace);
+
+            // Empty elements are allowed, but excluded from the results.
+            if (scanner.matches(',') || scanner.isDone) continue;
+
+            scanner.expect(token, name: 'a token');
+            final name = scanner.lastMatch[0];
+            scanner.scan(whitespace);
+
+            // If there's no "=", then this is another challenge rather than a
+            // parameter for the current challenge.
+            if (!scanner.scan('=')) {
+              scanner.position = beforeComma;
+              break;
+            }
+
+            scanner.scan(whitespace);
+
+            if (scanner.scan(token)) {
+              params[name] = scanner.lastMatch[0];
+            } else {
+              params[name] = expectQuotedString(scanner,
+                  name: 'a token or a quoted string');
+            }
+
+            scanner.scan(whitespace);
+            beforeComma = scanner.position;
           }
 
-          scanner.scan(whitespace);
-          beforeComma = scanner.position;
-        }
+          return AuthenticationChallenge(scheme, params);
+        });
 
-        return AuthenticationChallenge(scheme, params);
+        scanner.expectDone();
+        return challenges;
       });
 
-      scanner.expectDone();
-      return challenges;
-    });
-  }
-
   /// Parses a single WWW-Authenticate challenge value.
   ///
   /// Throws a [FormatException] if the challenge is invalid.
-  factory AuthenticationChallenge.parse(String challenge) {
-    return wrapFormatException('authentication challenge', challenge, () {
-      final scanner = StringScanner(challenge);
-      scanner.scan(whitespace);
-      final scheme = _scanScheme(scanner);
+  factory AuthenticationChallenge.parse(String challenge) =>
+      wrapFormatException('authentication challenge', challenge, () {
+        final scanner = StringScanner(challenge);
+        scanner.scan(whitespace);
+        final scheme = _scanScheme(scanner);
 
-      final params = <String, String>{};
-      parseList(scanner, () => _scanAuthParam(scanner, params));
+        final params = <String, String>{};
+        parseList(scanner, () => _scanAuthParam(scanner, params));
 
-      scanner.expectDone();
-      return AuthenticationChallenge(scheme, params);
-    });
-  }
+        scanner.expectDone();
+        return AuthenticationChallenge(scheme, params);
+      });
 
   /// Scans a single scheme name and asserts that it's followed by a space.
   ///
diff --git a/lib/src/chunked_coding/decoder.dart b/lib/src/chunked_coding/decoder.dart
index cd06f39..dcc0188 100644
--- a/lib/src/chunked_coding/decoder.dart
+++ b/lib/src/chunked_coding/decoder.dart
@@ -163,8 +163,8 @@
     } else {
       // If the byte is an uppercase letter, convert it to lowercase. This works
       // because uppercase letters in ASCII are exactly `0b100000 = 0x20` less
-      // than lowercase letters, so if we ensure that that bit is 1 we ensure that
-      // the letter is lowercase.
+      // than lowercase letters, so if we ensure that that bit is 1 we ensure
+      // that the letter is lowercase.
       final letter = 0x20 | byte;
       if ($a <= letter && letter <= $f) return letter - $a + 10;
     }
diff --git a/lib/src/http_date.dart b/lib/src/http_date.dart
index 88ada63..71f6bab 100644
--- a/lib/src/http_date.dart
+++ b/lib/src/http_date.dart
@@ -57,58 +57,57 @@
 ///
 /// This follows [RFC 2616](http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.3).
 /// It will throw a [FormatException] if [date] is invalid.
-DateTime parseHttpDate(String date) {
-  return wrapFormatException('HTTP date', date, () {
-    final scanner = StringScanner(date);
+DateTime parseHttpDate(String date) =>
+    wrapFormatException('HTTP date', date, () {
+      final scanner = StringScanner(date);
 
-    if (scanner.scan(_longWeekdayRegExp)) {
-      // RFC 850 starts with a long weekday.
-      scanner.expect(', ');
-      final day = _parseInt(scanner, 2);
-      scanner.expect('-');
+      if (scanner.scan(_longWeekdayRegExp)) {
+        // RFC 850 starts with a long weekday.
+        scanner.expect(', ');
+        final day = _parseInt(scanner, 2);
+        scanner.expect('-');
+        final month = _parseMonth(scanner);
+        scanner.expect('-');
+        final year = 1900 + _parseInt(scanner, 2);
+        scanner.expect(' ');
+        final time = _parseTime(scanner);
+        scanner.expect(' GMT');
+        scanner.expectDone();
+
+        return _makeDateTime(year, month, day, time);
+      }
+
+      // RFC 1123 and asctime both start with a short weekday.
+      scanner.expect(_shortWeekdayRegExp);
+      if (scanner.scan(', ')) {
+        // RFC 1123 follows the weekday with a comma.
+        final day = _parseInt(scanner, 2);
+        scanner.expect(' ');
+        final month = _parseMonth(scanner);
+        scanner.expect(' ');
+        final year = _parseInt(scanner, 4);
+        scanner.expect(' ');
+        final time = _parseTime(scanner);
+        scanner.expect(' GMT');
+        scanner.expectDone();
+
+        return _makeDateTime(year, month, day, time);
+      }
+
+      // asctime follows the weekday with a space.
+      scanner.expect(' ');
       final month = _parseMonth(scanner);
-      scanner.expect('-');
-      final year = 1900 + _parseInt(scanner, 2);
+      scanner.expect(' ');
+      final day =
+          scanner.scan(' ') ? _parseInt(scanner, 1) : _parseInt(scanner, 2);
       scanner.expect(' ');
       final time = _parseTime(scanner);
-      scanner.expect(' GMT');
-      scanner.expectDone();
-
-      return _makeDateTime(year, month, day, time);
-    }
-
-    // RFC 1123 and asctime both start with a short weekday.
-    scanner.expect(_shortWeekdayRegExp);
-    if (scanner.scan(', ')) {
-      // RFC 1123 follows the weekday with a comma.
-      final day = _parseInt(scanner, 2);
-      scanner.expect(' ');
-      final month = _parseMonth(scanner);
       scanner.expect(' ');
       final year = _parseInt(scanner, 4);
-      scanner.expect(' ');
-      final time = _parseTime(scanner);
-      scanner.expect(' GMT');
       scanner.expectDone();
 
       return _makeDateTime(year, month, day, time);
-    }
-
-    // asctime follows the weekday with a space.
-    scanner.expect(' ');
-    final month = _parseMonth(scanner);
-    scanner.expect(' ');
-    final day =
-        scanner.scan(' ') ? _parseInt(scanner, 1) : _parseInt(scanner, 2);
-    scanner.expect(' ');
-    final time = _parseTime(scanner);
-    scanner.expect(' ');
-    final year = _parseInt(scanner, 4);
-    scanner.expectDone();
-
-    return _makeDateTime(year, month, day, time);
-  });
-}
+    });
 
 /// Parses a short-form month name to a form accepted by [DateTime].
 int _parseMonth(StringScanner scanner) {
diff --git a/lib/src/media_type.dart b/lib/src/media_type.dart
index 8d0b082..71b16b2 100644
--- a/lib/src/media_type.dart
+++ b/lib/src/media_type.dart
@@ -40,41 +40,40 @@
   /// Parses a media type.
   ///
   /// This will throw a FormatError if the media type is invalid.
-  factory MediaType.parse(String mediaType) {
-    // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
-    // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
-    return wrapFormatException('media type', mediaType, () {
-      final scanner = StringScanner(mediaType);
-      scanner.scan(whitespace);
-      scanner.expect(token);
-      final type = scanner.lastMatch[0];
-      scanner.expect('/');
-      scanner.expect(token);
-      final subtype = scanner.lastMatch[0];
-      scanner.scan(whitespace);
-
-      final parameters = <String, String>{};
-      while (scanner.scan(';')) {
+  factory MediaType.parse(String mediaType) =>
+      // This parsing is based on sections 3.6 and 3.7 of the HTTP spec:
+      // http://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html.
+      wrapFormatException('media type', mediaType, () {
+        final scanner = StringScanner(mediaType);
         scanner.scan(whitespace);
         scanner.expect(token);
-        final attribute = scanner.lastMatch[0];
-        scanner.expect('=');
+        final type = scanner.lastMatch[0];
+        scanner.expect('/');
+        scanner.expect(token);
+        final subtype = scanner.lastMatch[0];
+        scanner.scan(whitespace);
 
-        String value;
-        if (scanner.scan(token)) {
-          value = scanner.lastMatch[0];
-        } else {
-          value = expectQuotedString(scanner);
+        final parameters = <String, String>{};
+        while (scanner.scan(';')) {
+          scanner.scan(whitespace);
+          scanner.expect(token);
+          final attribute = scanner.lastMatch[0];
+          scanner.expect('=');
+
+          String value;
+          if (scanner.scan(token)) {
+            value = scanner.lastMatch[0];
+          } else {
+            value = expectQuotedString(scanner);
+          }
+
+          scanner.scan(whitespace);
+          parameters[attribute] = value;
         }
 
-        scanner.scan(whitespace);
-        parameters[attribute] = value;
-      }
-
-      scanner.expectDone();
-      return MediaType(type, subtype, parameters);
-    });
-  }
+        scanner.expectDone();
+        return MediaType(type, subtype, parameters);
+      });
 
   MediaType(String type, String subtype, [Map<String, String> parameters])
       : type = type.toLowerCase(),