Bump min SDK to 2.17 (#69)

Move to dart_flutter_team_lints and fix related issues
diff --git a/.github/workflows/test-package.yml b/.github/workflows/test-package.yml
index f13a5f2..356b8d6 100644
--- a/.github/workflows/test-package.yml
+++ b/.github/workflows/test-package.yml
@@ -44,7 +44,7 @@
       fail-fast: false
       matrix:
         os: [ubuntu-latest]
-        sdk: [2.12.0, dev]
+        sdk: [2.17.0, dev]
     steps:
       - uses: actions/checkout@ac593985615ec2ede58e132d2e21d2b1cbd6127c
       - uses: dart-lang/setup-dart@a57a6c04cf7d4840e88432aad6281d1e125f0d46
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 29b3491..9f856f9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 4.0.3-dev
+
+* Require Dart 2.17
+
 ## 4.0.2
 
 * Remove `package:charcode` from dev_dependencies.
diff --git a/analysis_options.yaml b/analysis_options.yaml
index acc502f..a18a7f7 100644
--- a/analysis_options.yaml
+++ b/analysis_options.yaml
@@ -1,76 +1,39 @@
-include: package:lints/recommended.yaml
+# https://dart.dev/guides/language/analysis-options
+include: package:dart_flutter_team_lints/analysis_options.yaml
 
 analyzer:
   language:
     strict-casts: true
+    strict-inference: true
+    strict-raw-types: true
 
 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
-    - avoid_returning_null_for_void
     - avoid_returning_this
-    - avoid_single_cascade_in_expression_statements
     - avoid_unused_constructor_parameters
     - avoid_void_async
-    - await_only_futures
-    - camel_case_types
     - cancel_subscriptions
     - comment_references
-    - constant_identifier_names
-    - control_flow_in_finally
-    - directives_ordering
-    - empty_statements
-    - file_names
-    - hash_and_equals
-    - implementation_imports
-    - 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
-    - unnecessary_brace_in_string_interps
-    - unnecessary_getters_setters
-    - unnecessary_lambdas
-    - unnecessary_null_aware_assignments
-    - unnecessary_overrides
-    - unnecessary_parenthesis
-    - unnecessary_statements
-    - unnecessary_string_interpolations
+    - use_if_null_to_convert_nulls_to_bools
+    - use_raw_strings
     - use_string_buffers
-    - void_checks
+    - use_super_parameters
diff --git a/lib/src/authentication_challenge.dart b/lib/src/authentication_challenge.dart
index 356e0a2..7eebc43 100644
--- a/lib/src/authentication_challenge.dart
+++ b/lib/src/authentication_challenge.dart
@@ -125,15 +125,16 @@
   }
 
   /// Scans a single authentication parameter and stores its result in [params].
-  static void _scanAuthParam(StringScanner scanner, Map params) {
+  static void _scanAuthParam(
+      StringScanner scanner, Map<String, String> params) {
     scanner.expect(token, name: 'a token');
-    final name = scanner.lastMatch![0];
+    final name = scanner.lastMatch![0]!;
     scanner.scan(whitespace);
     scanner.expect('=');
     scanner.scan(whitespace);
 
     if (scanner.scan(token)) {
-      params[name] = scanner.lastMatch![0];
+      params[name] = scanner.lastMatch![0]!;
     } else {
       params[name] =
           expectQuotedString(scanner, name: 'a token or a quoted string');
diff --git a/pubspec.yaml b/pubspec.yaml
index fc15f69..4e349b1 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,11 +1,11 @@
 name: http_parser
-version: 4.0.2
+version: 4.0.3-dev
 description: >-
   A platform-independent package for parsing and serializing HTTP formats.
 repository: https://github.com/dart-lang/http_parser
 
 environment:
-  sdk: '>=2.12.0 <3.0.0'
+  sdk: '>=2.17.0 <3.0.0'
 
 dependencies:
   collection: ^1.15.0
@@ -14,5 +14,5 @@
   typed_data: ^1.3.0
 
 dev_dependencies:
-  lints: ^1.0.0
+  dart_flutter_team_lints: ^0.1.0
   test: ^1.16.0
diff --git a/test/authentication_challenge_test.dart b/test/authentication_challenge_test.dart
index 6184d3e..52d798c 100644
--- a/test/authentication_challenge_test.dart
+++ b/test/authentication_challenge_test.dart
@@ -7,8 +7,7 @@
 
 void main() {
   group('parse', () {
-    _singleChallengeTests(
-        (challenge) => AuthenticationChallenge.parse(challenge));
+    _singleChallengeTests(AuthenticationChallenge.parse);
   });
 
   group('parseHeader', () {
diff --git a/test/case_insensitive_map_test.dart b/test/case_insensitive_map_test.dart
index b08d89b..f62d4fe 100644
--- a/test/case_insensitive_map_test.dart
+++ b/test/case_insensitive_map_test.dart
@@ -7,7 +7,7 @@
 
 void main() {
   test('provides case-insensitive access to the map', () {
-    final map = CaseInsensitiveMap();
+    final map = CaseInsensitiveMap<String>();
     map['fOo'] = 'bAr';
     expect(map, containsPair('FoO', 'bAr'));
 
@@ -16,7 +16,7 @@
   });
 
   test('stores the original key cases', () {
-    final map = CaseInsensitiveMap();
+    final map = CaseInsensitiveMap<String>();
     map['fOo'] = 'bAr';
     expect(map, equals({'fOo': 'bAr'}));
   });
diff --git a/test/chunked_coding_test.dart b/test/chunked_coding_test.dart
index 476a2d2..fc4c13f 100644
--- a/test/chunked_coding_test.dart
+++ b/test/chunked_coding_test.dart
@@ -66,13 +66,13 @@
 
       test('handles empty chunks', () {
         sink.add([]);
-        expect(results, equals([[]]));
+        expect(results, equals([<int>[]]));
 
         sink.add([1, 2, 3]);
         expect(
             results,
             equals([
-              [],
+              <int>[],
               [$3, $cr, $lf, 1, 2, 3, $cr, $lf]
             ]));
 
@@ -80,18 +80,18 @@
         expect(
             results,
             equals([
-              [],
+              <int>[],
               [$3, $cr, $lf, 1, 2, 3, $cr, $lf],
-              []
+              <int>[]
             ]));
 
         sink.close();
         expect(
             results,
             equals([
-              [],
+              <int>[],
               [$3, $cr, $lf, 1, 2, 3, $cr, $lf],
-              [],
+              <int>[],
               [$0, $cr, $lf, $cr, $lf],
             ]));
       });
@@ -108,7 +108,7 @@
 
         test("doesn't add a header if the slice is empty", () {
           sink.addSlice([1, 2, 3, 4, 5], 1, 1, false);
-          expect(results, equals([[]]));
+          expect(results, equals([<int>[]]));
         });
 
         test('adds a footer if isLast is true', () {
diff --git a/test/media_type_test.dart b/test/media_type_test.dart
index 5ee9313..9a4226c 100644
--- a/test/media_type_test.dart
+++ b/test/media_type_test.dart
@@ -61,10 +61,10 @@
 
     test('parses quoted parameters', () {
       final type =
-          MediaType.parse('text/plain; foo="bar space"; baz="bang\\\\escape"');
+          MediaType.parse(r'text/plain; foo="bar space"; baz="bang\\escape"');
       expect(type.mimeType, equals('text/plain'));
       expect(
-          type.parameters, equals({'foo': 'bar space', 'baz': 'bang\\escape'}));
+          type.parameters, equals({'foo': 'bar space', 'baz': r'bang\escape'}));
     });
 
     test('lower-cases type and subtype', () {