feat: add form-urlencoded body parsing for Feishin compatibility

This commit is contained in:
V1ck3s
2026-01-04 22:13:04 +01:00
committed by Vickes
parent 2a6191e9db
commit 06f33b8e89

View File

@@ -51,28 +51,61 @@ public class SubsonicController : ControllerBase
parameters[query.Key] = query.Value.ToString(); parameters[query.Key] = query.Value.ToString();
} }
// Get body parameters (JSON) // Get body parameters
if (Request.ContentLength > 0 && Request.ContentType?.Contains("application/json") == true) if (Request.ContentLength > 0 || Request.ContentType != null)
{ {
using var reader = new StreamReader(Request.Body); // Handle application/x-www-form-urlencoded (OpenSubsonic formPost extension)
var body = await reader.ReadToEndAsync(); if (Request.HasFormContentType)
if (!string.IsNullOrEmpty(body))
{ {
try try
{ {
var bodyParams = JsonSerializer.Deserialize<Dictionary<string, object>>(body); var form = await Request.ReadFormAsync();
if (bodyParams != null) foreach (var field in form)
{ {
foreach (var param in bodyParams) parameters[field.Key] = field.Value.ToString();
}
}
catch
{
// Fall back to manual parsing if ReadFormAsync fails
Request.EnableBuffering();
using var reader = new StreamReader(Request.Body, leaveOpen: true);
var body = await reader.ReadToEndAsync();
Request.Body.Position = 0;
if (!string.IsNullOrEmpty(body))
{
var formParams = Microsoft.AspNetCore.WebUtilities.QueryHelpers.ParseQuery(body);
foreach (var param in formParams)
{ {
parameters[param.Key] = param.Value?.ToString() ?? ""; parameters[param.Key] = param.Value.ToString();
} }
} }
} }
catch (JsonException) }
{ // Handle application/json
else if (Request.ContentType?.Contains("application/json") == true)
{
using var reader = new StreamReader(Request.Body);
var body = await reader.ReadToEndAsync();
if (!string.IsNullOrEmpty(body))
{
try
{
var bodyParams = JsonSerializer.Deserialize<Dictionary<string, object>>(body);
if (bodyParams != null)
{
foreach (var param in bodyParams)
{
parameters[param.Key] = param.Value?.ToString() ?? "";
}
}
}
catch (JsonException)
{
}
} }
} }
} }