[video_player_platform_interface] add http headers (#3702)

platform_interface portion of #3671
diff --git a/packages/video_player/video_player_platform_interface/CHANGELOG.md b/packages/video_player/video_player_platform_interface/CHANGELOG.md
index d0c59bd..2463151 100644
--- a/packages/video_player/video_player_platform_interface/CHANGELOG.md
+++ b/packages/video_player/video_player_platform_interface/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 4.1.0
+
+* Add `httpHeaders` to `DataSource`
+
 ## 4.0.0
 
 * **Breaking Changes**:
diff --git a/packages/video_player/video_player_platform_interface/lib/messages.dart b/packages/video_player/video_player_platform_interface/lib/messages.dart
index 2b7d882..0ddbfae 100644
--- a/packages/video_player/video_player_platform_interface/lib/messages.dart
+++ b/packages/video_player/video_player_platform_interface/lib/messages.dart
@@ -31,6 +31,7 @@
   String? uri;
   String? packageName;
   String? formatHint;
+  Map<Object?, Object?>? httpHeaders;
 
   Object encode() {
     final Map<Object?, Object?> pigeonMap = <Object?, Object?>{};
@@ -38,6 +39,7 @@
     pigeonMap['uri'] = uri;
     pigeonMap['packageName'] = packageName;
     pigeonMap['formatHint'] = formatHint;
+    pigeonMap['httpHeaders'] = httpHeaders;
     return pigeonMap;
   }
 
@@ -47,7 +49,8 @@
       ..asset = pigeonMap['asset'] as String?
       ..uri = pigeonMap['uri'] as String?
       ..packageName = pigeonMap['packageName'] as String?
-      ..formatHint = pigeonMap['formatHint'] as String?;
+      ..formatHint = pigeonMap['formatHint'] as String?
+      ..httpHeaders = pigeonMap['httpHeaders'] as Map<Object?, Object?>?;
   }
 }
 
diff --git a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart
index bd9708a..e92e870 100644
--- a/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart
+++ b/packages/video_player/video_player_platform_interface/lib/method_channel_video_player.dart
@@ -37,6 +37,7 @@
       case DataSourceType.network:
         message.uri = dataSource.uri;
         message.formatHint = _videoFormatStringMap[dataSource.formatHint];
+        message.httpHeaders = dataSource.httpHeaders;
         break;
       case DataSourceType.file:
         message.uri = dataSource.uri;
diff --git a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
index 1960253..b2bff99 100644
--- a/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
+++ b/packages/video_player/video_player_platform_interface/lib/video_player_platform_interface.dart
@@ -151,6 +151,7 @@
     this.formatHint,
     this.asset,
     this.package,
+    this.httpHeaders = const {},
   });
 
   /// The way in which the video was originally loaded.
@@ -169,6 +170,11 @@
   /// detection with whatever is set here.
   final VideoFormat? formatHint;
 
+  /// HTTP headers used for the request to the [uri].
+  /// Only for [DataSourceType.network] videos.
+  /// Always empty for other video types.
+  Map<String, String> httpHeaders;
+
   /// The name of the asset. Only set for [DataSourceType.asset] videos.
   final String? asset;
 
diff --git a/packages/video_player/video_player_platform_interface/pubspec.yaml b/packages/video_player/video_player_platform_interface/pubspec.yaml
index c85f483..98e1c95 100644
--- a/packages/video_player/video_player_platform_interface/pubspec.yaml
+++ b/packages/video_player/video_player_platform_interface/pubspec.yaml
@@ -3,7 +3,7 @@
 homepage: https://github.com/flutter/plugins/tree/master/packages/video_player/video_player_platform_interface
 # NOTE: We strongly prefer non-breaking changes, even at the expense of a
 # less-clean API. See https://flutter.dev/go/platform-interface-breaking-changes
-version: 4.0.0
+version: 4.1.0
 
 dependencies:
   flutter:
diff --git a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
index 00ec643..33a5b34 100644
--- a/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
+++ b/packages/video_player/video_player_platform_interface/test/method_channel_video_player_test.dart
@@ -141,8 +141,26 @@
         formatHint: VideoFormat.dash,
       ));
       expect(log.log.last, 'create');
+      expect(log.createMessage?.asset, null);
       expect(log.createMessage?.uri, 'someUri');
+      expect(log.createMessage?.packageName, null);
       expect(log.createMessage?.formatHint, 'dash');
+      expect(log.createMessage?.httpHeaders, {});
+      expect(textureId, 3);
+    });
+
+    test('create with network (some headers)', () async {
+      final int? textureId = await player.create(DataSource(
+        sourceType: DataSourceType.network,
+        uri: 'someUri',
+        httpHeaders: {'Authorization': 'Bearer token'},
+      ));
+      expect(log.log.last, 'create');
+      expect(log.createMessage?.asset, null);
+      expect(log.createMessage?.uri, 'someUri');
+      expect(log.createMessage?.packageName, null);
+      expect(log.createMessage?.formatHint, null);
+      expect(log.createMessage?.httpHeaders, {'Authorization': 'Bearer token'});
       expect(textureId, 3);
     });