Skip to content

Commit 96e208c

Browse files
committed
Guess file type via http request, migrate GetFileSizeAsyncAsLong to HttpClient
1 parent 5fbb445 commit 96e208c

3 files changed

Lines changed: 47 additions & 16 deletions

File tree

src/Directory.Build.props

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<TargetPlatformMinVersion>10.0.19041.0</TargetPlatformMinVersion>
66
<!-- IF BUILD FAILS DUE TO MISSING Microsoft.Management.Deployment NAMESPACE,
77
TOGGLE THE LAST NUMBER OF THE LINE BELOW 1 UNIT UP OR DOWN, AND REBUILD-->
8-
<WindowsSdkPackageVersion>10.0.26100.57</WindowsSdkPackageVersion>
8+
<WindowsSdkPackageVersion>10.0.26100.56</WindowsSdkPackageVersion>
99

1010
<SdkVersion>8.0.407</SdkVersion>
1111
<Authors>Martí Climent and the contributors</Authors>

src/UniGetUI.Core.Tools/Tools.cs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -272,33 +272,53 @@ public static double GetFileSize(Uri? url)
272272

273273
public static async Task<long> GetFileSizeAsyncAsLong(Uri? url)
274274
{
275-
if (url is null)
275+
if (url is null) return 0;
276+
277+
try
278+
{
279+
using HttpClient client = new(CoreTools.GenericHttpClientParameters);
280+
HttpResponseMessage response = await client.SendAsync(new HttpRequestMessage(HttpMethod.Head, url));
281+
return response.Content.Headers.ContentLength ?? 0;
282+
}
283+
catch (Exception e)
276284
{
277-
return 0;
285+
Logger.Warn($"Could not load file size for url={url}");
286+
Logger.Warn(e);
278287
}
279288

289+
return 0;
290+
}
291+
292+
public static string GetFileName(Uri url)
293+
{
280294
try
281295
{
282-
#pragma warning disable SYSLIB0014 // Type or member is obsolete
283-
WebRequest req = WebRequest.Create(url);
284-
#pragma warning restore SYSLIB0014 // Type or member is obsolete
285-
req.Method = "HEAD";
286-
WebResponse resp = await req.GetResponseAsync();
287-
if (long.TryParse(resp.Headers.Get("Content-Length"), out long ContentLength))
296+
var handler = CoreTools.GenericHttpClientParameters;
297+
handler.AllowAutoRedirect = false;
298+
using HttpClient client = new(handler);
299+
HttpResponseMessage response = client.Send(new HttpRequestMessage(HttpMethod.Head, url));
300+
301+
if (response.StatusCode is HttpStatusCode.Moved or HttpStatusCode.Redirect
302+
or HttpStatusCode.RedirectMethod or HttpStatusCode.TemporaryRedirect
303+
or HttpStatusCode.PermanentRedirect)
288304
{
289-
return ContentLength;
305+
return GetFileName(response.Headers.Location ??
306+
throw new HttpRequestException("A redirect code was returned but no new location was given"));
290307
}
291308

309+
return response.Content.Headers.ContentDisposition?.FileName ?? Path.GetFileName(url.LocalPath);
292310
}
293311
catch (Exception e)
294312
{
295-
Logger.Warn($"Could not load file size for url={url}");
313+
Logger.Warn($"Failed to retrieve file name for URL: {url}");
296314
Logger.Warn(e);
315+
return string.Empty;
297316
}
298-
299-
return 0;
300317
}
301318

319+
public static Task<string> GetFileNameAsync(Uri url)
320+
=> Task.Run(() => GetFileName(url));
321+
302322

303323
public struct Version: IComparable
304324
{

src/UniGetUI/AppOperationHelper.cs

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,13 +80,24 @@ public static void Remove(AbstractOperation op)
8080
WinRT.Interop.InitializeWithWindow.Initialize(savePicker, hWnd);
8181
savePicker.SuggestedStartLocation = PickerLocationId.Downloads;
8282

83-
string extension = CoreTools.MakeValidFileName(details.InstallerUrl.ToString().Split('.')[^1]);
84-
if (package.Manager is Cargo) extension = "zip";
85-
savePicker.SuggestedFileName = package.Id + " installer." + extension;
83+
string name = await CoreTools.GetFileNameAsync(details.InstallerUrl);
84+
string extension;
85+
if (!name.Where(x => x == '.').Any())
86+
{
87+
extension = package.Manager is Cargo? "zip": "exe";
88+
name = name + "." + extension;
89+
}
90+
else
91+
{
92+
extension = CoreTools.MakeValidFileName(name.Split('.')[^1]);
93+
}
94+
95+
savePicker.SuggestedFileName = name;
8696

8797
if (package.Manager is BaseNuGet)
8898
{
8999
extension = "nupkg";
100+
savePicker.FileTypeChoices.Add("NuGet package", [".nupkg"]);
90101
savePicker.FileTypeChoices.Add("Compressed file", [".zip"]);
91102
}
92103

0 commit comments

Comments
 (0)