mirror of
https://github.com/SoPat712/allstarr.git
synced 2026-02-09 23:55:10 -05:00
feat: add form-urlencoded body parsing for Feishin compatibility
This commit is contained in:
@@ -40,45 +40,78 @@ public class SubsonicController : ControllerBase
|
||||
}
|
||||
}
|
||||
|
||||
// Extract all parameters (query + body)
|
||||
private async Task<Dictionary<string, string>> ExtractAllParameters()
|
||||
{
|
||||
var parameters = new Dictionary<string, string>();
|
||||
|
||||
// Get query parameters
|
||||
foreach (var query in Request.Query)
|
||||
{
|
||||
parameters[query.Key] = query.Value.ToString();
|
||||
}
|
||||
|
||||
// Get body parameters (JSON)
|
||||
if (Request.ContentLength > 0 && Request.ContentType?.Contains("application/json") == true)
|
||||
{
|
||||
using var reader = new StreamReader(Request.Body);
|
||||
var body = await reader.ReadToEndAsync();
|
||||
|
||||
if (!string.IsNullOrEmpty(body))
|
||||
// Extract all parameters (query + body)
|
||||
private async Task<Dictionary<string, string>> ExtractAllParameters()
|
||||
{
|
||||
var parameters = new Dictionary<string, string>();
|
||||
|
||||
// Get query parameters
|
||||
foreach (var query in Request.Query)
|
||||
{
|
||||
parameters[query.Key] = query.Value.ToString();
|
||||
}
|
||||
|
||||
// Get body parameters
|
||||
if (Request.ContentLength > 0 || Request.ContentType != null)
|
||||
{
|
||||
// Handle application/x-www-form-urlencoded (OpenSubsonic formPost extension)
|
||||
if (Request.HasFormContentType)
|
||||
{
|
||||
try
|
||||
{
|
||||
var bodyParams = JsonSerializer.Deserialize<Dictionary<string, object>>(body);
|
||||
if (bodyParams != null)
|
||||
var form = await Request.ReadFormAsync();
|
||||
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)
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return parameters;
|
||||
}
|
||||
}
|
||||
|
||||
return parameters;
|
||||
}
|
||||
|
||||
private async Task<(object Body, string? ContentType)> RelayToSubsonic(string endpoint, Dictionary<string, string> parameters)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user