Steps to Reproduce
- Use Windows machine in a corporate network behind an HTTP/HTTPS proxy.
- Ensure proxy is configured at system level (and optionally environment variables are set).
- Create or use a Flutter app with a native asset hook that downloads a binary over HTTPS (example below). (add pdfrx dependency in pubspec.yaml)
- Run:
flutter clean
flutter run -d windows -v
Expected results
flutter run -d windows should honor the system proxy (or inherited proxy settings) during native asset hook execution and complete successfully.
Actual results
The native asset download fails with socket/proxy-related network errors, e.g.:
ClientException with SocketException : The semaphore timeout period has expired
(OS error : The semaphore timeout period has expired, errno = 121),
address = github.com, port = <ephemeral>,
uri=https://github.com/bblanchon/pdfium-binaries/releases/download/chromium%2F7811/pdfium-win-x64.tgz
Build then fails with:
Target dart_build failed : error : Building native assets failed
MSB8066 ... exited with code 1
Minimal hook example
(see packages/pdfium_dart/hook)
import 'dart:io';
import 'package:archive/archive_io.dart';
import 'package:code_assets/code_assets.dart';
import 'package:hooks/hooks.dart';
import 'package:http/http.dart' as http;
const _pdfiumRelease = 'chromium%2F7811';
const _assetName = 'libpdfium';
void main(List<String> args) async {
await build(args, (input, output) async {
if (!input.config.buildCodeAssets) return;
if (input.config.code.targetOS == OS.iOS) return;
final target = _PdfiumTarget.fromCodeConfig(input.config.code);
final outputSubdir = _pdfiumRelease.replaceAll('%2F', '_');
final outputFile = input.outputDirectoryShared.resolve(
'$outputSubdir/${target.archivePlatform}-${target.archiveArch}/${target.libraryFileName}',
);
await _downloadPdfium(
outputFile: outputFile,
target: target,
pdfiumRelease: _pdfiumRelease,
);
output.assets.code.add(
CodeAsset(
package: input.packageName,
name: _assetName,
linkMode: DynamicLoadingBundled(),
file: outputFile,
),
);
});
}
Future<void> _downloadPdfium({
required Uri outputFile,
required _PdfiumTarget target,
required String pdfiumRelease,
}) async {
final output = File.fromUri(outputFile);
if (await output.exists()) return;
final archiveUri = Uri.parse(
'https://github.com/bblanchon/pdfium-binaries/releases/download/'
'$pdfiumRelease/pdfium-${target.archivePlatform}-${target.archiveArch}.tgz',
);
final response = await http.Client().get(archiveUri);
if (response.statusCode != 200) {
throw Exception('Failed to download PDFium: $archiveUri');
}
final archive = TarDecoder().decodeBytes(
GZipDecoder().decodeBytes(response.bodyBytes),
);
final member = archive.findFile(target.archiveLibraryPath);
if (member == null) {
throw Exception(
'PDFium archive $archiveUri does not contain ${target.archiveLibraryPath}.',
);
}
await output.parent.create(recursive: true);
await output.writeAsBytes(member.content as List<int>);
}
final class _PdfiumTarget {
const _PdfiumTarget({
required this.archivePlatform,
required this.archiveArch,
required this.archiveLibraryPath,
required this.libraryFileName,
});
final String archivePlatform;
final String archiveArch;
final String archiveLibraryPath;
final String libraryFileName;
static _PdfiumTarget fromCodeConfig(CodeConfig config) {
final arch = switch (config.targetArchitecture) {
Architecture.ia32 => 'x86',
Architecture.x64 => 'x64',
Architecture.arm => 'arm',
Architecture.arm64 => 'arm64',
_ => throw UnsupportedError(
'Unsupported PDFium architecture: ${config.targetArchitecture}',
),
};
return switch (config.targetOS) {
OS.android => _PdfiumTarget(
archivePlatform: 'android',
archiveArch: arch,
archiveLibraryPath: 'lib/libpdfium.so',
libraryFileName: 'libpdfium.so',
),
OS.windows => _PdfiumTarget(
archivePlatform: 'win',
archiveArch: arch,
archiveLibraryPath: 'bin/pdfium.dll',
libraryFileName: 'pdfium.dll',
),
OS.linux => _PdfiumTarget(
archivePlatform: 'linux',
archiveArch: arch,
archiveLibraryPath: 'lib/libpdfium.so',
libraryFileName: 'libpdfium.so',
),
OS.macOS => _PdfiumTarget(
archivePlatform: 'mac',
archiveArch: arch,
archiveLibraryPath: 'lib/libpdfium.dylib',
libraryFileName: 'libpdfium.dylib',
),
_ => throw UnsupportedError(
'Unsupported PDFium platform: ${config.targetOS}',
),
};
}
}
Additional observations
- Running the generated hook command manually can work:
dart ...hook.dill --config=...
flutter build windows may work in some cases, but flutter run -d windows fails consistently after flutter clean.
curl to the same URL works from the same machine/user session.
Proposal
Please ensure native asset hook network operations in flutter run on Windows correctly use proxy settings from:
- system proxy configuration, and/or
- inherited
HTTP_PROXY / HTTPS_PROXY / NO_PROXY environment variables.
Potentially document or provide a standard proxy-aware HTTP helper for hook authors so corporate network scenarios work out-of-the-box.
Flutter Doctor
flutter doctor -v
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 3.41.5, on Microsoft Windows [Version 10.0.26200.8457], locale en-GB)
[√] Windows Version (11 Pro 64-bit, 25H2, 2009)
[!] Android toolchain - develop for Android devices (Android SDK version 35.0.0)
! Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses
[√] Chrome - develop for the web
[√] Visual Studio - develop Windows apps (Visual Studio Build Tools 2022 17.5.3)
[√] Proxy Configuration
[√] Connected device (3 available)
[√] Network resources
Steps to Reproduce
Expected results
flutter run -d windowsshould honor the system proxy (or inherited proxy settings) during native asset hook execution and complete successfully.Actual results
The native asset download fails with socket/proxy-related network errors, e.g.:
Build then fails with:
Target dart_build failed : error : Building native assets failedMSB8066 ... exited with code 1Minimal hook example
(see packages/pdfium_dart/hook)
Additional observations
dart ...hook.dill --config=...flutter build windowsmay work in some cases, butflutter run -d windowsfails consistently afterflutter clean.curlto the same URL works from the same machine/user session.Proposal
Please ensure native asset hook network operations in
flutter runon Windows correctly use proxy settings from:HTTP_PROXY/HTTPS_PROXY/NO_PROXYenvironment variables.Potentially document or provide a standard proxy-aware HTTP helper for hook authors so corporate network scenarios work out-of-the-box.
Flutter Doctor
flutter doctor -v