Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CacheManager attempts to create file named guid.* on Windows (full example included and clear description) #435

Open
iulian0512 opened this issue Nov 8, 2023 · 0 comments

Comments

@iulian0512
Copy link

🐛 Bug Report

While downloading an image from a webserver the cache manager decides to create a filename ending with .* which is not permitted on windows.

Expected behavior

Create a filename without extension or a generic extension like .cache or .file since the cache manager cannot determine it from the webserver headers.

Reproduction steps

i have made minimal reproducible example no external dependencies needed (other than http package)
i am aware that the server should provide correct descriptive headers for the content being served but sometimes it happens not to in some scenarios.

import 'package:flutter_cache_manager/flutter_cache_manager.dart';
import 'package:http/http.dart' as http;
import 'package:http/testing.dart';

Future<void> main() async {
  final client = MockClient((http.Request request) async =>
      http.Response("a png image", 200, headers: {
        "content-type": "application/*",
        "content-disposition":
            "attachment; filename=file; filename*=UTF-8''file"
      }));

  final cmgr = CacheManager(Config(DefaultCacheManager.key,
      fileService: HttpFileService(httpClient: client)));

/* crashes with
  Launching lib\main.dart on Windows in debug mode...
  √  Built build\windows\runner\Debug\cache_mgr_test.exe.
  [ERROR:flutter/runtime/dart_vm_initializer.cc(41)] Unhandled Exception: FileSystemException: Cannot open file, path = 'C:\Users\csman\AppData\Local\Temp\libCachedImageData\cf09f070-6cef-1d8a-b096-2334712b3134.*' (OS Error: The filename, directory name, or volume label syntax is incorrect.

  , errno = 123)
  #0      _checkForErrorResponse (dart:io/common.dart:55:9)
  #1      _File.open.<anonymous closure> (dart:io/file_impl.dart:381:7)
  <asynchronous suspension>
*/

  await cmgr.downloadFile("http://myaddress.com/imageManager?pngfileid=1234");
}

/*
pubspec.yaml 

name: cache_mgr_test
description: A new Flutter project.
publish_to: "none"
version: 1.0.0+1
environment:
  sdk: ">=3.1.5 <4.0.0"
dependencies:
  cupertino_icons: ^1.0.2
  flutter:
    sdk: flutter
  flutter_cache_manager: ^3.3.1
  http: ^1.1.0
dev_dependencies:
  flutter_lints: ^2.0.0
  flutter_test:
    sdk: flutter
flutter:
  uses-material-design: true
*/

Configuration

Version: 3.3.1

Platform:
Windows 10

I think the problematic part is in \flutter_cache_manager-3.3.1\lib\src\web\file_service.dart line 115 around

  @override
  String get fileExtension {
    var fileExtension = '';
    final contentTypeHeader = _header(HttpHeaders.contentTypeHeader);
    if (contentTypeHeader != null) {
      final contentType = ContentType.parse(contentTypeHeader);
      fileExtension = contentType.fileExtension;
    }
    return fileExtension;
  }
iulian0512 added a commit to iulian0512/flutter_cache_manager that referenced this issue Nov 8, 2023
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant