Skip to content

fix: preserve URL extensions for generic downloads - #543

Open
rahulshahDEV wants to merge 4 commits into
Baseflow:mainfrom
rahulshahDEV:fix/489-extension-fallback
Open

rahulshahDEV wants to merge 4 commits into
Baseflow:mainfrom
rahulshahDEV:fix/489-extension-fallback

Conversation

@rahulshahDEV

@rahulshahDEV rahulshahDEV commented Oct 25, 2026 •

Copy link
Copy Markdown

✨ What kind of change does this PR introduce? (Bug fix, feature, docs update...)

Bug fix.

⤵️ What is the current behavior?

When a download response uses application/octet-stream, the cache manager gives the cached file a .bin extension even when its URL ends in a meaningful extension such as .mp4.

🆕 What is the new behavior (if this is a feature change)?

Responses with a missing or generic Content-Type use a safe final extension from the URL path; invalid path, control, or platform-reserved characters fall back to the MIME extension (.bin for a generic type). A specific response MIME type remains authoritative, and query parameters do not affect the extension. The legacy adapter follows the same rule. The exported HttpGetResponse(response) constructor remains supported and uses the response request URL when available.

💥 Does this PR introduce a breaking change?

No.

🐛 Recommendations for testing

Before this follow-up, format, analyze, and coverage tests passed with Flutter 3.47.4. After the follow-up, dart format --output=none --set-exit-if-changed passed for all four changed Dart files; the changed-file analyzer passed; and flutter test --coverage passed all 118 tests with Flutter 3.49.0-0.1.pre. The added regressions cover one-argument constructor compatibility and an encoded slash in a URL suffix. Package-wide analyze on the available 3.49.0-0.1.pre SDK reports six existing Material migration infos in untouched example/test files; changed files analyze clean. CI should validate the example builds on supported platforms.

📝 Links to relevant issues/docs

Closes #489.

🤔 Checklist before submitting

  • All projects build (CI will validate the platform example builds)
  • Follows style guide lines (code style guide)
  • Relevant documentation was updated
  • Rebased onto current main
  • Version bumped and dated CHANGELOG entry added

Comment thread flutter_cache_manager/lib/src/web/mime_converter.dart
Comment thread flutter_cache_manager/lib/src/web/mime_converter.dart Outdated
Comment thread flutter_cache_manager/lib/src/web/mime_converter.dart
Comment thread flutter_cache_manager/lib/src/web/mime_converter.dart
Comment thread flutter_cache_manager/lib/src/compat/file_service_compat.dart Outdated
Comment thread flutter_cache_manager/lib/src/web/file_service.dart Outdated
@rahulshahDEV
rahulshahDEV force-pushed the fix/489-extension-fallback branch from 8afb8d4 to 69f551a Compare October 27, 2026 10:59
String get fileExtension => mimeTypes[mimeType] ?? '.$subType';
}

final RegExp _safeFileExtension = RegExp(r'^\.[A-Za-z0-9]{1,10}$');

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Nit, non-blocking: all-digit suffixes still pass, so /api/v1.2 or /reports/q3.2024 served as application/octet-stream are cached as .2 / .2024 instead of .bin (the v1.2-beta test only covers the hyphen case). Requiring at least one letter keeps .mp4, .7z, .3gp working:

Suggested change
final RegExp _safeFileExtension = RegExp(r'^\.[A-Za-z0-9]{1,10}$');
final RegExp _safeFileExtension = RegExp(r'^\.(?=[A-Za-z0-9]*[A-Za-z])[A-Za-z0-9]{1,10}$');

plus a test for https://example.com/api/v1.2 → .bin.

@rickdijk

Copy link
Copy Markdown
Contributor

Re-reviewed at 69f551a: all earlier comments are addressed and covered by tests. Locally dart format --set-exit-if-changed, flutter analyze and flutter test (132 tests) pass on Flutter stable. Two small non-code things before merge:

  • PR description is out of date. "invalid path, control, or platform-reserved characters fall back" no longer describes the logic (it's now a short-alphanumeric allowlist, a list of generic MIME types, and ignored .php/.asp*/.cgi/.jsp). The testing section still cites 118 tests on a 3.49 pre-release SDK. Per AGENTS.md, please keep "Recommendations for testing" to one or two sentences about what ran.
  • CHANGELOG wording: "tolerates malformed legacy URLs" describes a regression introduced and fixed within this PR, so it means nothing to 3.4.6 users. Something like: Uses the URL's file extension when a download's content type is missing or generic (e.g. application/octet-stream, binary/octet-stream) (#489).

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

Successfully merging this pull request may close these issues.

Downloaded files are always stored as .bin instead of preserving the original extension

2 participants