Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit b8ac3c4

Browse files
committed
Improve GetHeaders + Add MatchesContentType ext
1 parent ccb1876 commit b8ac3c4

File tree

3 files changed

+45
-27
lines changed

3 files changed

+45
-27
lines changed

src/ServiceStack.Text/HttpUtils.HttpClient.cs

+28-19
Original file line numberDiff line numberDiff line change
@@ -1010,29 +1010,32 @@ public static async Task<HttpResponseMessage> PutFileToUrlAsync(this string url,
10101010
public static void AddHeader(this HttpRequestMessage res, string name, string value) =>
10111011
res.WithHeader(name, value);
10121012

1013-
public static string? GetHeader(this HttpRequestMessage res, string name) =>
1014-
res.Headers.TryGetValues(name, out var values) ? values.FirstOrDefault() : null;
1015-
1016-
public static Dictionary<string, Func<HttpResponseMessage, string?>> HeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase)
1017-
{
1018-
[HttpHeaders.ContentType] = res => res.Content.Headers.ContentType?.MediaType,
1019-
[HttpHeaders.Expires] = res => res.Content.Headers.Expires?.ToString(),
1020-
[HttpHeaders.ContentDisposition] = res => res.Content.Headers.ContentDisposition?.ToString(),
1021-
[HttpHeaders.ContentEncoding] = res => res.Content.Headers.ContentEncoding?.ToString(),
1022-
[HttpHeaders.ContentLength] = res => res.Content.Headers.ContentLength?.ToString(),
1023-
[HttpHeaders.ETag] = res => res.Headers.ETag?.Tag.ToString(),
1024-
[HttpHeaders.Vary] = res => string.Join(',', res.Headers.Vary),
1025-
[HttpHeaders.CacheControl] = res => res.Headers.CacheControl?.ToString(),
1026-
};
1013+
public static string? GetHeader(this HttpRequestMessage req, string name)
1014+
{
1015+
if (RequestHeadersResolver.TryGetValue(name, out var fn))
1016+
return fn(req);
1017+
1018+
return req.Headers.TryGetValues(name, out var headers)
1019+
? headers.FirstOrDefault()
1020+
: req.Content?.Headers.TryGetValues(name, out var contentHeaders) == true
1021+
? contentHeaders!.FirstOrDefault()
1022+
: null;
1023+
}
10271024

1025+
public static Dictionary<string, Func<HttpRequestMessage, string?>> RequestHeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) {
1026+
};
1027+
public static Dictionary<string, Func<HttpResponseMessage, string?>> ResponseHeadersResolver { get; set; } = new(StringComparer.OrdinalIgnoreCase) {
1028+
};
10281029
public static string? GetHeader(this HttpResponseMessage res, string name)
10291030
{
1030-
if (HeadersResolver.TryGetValue(name, out var fn))
1031+
if (ResponseHeadersResolver.TryGetValue(name, out var fn))
10311032
return fn(res);
1032-
1033-
return res.Headers.TryGetValues(name, out var values)
1034-
? values.FirstOrDefault()
1035-
: null;
1033+
1034+
return res.Headers.TryGetValues(name, out var headers)
1035+
? headers.FirstOrDefault()
1036+
: res.Content?.Headers.TryGetValues(name, out var contentHeaders) == true
1037+
? contentHeaders!.FirstOrDefault()
1038+
: null;
10361039
}
10371040

10381041
public static HttpRequestMessage WithHeader(this HttpRequestMessage httpReq, string name, string value)
@@ -1115,4 +1118,10 @@ public static void DownloadFileTo(this string downloadUrl, string fileName,
11151118
}
11161119
}
11171120

1121+
public static class HttpClientExt
1122+
{
1123+
public static bool MatchesContentType(this HttpResponseMessage res, string matchesContentType) =>
1124+
MimeTypes.MatchesContentType(res.GetHeader(HttpHeaders.ContentType), matchesContentType);
1125+
}
1126+
11181127
#endif

src/ServiceStack.Text/HttpUtils.WebRequest.cs

+6
Original file line numberDiff line numberDiff line change
@@ -1181,4 +1181,10 @@ public void UploadStream(HttpWebRequest webRequest, Stream fileStream, string fi
11811181
UploadFileFn?.Invoke(webRequest, fileStream, fileName);
11821182
}
11831183
}
1184+
1185+
public static class HttpClientExt
1186+
{
1187+
public static bool MatchesContentType(this HttpWebResponse res, string matchesContentType) =>
1188+
MimeTypes.MatchesContentType(res.Headers[HttpHeaders.ContentType], matchesContentType);
1189+
}
11841190
#endif

tests/ServiceStack.Text.Tests/UseCases/ServiceStack_Text_UseCase.cs

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
#if !NETCORE
2-
using System.Collections.Generic;
1+
using System.Collections.Generic;
32
using System.Diagnostics;
43
using System.IO;
54
using NUnit.Framework;
@@ -25,18 +24,22 @@ public void Dump_and_Write_GitHub_Organization_Repos_to_CSV()
2524
{
2625
var orgName = "ServiceStack";
2726

28-
var orgRepos = "https://api.github.com/orgs/{0}/repos".Fmt(orgName)
29-
.GetJsonFromUrl(httpReq => httpReq.UserAgent = "ServiceStack.Text")
27+
var orgRepos = $"https://api.github.com/orgs/{orgName}/repos"
28+
.GetJsonFromUrl(req => req.With(c => c.UserAgent = "ServiceStack.Text"),
29+
responseFilter: res =>
30+
{
31+
var contentType = res.GetHeader(HttpHeaders.ContentType);
32+
Assert.That(res.MatchesContentType(MimeTypes.Json));
33+
})
3034
.FromJson<List<GithubRepository>>();
3135

32-
"Writing {0} Github Repositories:".Print(orgName);
36+
$"Writing {orgName} Github Repositories:".Print();
3337
orgRepos.PrintDump(); //recursive, pretty-format dump of any C# POCOs
3438

35-
var csvFilePath = "~/{0}-repos.csv".Fmt(orgName).MapAbsolutePath();
39+
var csvFilePath = $"~/{orgName}-repos.csv".MapAbsolutePath();
3640
File.WriteAllText(csvFilePath, orgRepos.ToCsv());
3741

38-
Process.Start(csvFilePath);
42+
if (Env.IsNetFramework) Process.Start(csvFilePath);
3943
}
4044
}
4145
}
42-
#endif

0 commit comments

Comments
 (0)