Skip to content

Conversation

@Saqib198
Copy link

@Saqib198 Saqib198 commented Dec 9, 2025

This PR restores the correct precedence behavior for web development server configuration. Since Flutter 3.38, CLI arguments were being ignored when web_dev_config.yaml was present — specifically for HTTPS and headers.

According to the design and documentation, the precedence should be:

  1. Command-line arguments (highest priority)
  2. web_dev_config.yaml
  3. Built-in defaults (lowest priority)

Root Cause

The regression affected:

  • HTTP headers — merge order was reversed, causing file config to override CLI
  • HTTPS config — CLI TLS arguments were ignored under certain conditions

Note:
--web-port and --web-hostname were already working correctly due to the host ?? this.host and port ?? this.port pattern.
The observed issue was due to headers + HTTPS only.

Changes Made

  • Fixed header merge order so CLI takes precedence
  • Corrected HTTPS config resolution and precedence logic
  • Unified logic across run and drive commands
  • Simplified HTTPS handling using HttpsConfig.parse()
  • Added tests for CLI precedence behavior

Before (broken)

flutter run -d chrome --web-tls-cert-path cert.pem

❌ CLI TLS args ignored when config file existed
❌ headers overridden by file config

After (fixed)

flutter run -d chrome --web-tls-cert-path cert.pem

✅ CLI TLS args respected
✅ headers override config as expected

Tests

  • Added tests verifying CLI takes precedence
  • All existing and new tests pass
  • No breaking changes introduced

Fixes

Fixes: #179014

@flutter-dashboard
Copy link

It looks like this pull request may not have tests. Please make sure to add tests or get an explicit test exemption before merging.

If you are not sure if you need tests, consider this rule of thumb: the purpose of a test is to make sure someone doesn't accidentally revert the fix. Ask yourself, is there anything in your PR that you feel it is important we not accidentally revert back to how it was before your fix?

Reviewers: Read the Tree Hygiene page and make sure this patch meets those guidelines before LGTMing. If you believe this PR qualifies for a test exemption, contact "@test-exemption-reviewer" in the #hackers channel in Discord (don't just cc them here, they won't see it!). The test exemption team is a small volunteer group, so all reviewers should feel empowered to ask for tests, without delegating that responsibility entirely to the test exemption group.

@google-cla
Copy link

google-cla bot commented Dec 9, 2025

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@github-actions github-actions bot added the tool Affects the "flutter" command-line tool. See also t: labels. label Dec 9, 2025
Copy link
Contributor

@gemini-code-assist gemini-code-assist bot left a comment

Choose a reason for hiding this comment

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

Code Review

This pull request adjusts the configuration loading logic to ensure that command-line arguments have precedence over settings in web_dev_config.yaml. The changes affect how HTTPS configuration and web server headers are processed in the drive and run commands. Specifically, the order of merging headers is corrected in WebDevServerConfig.copyWith, and the logic for determining HttpsConfig is updated in both DriveCommand and RunCommand. While the changes are mostly correct, I've identified a logical flaw in drive.dart where CLI arguments for HTTPS are incorrectly ignored if a configuration file is not present, and I've provided a suggestion to align it with the correct implementation in run.dart.

@Saqib198
Copy link
Author

Thanks for the review!
You're absolutely right — the previous logic in drive.dart was incorrectly depending on fileConfig != null, which caused CLI HTTPS arguments to be ignored when no config file was present.

I've updated the logic to match run.dart so that:

CLI arguments always take precedence

File config works only as a fallback

HTTPS config is correctly applied even without web_dev_config.yaml

Please let me know if anything else is needed.

@bkonyi bkonyi added the team-web Owned by Web platform team label Dec 11, 2025
@bkonyi bkonyi requested review from bkonyi and mdebbar December 11, 2025 16:04
Copy link
Contributor

@bkonyi bkonyi left a comment

Choose a reason for hiding this comment

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

Thanks for the PR @Saqib198!

This looks good to me in general, with a couple of minor suggestions. Also, this will need a test before it can be submitted.

// Determine HTTPS config with CLI > file precedence
// If CLI provides TLS certs, use them (with file config as fallback for missing values)
// If CLI doesn't provide TLS certs, use file config
final HttpsConfig? httpsConfig;
Copy link
Contributor

Choose a reason for hiding this comment

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

Consider doing this instead (also in drive.dart):

final HttpsConfig? httpsConfig = (fileConfig.https ?? HttpsConfig()).copyWith(
  certPath: stringArg('web-tls-cert-path'),
  certKeyPath: stringArg('web-tls-cert-key-path'),
);

Copy link
Author

Choose a reason for hiding this comment

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

Thanks for the suggestion @bkonyi!

I tried implementing it, but HttpsConfig() cannot be instantiated without arguments since both certPath and certKeyPath are required parameters in the constructor:

const HttpsConfig({required this.certPath, required this.certKeyPath});

Instead, I've simplified the code using HttpsConfig.parse() which handles all the cases cleanly:

final HttpsConfig? httpsConfig = HttpsConfig.parse(
stringArg('web-tls-cert-path') ?? fileConfig.https?.certPath,
stringArg('web-tls-cert-key-path') ?? fileConfig.https?.certKeyPath,
);

This achieves the same simplification (reduced from 15 lines to 4 lines) while:

  • CLI args take precedence over file config
  • Falls back to file config values when CLI args not provided
  • Returns null if neither provides both values
  • Throws ArgumentError if only one path is provided (existing behavior)

I've also added tests for CLI precedence as requested. Let me know if you'd like any changes!

@Saqib198 Saqib198 force-pushed the fix-web-cli-precedence branch from 4521acd to 5f030a9 Compare December 11, 2025 17:49
@github-actions github-actions bot removed the team-web Owned by Web platform team label Dec 11, 2025
}
}

Future<WebDevServerConfig> webDevServerConfigCore() async {
Copy link
Contributor

Choose a reason for hiding this comment

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

@Saqib198 – I moved things into this shared function so we have fewer places to keep this logic up-to-date!

@kevmoo
Copy link
Contributor

kevmoo commented Dec 12, 2025

I took over a bit to fix the analyzer and format issue and to do a tiny bit of cleanup

@Saqib198
Copy link
Author

Hi @mdebbar 👋
Just a gentle ping on this when you get a chance.
All tests are green and @kevmoo has already applied cleanup/refactors.
Thanks!

@mdebbar
Copy link
Contributor

mdebbar commented Dec 16, 2025

Sorry for the delay here!

Help me understand. The way I'm seeing this PR, it seems to fix the precedence for https and headers. It doesn't change the precedence for the other mentioned arguments: web-port, web-hostname. Are those already working correctly, or am I missing something?

List<ProxyRule>? proxy,
}) {
return WebDevServerConfig(
host: host ?? this.host,
Copy link
Contributor

Choose a reason for hiding this comment

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

Yeah, these should all be changed, too – right? @Saqib198

RE comments from @mdebbar

Copy link
Contributor

Choose a reason for hiding this comment

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

I believe the way they are now is correct. But the issue says web-port's and web-hostname's precedence is incorrect, which is confusing.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ah!

I get it.

By putting headers after this.headers, it overwrites.

But with port and host, the ?? has things the other way.

So it reads weird, but I think the code as it is now is correct.

Copy link
Contributor

Choose a reason for hiding this comment

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

But I agree, I see no code changes for anything but headers.

So was it really broken? Or are we missing something?

Copy link
Author

Choose a reason for hiding this comment

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

Thanks for calling this out — happy to clarify.

You’re right that web-port and web-hostname already had correct CLI > file precedence.
They use the pattern:

host: host ?? this.host,
port: port ?? this.port,

where host / port come from the CLI layer, so CLI values correctly override
web_dev_config.yaml today.

The regression introduced in 3.38 specifically affected:
• headers (due to merge order: {...?headers, ...this.headers})
• HTTPS config (due to conditional logic that ignored CLI TLS args when file config
was present or missing)

That’s why this PR only changes:
• header merge order
• HTTPS config resolution

The issue description mentioned web-port / web-hostname because the symptom users
observed was “CLI args ignored”, but the actual root cause was headers + HTTPS.
Port/hostname were already behaving correctly, so no change was needed there.

Happy to update the PR description or issue wording if that helps reduce confusion.

Copy link
Contributor

Choose a reason for hiding this comment

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

Ok, that makes more sense. Thanks for clarifying!

I would say yes let's update the issue and PR descriptions. If it confused me and @kevmoo, I'm sure it'll confuse more people later when they look at the history of this code.

Copy link
Contributor

@mdebbar mdebbar left a comment

Choose a reason for hiding this comment

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

LGTM

@Saqib198 Saqib198 changed the title Fix: Restore CLI precedence over web_dev_config.yaml Restore CLI precedence for web headers and HTTPS over web_dev_config.yaml Dec 17, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

tool Affects the "flutter" command-line tool. See also t: labels.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Flutter 3.38 run command line arguments not working for web development config

4 participants