Improve HttpHelper body handling and error reporting

HttpHelper.FetchAsync now supports HttpContent as a body parameter, allowing for more flexible request content. In MojangAPI.UploadSkinAsync, error messages now include the response body for better debugging.
This commit is contained in:
Gilles Lazures 2026-01-25 19:50:59 +01:00
parent 15adb39115
commit ee1e241e8e
2 changed files with 15 additions and 5 deletions

View File

@ -10,8 +10,6 @@ public static class HttpHelper {
public static async Task<HttpResponseMessage> FetchAsync(string url, HttpMethod? method = null, object? body = null, Dictionary<string, string>? headers = null) {
var request = new HttpRequestMessage(method ?? HttpMethod.Get, url);
request.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
if (headers != null) {
foreach (var header in headers) {
request.Headers.TryAddWithoutValidation(header.Key, header.Value);
@ -19,13 +17,17 @@ public static class HttpHelper {
}
if (body != null) {
if (body is string s) {
if (body is HttpContent httpContent) {
request.Content = httpContent;
} else if (body is string s) {
request.Content = new StringContent(s, System.Text.Encoding.UTF8, "application/json");
} else {
request.Content = JsonContent.Create(body, options: LauncherConstants._jsonOptions);
}
}
request.Headers.UserAgent.ParseAdd("Mozilla/5.0 (Windows NT 10.0; Win64; x64)");
return await Http.SendAsync(request);
}

View File

@ -9,19 +9,27 @@ public static class MojangAPI {
public static async Task<string> UploadSkinAsync(string filePath, string variant, string token) {
using var content = new MultipartFormDataContent();
content.Add(new StringContent(variant), "variant");
byte[] fileBytes = await File.ReadAllBytesAsync(filePath);
var fileContent = new ByteArrayContent(fileBytes);
fileContent.Headers.ContentType = MediaTypeHeaderValue.Parse("image/png");
content.Add(fileContent, "file", Path.GetFileName(filePath));
var response = await HttpHelper.FetchAsync("https://yggdrasil.azures.fr/minecraftservices/minecraft/profile/skins", method: HttpMethod.Post, body: content, headers: new() { { "Authorization", $"Bearer {token}" } } );
var response = await HttpHelper.FetchAsync(
"https://yggdrasil.azures.fr/minecraftservices/minecraft/profile/skins",
method: HttpMethod.Post,
body: content,
headers: new() { { "Authorization", $"Bearer {token}" } }
);
if (response.IsSuccessStatusCode) {
return await response.Content.ReadAsStringAsync();
} else {
throw new Exception($"Erreur serveur: {response.StatusCode}");
string errorBody = await response.Content.ReadAsStringAsync();
throw new Exception($"Erreur serveur ({response.StatusCode}): {errorBody}");
}
}