Skip to content

Commit 5ab97c5

Browse files
committed
Merge branch 'amosonn-case-insensitive-header-names' into dev
2 parents 1803402 + 323fb60 commit 5ab97c5

File tree

5 files changed

+33
-11
lines changed

5 files changed

+33
-11
lines changed

src/RestSharp/KnownHeaders.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
//
1515

1616
// ReSharper disable InconsistentNaming
17+
// ReSharper disable MemberCanBePrivate.Global
1718

1819
namespace RestSharp;
1920

@@ -32,4 +33,13 @@ public static class KnownHeaders {
3233
public const string LastModified = "Last-Modified";
3334
public const string ContentMD5 = "Content-MD5";
3435
public const string Host = "Host";
35-
}
36+
37+
internal static readonly string[] ContentHeaders = {
38+
Allow, Expires, ContentDisposition, ContentEncoding, ContentLanguage, ContentLength, ContentLocation, ContentRange, ContentType, ContentMD5,
39+
LastModified
40+
};
41+
42+
static readonly HashSet<string> ContentHeadersHash = new(ContentHeaders.Select(x => x.ToLower()));
43+
44+
internal static bool IsContentHeader(string key) => ContentHeadersHash.Contains(key.ToLower());
45+
}

src/RestSharp/Request/HttpRequestMessageExtensions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ namespace RestSharp;
2020

2121
static class HttpRequestMessageExtensions {
2222
public static void AddHeaders(this HttpRequestMessage message, RequestHeaders headers) {
23-
var headerParameters = headers.Parameters.Where(x => !RequestContent.ContentHeaders.Contains(x.Name));
23+
var headerParameters = headers.Parameters.Where(x => !KnownHeaders.IsContentHeader(x.Name!));
2424

2525
headerParameters.ForEach(x => AddHeader(x, message.Headers));
2626

@@ -31,4 +31,4 @@ void AddHeader(Parameter parameter, HttpHeaders httpHeaders) {
3131
httpHeaders.TryAddWithoutValidation(parameter.Name!, parameterStringValue);
3232
}
3333
}
34-
}
34+
}

src/RestSharp/Request/RequestContent.cs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,7 @@ class RequestContent : IDisposable {
2626
readonly RestRequest _request;
2727
readonly List<Stream> _streams = new();
2828

29-
internal static readonly string[] ContentHeaders = {
30-
Allow, Expires,
31-
ContentDisposition, ContentEncoding, ContentLanguage, ContentLength, ContentLocation, ContentRange, ContentType, ContentMD5,
32-
LastModified
33-
};
29+
3430

3531
HttpContent? Content { get; set; }
3632

@@ -164,15 +160,15 @@ void AddPostParameters(ParametersCollection? postParameters) {
164160
var formContent = new FormUrlEncodedContent(
165161
_request.Parameters
166162
.Where(x => x.Type == ParameterType.GetOrPost)
167-
.Select(x => new KeyValuePair<string, string>(x.Name!, x.Value!.ToString()!))!
163+
.Select(x => new KeyValuePair<string, string>(x.Name!, x.Value!.ToString()!))
168164
);
169165
Content = formContent;
170166
}
171167
}
172168

173169
void AddHeaders() {
174170
var contentHeaders = _request.Parameters
175-
.Where(x => x.Type == ParameterType.HttpHeader && ContentHeaders.Contains(x.Name))
171+
.Where(x => x.Type == ParameterType.HttpHeader && IsContentHeader(x.Name!))
176172
.ToArray();
177173

178174
if (contentHeaders.Length > 0 && Content == null) {
@@ -208,4 +204,4 @@ public void Dispose() {
208204
_streams.ForEach(x => x.Dispose());
209205
Content?.Dispose();
210206
}
211-
}
207+
}

src/RestSharp/Request/RequestHeaders.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
// limitations under the License.
1414
//
1515

16+
// ReSharper disable InvertIf
1617
namespace RestSharp;
1718

1819
class RequestHeaders {
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
namespace RestSharp.Tests;
2+
3+
public class RestContentTests {
4+
[Fact]
5+
public void RestContent_CaseInsensitiveHeaders() {
6+
const string myContentType = "application/x-custom";
7+
8+
var request = new RestRequest("resource").AddHeader("coNteNt-TypE", myContentType);
9+
var content = new RequestContent(new RestClient(), request);
10+
11+
var httpContent = content.BuildContent();
12+
13+
httpContent.Headers.ContentType!.MediaType.Should().Be(myContentType);
14+
}
15+
}

0 commit comments

Comments
 (0)