Skip to content

Commit

Permalink
fix(exception): Fixed support when other files are published (.config…
Browse files Browse the repository at this point in the history
…, .pdb, etc...) on the server.

Also handle 404 from server.
  • Loading branch information
carldebilly committed May 5, 2023
1 parent 01d553f commit d1bacee
Showing 1 changed file with 78 additions and 43 deletions.
121 changes: 78 additions & 43 deletions src/Uno.Wasm.VersionChecker/UnoVersionExtractor.cs
Expand Up @@ -24,12 +24,12 @@ public sealed class UnoVersionExtractor : IDisposable
private readonly Uri _siteUri;
private readonly HttpClient _httpClient = new HttpClient();

private ImmutableArray<(string name, string version, string fileVersion, string configuration, string targetFramework, string? commit)> _assemblies;
private ImmutableArray<(string? name, string version, string fileVersion, string configuration, string targetFramework, string? commit)> _assemblies;
private (Uri assembliesPath, string? mainAssembly, string[]? assemblies, string? server) _config;
private (string name, string version, string fileVersion, string configuration, string targetFramework, string? commit) _mainAssemblyDetails;
private (string? name, string version, string fileVersion, string configuration, string targetFramework, string? commit) _mainAssemblyDetails;
private (string? version, string? name) _framework;
private bool _isAot;

public UnoVersionExtractor(Uri siteUri)
{
_siteUri = siteUri;
Expand Down Expand Up @@ -132,14 +132,17 @@ public async Task<int> Extract()
return 1;
}

Console.WriteLineFormatted("{0} assemblies found. Downloading assemblies to read metadata...", Color.Gray,
Console.WriteLineFormatted(
"Trying to download {0} files to find assemblies. Downloading them to read metadata...",
Color.Gray,
new Formatter(_config.assemblies.Length, Color.Aqua));

var tasks = _config.assemblies
.Select(a => GetAssemblyDetails(new Uri(_config.assembliesPath, a)))
.ToArray();

_assemblies = (await Task.WhenAll(tasks))
.Where(x=>x.name is not null)
.OrderBy(d => d.name)
.ToImmutableArray();

Expand Down Expand Up @@ -180,6 +183,8 @@ public void OutputResults()

Console.WriteLine();

Console.WriteLineFormatted("{0} assemblies successfully downloaded.", Color.Gray, new Formatter(_assemblies.Length, Color.Aqua));

WriteTable(table);

if (_mainAssemblyDetails.name is { })
Expand Down Expand Up @@ -283,57 +288,87 @@ private async Task<(Uri assembliesPath, string? mainAssembly, string[]? assembli
RegexOptions.IgnoreCase | RegexOptions.Compiled | RegexOptions.CultureInvariant);


private async Task<(string name, string version, string fileVersion, string configuration, string targetFramework, string? commit)> GetAssemblyDetails(Uri uri)
private async Task<(string? name, string version, string fileVersion, string configuration, string targetFramework, string? commit)> GetAssemblyDetails(Uri uri)
{
await using var httpStream = await _httpClient.GetStreamAsync(uri);

var stream = new MemoryStream();
await httpStream.CopyToAsync(stream);
stream.Position = 0;
// Create http response from uri
using var request = new HttpRequestMessage(HttpMethod.Get, uri);
using var response = await _httpClient.SendAsync(request);
if (!response.IsSuccessStatusCode)
{
return default;
}

var assembly = AssemblyDefinition.ReadAssembly(stream);
await using var httpStream = await response.Content.ReadAsStreamAsync();

var attributes = assembly.CustomAttributes.ToArray();
try
{

var name = assembly.Name.Name;
var version = assembly.Name.Version.ToString();
var fileVersion = "";
var targetFramework = "";
var commit = default(string?);
var configuration = "";
var stream = new MemoryStream();
await httpStream.CopyToAsync(stream);
stream.Position = 0;

foreach (var attribute in attributes)
{
switch (attribute.AttributeType.Name)
// Ensure it's a DLL file by reading the header
var header = new byte[2];
if(await stream.ReadAsync(header, 0, 2) != 2)
{
case "AssemblyInformationalVersionAttribute":
var versionStr = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
version = versionStr.Split('+').FirstOrDefault() ?? "";
return default;
}
if (header[0] != 'M' || header[1] != 'Z')
{
return default;
}

if (COMMIT_REGEX.Match(versionStr) is { Success: true } m)
{
commit = m.Groups[1].Value;
}
// Reset the stream
stream.Position = 0;

break;
case "AssemblyFileVersionAttribute":
fileVersion = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
case "TargetFrameworkAttribute":
targetFramework = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
case "AssemblyConfigurationAttribute":
configuration = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
var assembly = AssemblyDefinition.ReadAssembly(stream);

var attributes = assembly.CustomAttributes.ToArray();

var name = assembly.Name.Name;
var version = assembly.Name.Version.ToString();
var fileVersion = "";
var targetFramework = "";
var commit = default(string?);
var configuration = "";

foreach (var attribute in attributes)
{
switch (attribute.AttributeType.Name)
{
case "AssemblyInformationalVersionAttribute":
var versionStr = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
version = versionStr.Split('+').FirstOrDefault() ?? "";

if (COMMIT_REGEX.Match(versionStr) is { Success: true } m)
{
commit = m.Groups[1].Value;
}

break;
case "AssemblyFileVersionAttribute":
fileVersion = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
case "TargetFrameworkAttribute":
targetFramework = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
case "AssemblyConfigurationAttribute":
configuration = attribute.ConstructorArguments[0].Value?.ToString() ?? "";
break;
}
}

if (attributes.Length == 0)
{
targetFramework = "WASM AOT";
}
}

if (attributes.Length == 0)
return (name, version, fileVersion, configuration, targetFramework, commit);
}
catch (Exception ex)
{
targetFramework = "WASM AOT";
return default;
}

return (name, version, fileVersion, configuration, targetFramework, commit);
}


Expand Down

0 comments on commit d1bacee

Please sign in to comment.