Skip to content

Commit e256cb6

Browse files
committed
Abstractions for Dibix.Http.Host
1 parent 94a860d commit e256cb6

24 files changed

Lines changed: 276 additions & 170 deletions

src/Dibix.Http.Server/Dibix.Http.Server.csproj

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,14 @@
3737
<PackageReference Include="System.IO.Packaging" />
3838
</ItemGroup>
3939

40+
<ItemGroup Condition="'$(TargetFramework)' == 'net6.0'">
41+
<FrameworkReference Include="Microsoft.AspNetCore.App" />
42+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" VersionOverride="6.0.0" />
43+
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" VersionOverride="6.0.0" />
44+
</ItemGroup>
45+
4046
<ItemGroup Condition="'$(TargetFramework)' == 'net461'">
4147
<Reference Include="WindowsBase" /> <!-- System.IO.Packaging -->
4248
</ItemGroup>
43-
49+
4450
</Project>
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
<wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
22
<s:String x:Key="/Default/CodeInspection/Daemon/ConfigureAwaitAnalysisMode/@EntryValue">Library</s:String>
33
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=description/@EntryIndexedValue">True</s:Boolean>
4+
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=extensions/@EntryIndexedValue">True</s:Boolean>
45
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=formatters/@EntryIndexedValue">True</s:Boolean>
56
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=model/@EntryIndexedValue">True</s:Boolean>
67
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=providers/@EntryIndexedValue">True</s:Boolean>
8+
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=registration/@EntryIndexedValue">True</s:Boolean>
79
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=runtime/@EntryIndexedValue">True</s:Boolean>
810
<s:Boolean x:Key="/Default/CodeInspection/NamespaceProvider/NamespaceFoldersToSkip/=utilities/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
using System.Net.Http;
2+
using System.Text;
3+
4+
namespace Dibix.Http.Server
5+
{
6+
public static class HttpRequestExecutionExceptionExtensions
7+
{
8+
public static HttpResponseMessage CreateResponse(this HttpRequestExecutionException exception, HttpRequestMessage request)
9+
{
10+
HttpResponseMessage response = request.CreateResponse(exception.StatusCode);
11+
12+
if (exception.IsClientError)
13+
{
14+
if (exception.ErrorCode != 0)
15+
response.Headers.Add(KnownHeaders.ClientErrorCodeHeaderName, exception.ErrorCode.ToString());
16+
17+
response.Headers.Add(KnownHeaders.ClientErrorDescriptionHeaderName, exception.ErrorMessage);
18+
response.Content = new StringContent($"\"{exception.ErrorMessage}\"", Encoding.UTF8, "application/json");
19+
}
20+
21+
return response;
22+
}
23+
}
24+
}

src/Dibix.Http.Server/Formatters/HttpFileResponseFormatter.cs

Lines changed: 0 additions & 35 deletions
This file was deleted.

src/Dibix.Http.Server/Formatters/WrappedHttpResponseFormatter.cs

Lines changed: 0 additions & 11 deletions
This file was deleted.
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.IO;
4+
using System.Linq;
5+
using System.Net;
6+
using System.Net.Http;
7+
using System.Net.Http.Headers;
8+
using System.Threading.Tasks;
9+
10+
namespace Dibix.Http.Server
11+
{
12+
public sealed class HttpRequestMessageDescriptor : IHttpRequestDescriptor
13+
{
14+
internal HttpRequestMessage RequestMessage { get; }
15+
16+
public HttpRequestMessageDescriptor(HttpRequestMessage request)
17+
{
18+
RequestMessage = request;
19+
}
20+
21+
public async Task<Stream> GetBody() => RequestMessage.Content != null ? await RequestMessage.Content.ReadAsStreamAsync().ConfigureAwait(false) : null;
22+
23+
public IEnumerable<string> GetHeaderValues(string name) => RequestMessage.Headers.TryGetValues(name, out IEnumerable<string> values) ? values : Enumerable.Empty<string>();
24+
25+
public IEnumerable<string> GetAcceptLanguageValues() => RequestMessage.Headers.AcceptLanguage.Select(x => x.Value);
26+
27+
public object CreateResponse(HttpStatusCode statusCode) => RequestMessage.CreateResponse(statusCode);
28+
29+
public object CreateFileResponse(string contentType, byte[] data, string fileName, bool cache)
30+
{
31+
HttpResponseMessage response = RequestMessage.CreateResponse();
32+
response.Content = new ByteArrayContent(data);
33+
response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType);
34+
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("inline") { FileName = fileName };
35+
36+
if (cache)
37+
{
38+
DateTime now = DateTime.Now;
39+
TimeSpan year = now.AddYears(1) - now;
40+
response.Headers.CacheControl = new CacheControlHeaderValue { MaxAge = year };
41+
}
42+
43+
return response;
44+
}
45+
}
46+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using System.Collections.Generic;
2+
using System.IO;
3+
using System.Threading.Tasks;
4+
5+
namespace Dibix.Http.Server
6+
{
7+
public interface IHttpRequestDescriptor
8+
{
9+
Task<Stream> GetBody();
10+
IEnumerable<string> GetHeaderValues(string name);
11+
IEnumerable<string> GetAcceptLanguageValues();
12+
}
13+
}

src/Dibix.Http.Server/Providers/BodyParameterSourceProvider.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.IO;
33
using System.Linq.Expressions;
4-
using System.Net.Http;
54
using System.Runtime.CompilerServices;
65
using System.Threading.Tasks;
76

@@ -22,9 +21,9 @@ public override void Resolve(IHttpParameterResolutionContext context)
2221
}
2322
else
2423
{
25-
Expression contentProperty = Expression.Property(context.RequestParameter, nameof(HttpRequestMessage.Content));
26-
Expression readAsStreamAsyncCall = Expression.Call(contentProperty, nameof(HttpContent.ReadAsStreamAsync), Type.EmptyTypes);
27-
Expression getAwaiterCall = Expression.Call(readAsStreamAsyncCall, typeof(Task<Stream>).SafeGetMethod(nameof(Task<Stream>.GetAwaiter)));
24+
// TODO: Can be null!
25+
Expression getBodyCall = Expression.Call(context.RequestParameter, nameof(IHttpRequestDescriptor.GetBody), Type.EmptyTypes);
26+
Expression getAwaiterCall = Expression.Call(getBodyCall, typeof(Task<Stream>).SafeGetMethod(nameof(Task<Stream>.GetAwaiter)));
2827
Expression getResultCall = Expression.Call(getAwaiterCall, nameof(TaskAwaiter.GetResult), Type.EmptyTypes);
2928
context.ResolveUsingValue(getResultCall);
3029
}

src/Dibix.Http.Server/Providers/HeaderParameterSourceProvider.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
using System;
2-
using System.Collections.Generic;
32
using System.Linq;
43
using System.Linq.Expressions;
5-
using System.Net.Http;
64

75
namespace Dibix.Http.Server
86
{
@@ -19,6 +17,6 @@ public override void Resolve(IHttpParameterResolutionContext context)
1917
context.ResolveUsingValue(getHeaderCall);
2018
}
2119

22-
private static string GetHeader(HttpRequestMessage request, string key) => request.Headers.TryGetValues(key, out IEnumerable<string> values) ? values.First() : null;
20+
private static string GetHeader(IHttpRequestDescriptor request, string key) => request.GetHeaderValues(key).FirstOrDefault();
2321
}
2422
}

src/Dibix.Http.Server/Providers/RequestParameterSourceProvider.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
using System.Collections.Generic;
33
using System.Linq;
44
using System.Linq.Expressions;
5-
using System.Net.Http;
65

76
namespace Dibix.Http.Server
87
{
@@ -32,8 +31,8 @@ private static Expression BuildExpression(Expression requestParameter, string me
3231
return getLanguageCall;
3332
}
3433

35-
private static string GetFirstLanguage(HttpRequestMessage request) => GetLanguages(request).FirstOrDefault();
34+
private static string GetFirstLanguage(IHttpRequestDescriptor request) => GetLanguages(request).FirstOrDefault();
3635

37-
private static IEnumerable<string> GetLanguages(HttpRequestMessage request) => request.Headers.AcceptLanguage.Select(x => x.Value);
36+
private static IEnumerable<string> GetLanguages(IHttpRequestDescriptor request) => request.GetAcceptLanguageValues();
3837
}
3938
}

0 commit comments

Comments
 (0)