From 9b8293cf8aab59258ad52a08e0fc57200a8e84f0 Mon Sep 17 00:00:00 2001 From: Alexey Zimarev Date: Thu, 26 Feb 2026 20:37:18 +0100 Subject: [PATCH 1/2] Quote multipart form parameter names by default (RFC 7578) Change MultipartFormQuoteParameters default from false to true so that parameter names in Content-Disposition headers are quoted consistently with file parameter names, as required by RFC 7578. Fixes #2271 Co-Authored-By: Claude Opus 4.6 --- src/RestSharp/Request/RestRequest.cs | 5 ++--- test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs | 4 ++-- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/src/RestSharp/Request/RestRequest.cs b/src/RestSharp/Request/RestRequest.cs index 7fa87a718..b2f86f6ef 100644 --- a/src/RestSharp/Request/RestRequest.cs +++ b/src/RestSharp/Request/RestRequest.cs @@ -87,10 +87,9 @@ public RestRequest(Uri resource, Method method = Method.Get) /// /// When set to true, parameter values in a multipart form data requests will be enclosed in - /// quotation marks. Default is false. Enable it if the remote endpoint requires parameters - /// to be in quotes (for example, FreshDesk API). + /// quotation marks. Default is true, as per RFC 7578. /// - public bool MultipartFormQuoteParameters { get; set; } + public bool MultipartFormQuoteParameters { get; set; } = true; /// /// When set to true, the form boundary part of the content type will be enclosed in diff --git a/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs b/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs index 1d5ee5899..a4d325e8d 100644 --- a/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs +++ b/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs @@ -31,7 +31,7 @@ public void Dispose() { const string ContentDispositionString = $"{KnownHeaders.ContentDisposition}: form-data;"; const string Expected = - $"--{{0}}{LineBreak}{ContentTypeString}{LineBreak}{ContentDispositionString} name=foo{LineBreak}{LineBreak}bar{LineBreak}" + + $"--{{0}}{LineBreak}{ContentTypeString}{LineBreak}{ContentDispositionString} name=\"foo\"{LineBreak}{LineBreak}bar{LineBreak}" + $"--{{0}}{LineBreak}{ContentTypeString}{LineBreak}{ContentDispositionString} name=\"a name with spaces\"{LineBreak}{LineBreak}somedata{LineBreak}" + $"--{{0}}--{LineBreak}"; @@ -228,7 +228,7 @@ public async Task PostParameter_contentType_in_multipart_form() { var actual = capturer.Body!.Replace("\n", string.Empty).Split('\r'); actual[1].Should().Be("Content-Type: application/json; charset=utf-8"); - actual[2].Should().Be($"Content-Disposition: form-data; name={parameterName}"); + actual[2].Should().Be($"Content-Disposition: form-data; name=\"{parameterName}\""); actual[4].Should().Be(parameterValue); } } \ No newline at end of file From 7c27a26949ae1264ad7f290b6d753c4c21b1e514 Mon Sep 17 00:00:00 2001 From: Alexey Zimarev Date: Thu, 26 Feb 2026 20:52:15 +0100 Subject: [PATCH 2/2] Apply parameter name quoting to body parts in multipart form data Extend MultipartFormQuoteParameters to also cover BodyParameter parts added via AddBody, ensuring consistent Content-Disposition name quoting across all multipart form parts. Co-Authored-By: Claude Opus 4.6 --- src/RestSharp/Request/RequestContent.cs | 2 +- test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/RestSharp/Request/RequestContent.cs b/src/RestSharp/Request/RequestContent.cs index 03af0bdcf..affc60618 100644 --- a/src/RestSharp/Request/RequestContent.cs +++ b/src/RestSharp/Request/RequestContent.cs @@ -143,7 +143,7 @@ void AddBody(bool hasPostParameters, BodyParameter bodyParameter) { if (name.IsEmpty()) mpContent.Add(bodyContent); else - mpContent.Add(bodyContent, name); + mpContent.Add(bodyContent, request.MultipartFormQuoteParameters ? $"\"{name}\"" : name); Content = mpContent; } else { diff --git a/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs b/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs index a4d325e8d..5fba92f84 100644 --- a/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs +++ b/test/RestSharp.Tests.Integrated/MultipartFormDataTests.cs @@ -41,7 +41,7 @@ public void Dispose() { $"{LineBreak}{KnownHeaders.ContentDisposition}: form-data; name=\"fileName\"; filename=\"TestFile.txt\"" + $"{LineBreak}{LineBreak}This is a test file for RestSharp.{LineBreak}" + $"--{{0}}{LineBreak}{KnownHeaders.ContentType}: application/json; {CharsetString}" + - $"{LineBreak}{KnownHeaders.ContentDisposition}: form-data; name=controlName" + + $"{LineBreak}{KnownHeaders.ContentDisposition}: form-data; name=\"controlName\"" + $"{LineBreak}{LineBreak}test{LineBreak}" + $"--{{0}}--{LineBreak}"; @@ -199,7 +199,7 @@ public async Task MultipartFormData_Without_File_Creates_A_Valid_RequestBody() { var expectedBody = new[] { ContentTypeString, - $"{ContentDispositionString} name={multipartName}", + $"{ContentDispositionString} name=\"{multipartName}\"", bodyData };