dotnet / maui

.NET MAUI is the .NET Multi-platform App UI, a framework for building native device applications spanning mobile, tablet, and desktop.
https://dot.net/maui
MIT License
22.28k stars 1.76k forks source link

Blazor Hybrid Webview cannot be force reloaded for urls containing query parameters with a dot (.) #25689

Open modplug opened 3 weeks ago

modplug commented 3 weeks ago

Description

There is an issue in Blazor MAUI where URLs containing a query parameter with a dot (.) cannot be force reloaded.

The issue stems from the Path.HasExtension method, which incorrectly identifies the query parameter as a file extension. This causes the URL to be treated as a file path, leading to unexpected behavior when attempting a force reload.

Path.HasExtension is being used from [UriExtensions] in BlazorWebView (https://github.com/dotnet/maui/blob/main/src/BlazorWebView/src/Maui/Extensions/UriExtensions.cs)

Steps to Reproduce

Steps to Reproduce

Link to public reproduction project repository

https://github.com/modplug/HybridMauiQueryParamsFailureRepro

Version with bug

8.0.92 SR9.2

Is this a regression from previous behavior?

Not sure, did not test other versions

Last version that worked well

Unknown/Other

Affected platforms

iOS, Android

Affected platform versions

No response

Did you find any workaround?

I haven't been able to find a way around this since the url parsing and navigation is internal in

Relevant log output

private void TestIfUrlIsBaseOfPage()
    {
        var urlWithoutQueryParameterWithDot = "https://example.com/customer?weight=62";
        var urlWithQueryParameterWithDot = "https://example.com/customer?weight=62.5";

        var isAddressWithoutDotBaseOfPage = new Uri("https://example.com").IsBaseOfPage(urlWithoutQueryParameterWithDot); // true
        var isAddressWithDotBaseOfPage = new Uri("https://example.com").IsBaseOfPage(urlWithQueryParameterWithDot); // false but expected true

        var isAddressWithoutDotAFilePath = Path.HasExtension(urlWithoutQueryParameterWithDot); // false
        var isAddressWithDotAFilePath = Path.HasExtension(urlWithQueryParameterWithDot); // true but expected false

        Console.WriteLine($"{urlWithoutQueryParameterWithDot}: {nameof(isAddressWithoutDotBaseOfPage)}: {isAddressWithoutDotBaseOfPage}");
        Console.WriteLine($"{urlWithQueryParameterWithDot}: {nameof(isAddressWithDotBaseOfPage)}: {isAddressWithDotBaseOfPage}");
        Console.WriteLine($"{urlWithoutQueryParameterWithDot}: {nameof(isAddressWithoutDotAFilePath)}: {isAddressWithoutDotAFilePath}");
        Console.WriteLine($"{urlWithQueryParameterWithDot}: {nameof(isAddressWithDotAFilePath)}: {isAddressWithDotAFilePath}");
    }

this outputs:
https://example.com/customer?weight=62: isAddressWithoutDotBaseOfPage: True
https://example.com/customer?weight=62.5: isAddressWithDotBaseOfPage: False
https://example.com/customer?weight=62: isAddressWithoutDotAFilePath: False
https://example.com/customer?weight=62.5: isAddressWithDotAFilePath: True
ninachen03 commented 3 weeks ago

This issue has been verified using Visual Studio 17.12.0 Preview 5( 8.0.92 & 8.0.3). Can repro this issue. Image