Skip to content

Commit 5c579f9

Browse files
committed
binding context expand
1 parent 24070af commit 5c579f9

File tree

16 files changed

+111
-63
lines changed

16 files changed

+111
-63
lines changed

src/NetCoreStack.Proxy/Binders/HttpDeleteContentBinder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public override void BindContent(ContentModelBindingContext bindingContext)
1313
{
1414
ModelDictionaryResult result = bindingContext.ModelContentResolver.Resolve(bindingContext.Parameters, bindingContext.Args);
1515
List<string> keys = result.Dictionary.Keys.ToList();
16-
EnsureTemplate(bindingContext.MethodMarkerTemplate, bindingContext.UriDefinition, result.Dictionary, keys);
16+
EnsureTemplate(bindingContext, result.Dictionary, keys);
1717

1818
bindingContext.TryUpdateUri(result.Dictionary);
1919
}

src/NetCoreStack.Proxy/Binders/HttpGetContentBinder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public override void BindContent(ContentModelBindingContext bindingContext)
1313
{
1414
ModelDictionaryResult result = bindingContext.ModelContentResolver.Resolve(bindingContext.Parameters, bindingContext.Args);
1515
List<string> keys = result.Dictionary.Keys.ToList();
16-
EnsureTemplate(bindingContext.MethodMarkerTemplate, bindingContext.UriDefinition, result.Dictionary, keys);
16+
EnsureTemplate(bindingContext, result.Dictionary, keys);
1717

1818
bindingContext.TryUpdateUri(result.Dictionary);
1919
}

src/NetCoreStack.Proxy/Binders/HttpPutContentBinder.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,15 @@ public class HttpPutContentBinder : BodyContentBinder
1111
public override void BindContent(ContentModelBindingContext bindingContext)
1212
{
1313
var isMultiPartFormData = bindingContext.IsMultiPartFormData;
14-
//var templateParameterKeys = bindingContext.UriDefinition.TemplateParameterKeys;
14+
var hasAnyTemplateParameterKey = bindingContext.HasAnyTemplateParameterKey;
15+
if (bindingContext.ArgsLength == 1 && hasAnyTemplateParameterKey)
16+
{
17+
ModelDictionaryResult mdr = bindingContext.ModelContentResolver.Resolve(bindingContext.Parameters, bindingContext.Args);
18+
List<string> mdrKeys = mdr.Dictionary.Keys.ToList();
19+
EnsureTemplate(bindingContext, mdr.Dictionary, mdrKeys);
20+
return;
21+
}
22+
1523
//List<ProxyModelMetadata> modelMetadataKeyList = new List<ProxyModelMetadata>();
1624
//int parameterOffset = 0;
1725
//foreach (var key in templateParameterKeys)
@@ -26,9 +34,10 @@ public override void BindContent(ContentModelBindingContext bindingContext)
2634
// }
2735
//}
2836

37+
2938
ModelDictionaryResult result = bindingContext.ModelContentResolver.Resolve(bindingContext.Parameters, bindingContext.Args);
3039
List<string> keys = result.Dictionary.Keys.ToList();
31-
EnsureTemplate(bindingContext.MethodMarkerTemplate, bindingContext.UriDefinition, result.Dictionary, keys);
40+
EnsureTemplate(bindingContext, result.Dictionary, keys);
3241

3342
if (isMultiPartFormData)
3443
{

src/NetCoreStack.Proxy/DefaultProxyContentStreamProvider.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,11 @@ public async Task CreateRequestContentAsync(RequestDescriptor requestContext,
2626
var isMultiPartFormData = descriptor.IsMultiPartFormData;
2727
var contentModelBinder = ContentBinderFactory.GetContentModelBinder(httpMethod);
2828

29-
var bindingContext = new ContentModelBindingContext
29+
var bindingContext = new ContentModelBindingContext(httpMethod, descriptor, proxyUriDefinition)
3030
{
31-
HttpMethod = httpMethod,
32-
UriDefinition = proxyUriDefinition,
33-
MethodMarkerTemplate = descriptor.MethodMarkerTemplate,
3431
IsMultiPartFormData = isMultiPartFormData,
3532
ModelContentResolver = ContentResolver,
3633
Args = requestContext.Args,
37-
Parameters = descriptor.Parameters
3834
};
3935

4036
contentModelBinder.BindContent(bindingContext);

src/NetCoreStack.Proxy/DefaultProxyEndpointManager.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public DefaultProxyEndpointManager(RoundRobinManager roundRobinManager)
1313
RoundRobinManager = roundRobinManager;
1414
}
1515

16-
public ProxyUriDefinition CreateUriDefinition(ProxyDescriptor descriptor, string regionKey, string targetMethodName)
16+
public ProxyUriDefinition CreateUriDefinition(ProxyMethodDescriptor methodDescriptor, string route, string regionKey, string targetMethodName)
1717
{
1818
var uriBuilder = RoundRobinManager.RoundRobinUri(regionKey);
1919
if (uriBuilder == null)
@@ -23,21 +23,20 @@ public ProxyUriDefinition CreateUriDefinition(ProxyDescriptor descriptor, string
2323

2424
var uriDefinition = new ProxyUriDefinition(uriBuilder);
2525

26-
if (!string.IsNullOrEmpty(descriptor.Route))
26+
if (!string.IsNullOrEmpty(route))
2727
{
2828
if (targetMethodName.ToLower() == HttpMethod.Get.Method.ToLower())
2929
{
3030
var path = uriDefinition.UriBuilder.Path ?? string.Empty;
31-
path += $"{descriptor.Route}/";
31+
path += $"{route}/";
3232
uriDefinition.UriBuilder.Path = path;
3333
}
3434
else
3535
{
3636
if (targetMethodName.StartsWith("/"))
3737
targetMethodName = targetMethodName.Substring(1);
3838

39-
var routeTemplate = TemplateParser.Parse(targetMethodName);
40-
uriDefinition.ResolveTemplate(routeTemplate, descriptor.Route, targetMethodName);
39+
uriDefinition.ResolveTemplate(methodDescriptor, route, targetMethodName);
4140
}
4241
}
4342

src/NetCoreStack.Proxy/Interfaces/IProxyEndpointManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@
22
{
33
public interface IProxyEndpointManager
44
{
5-
ProxyUriDefinition CreateUriDefinition(ProxyDescriptor descriptor, string regionKey, string targetMethodName);
5+
ProxyUriDefinition CreateUriDefinition(ProxyMethodDescriptor methodDescriptor, string route, string regionKey, string targetMethodName);
66
}
77
}

src/NetCoreStack.Proxy/Internal/DefaultProxyTypeManager.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using NetCoreStack.Contracts;
1+
using Microsoft.AspNetCore.Routing.Template;
2+
using NetCoreStack.Contracts;
23
using NetCoreStack.Proxy.Extensions;
34
using System;
45
using System.Collections.Generic;
@@ -83,7 +84,24 @@ private IList<ProxyDescriptor> GetProxyDescriptors()
8384
if (httpMethodAttribute != null)
8485
{
8586
if (httpMethodAttribute.Template.HasValue())
86-
proxyMethodDescriptor.MethodMarkerTemplate = httpMethodAttribute.Template;
87+
{
88+
var template = httpMethodAttribute.Template;
89+
proxyMethodDescriptor.MethodMarkerTemplate = template;
90+
var routeTemplate = TemplateParser.Parse(template);
91+
if (routeTemplate != null)
92+
{
93+
proxyMethodDescriptor.RouteTemplate = routeTemplate;
94+
proxyMethodDescriptor.ParameterParts = new List<TemplatePart>(routeTemplate.Parameters);
95+
96+
proxyMethodDescriptor.TemplateKeys = routeTemplate.Segments
97+
.SelectMany(s => s.Parts.Where(p => p.IsLiteral)
98+
.Select(t => t.Text)).ToList();
99+
100+
proxyMethodDescriptor.TemplateParameterKeys = routeTemplate.Segments
101+
.SelectMany(s => s.Parts.Where(p => p.IsParameter)
102+
.Select(t => t.Name)).ToList();
103+
}
104+
}
87105

88106
if (httpMethodAttribute is HttpGetMarkerAttribute)
89107
proxyMethodDescriptor.HttpMethod = HttpMethod.Get;

src/NetCoreStack.Proxy/Internal/ProxyManager.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ public async Task<RequestContext> CreateRequestAsync(RequestDescriptor descripto
117117
if (methodDescriptor.MethodMarkerTemplate.HasValue())
118118
methodPath = methodDescriptor.MethodMarkerTemplate;
119119

120-
ProxyUriDefinition proxyUriDefinition = _endpointManager.CreateUriDefinition(proxyDescriptor, regionKey, methodPath);
120+
ProxyUriDefinition proxyUriDefinition = _endpointManager.CreateUriDefinition(methodDescriptor, proxyDescriptor.Route, regionKey, methodPath);
121121
TimeSpan? timeout = methodDescriptor.Timeout;
122122

123123
request.RequestUri = proxyUriDefinition.UriBuilder.Uri;

src/NetCoreStack.Proxy/Types/ContentModelBinder.cs

Lines changed: 8 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,22 @@
11
using System.Collections.Generic;
2+
using System.Linq;
23
using System.Net;
34

45
namespace NetCoreStack.Proxy
56
{
67
public abstract class ContentModelBinder : IContentModelBinder
78
{
8-
protected virtual void EnsureTemplate(string methodMarkerTemplate,
9-
ProxyUriDefinition proxyUriDefinition,
10-
Dictionary<string, string> argsDic,
11-
List<string> keys)
9+
protected virtual void EnsureTemplate(ContentModelBindingContext context, Dictionary<string, string> argsDic, List<string> keys)
1210
{
13-
if (!string.IsNullOrEmpty(methodMarkerTemplate))
11+
if (!string.IsNullOrEmpty(context.MethodMarkerTemplate))
1412
{
15-
if (proxyUriDefinition.HasParameter)
13+
for (int i = 0; i < context.ParameterParts.Count; i++)
1614
{
17-
for (int i = 0; i < proxyUriDefinition.ParameterParts.Count; i++)
15+
var key = keys[i];
16+
if (argsDic.TryGetValue(key, out string value))
1817
{
19-
var key = keys[i];
20-
if(argsDic.TryGetValue(key, out string value))
21-
{
22-
proxyUriDefinition.UriBuilder.Path += ($"/{WebUtility.UrlEncode(value)}");
23-
argsDic.Remove(key);
24-
}
18+
context.UriBuilder.Path += ($"/{WebUtility.UrlEncode(value)}");
19+
argsDic.Remove(key);
2520
}
2621
}
2722
}
Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
using System;
1+
using Microsoft.AspNetCore.Routing.Template;
2+
using System;
23
using System.Collections.Generic;
4+
using System.Linq;
35
using System.Net.Http;
46

57
namespace NetCoreStack.Proxy
@@ -14,15 +16,33 @@ public int ArgsLength
1416
}
1517
}
1618

17-
public UriBuilder UriBuilder => UriDefinition?.UriBuilder;
19+
public bool HasAnyTemplateParameterKey
20+
{
21+
get
22+
{
23+
return TemplateParameterKeys.Any();
24+
}
25+
}
26+
27+
public UriBuilder UriBuilder => UriDefinition.UriBuilder;
1828
public Uri Uri => UriBuilder.Uri;
19-
public string MethodMarkerTemplate { get; set; }
29+
public string MethodMarkerTemplate => MethodDescriptor.MethodMarkerTemplate;
30+
public List<TemplatePart> ParameterParts => MethodDescriptor.ParameterParts;
31+
public List<string> TemplateParameterKeys => MethodDescriptor.TemplateParameterKeys;
32+
public List<ProxyModelMetadata> Parameters => MethodDescriptor.Parameters;
2033
public bool IsMultiPartFormData { get; set; }
34+
public ContentModelBindingResult ContentResult { get; set; }
2135
public object[] Args { get; set; }
2236
public IModelContentResolver ModelContentResolver { get; set; }
23-
public List<ProxyModelMetadata> Parameters { get; set; }
24-
public ContentModelBindingResult ContentResult { get; set; }
25-
public ProxyUriDefinition UriDefinition { get; set; }
26-
public HttpMethod HttpMethod { get; set; }
37+
public HttpMethod HttpMethod { get; }
38+
public ProxyUriDefinition UriDefinition { get; }
39+
public ProxyMethodDescriptor MethodDescriptor { get; }
40+
41+
public ContentModelBindingContext(HttpMethod httpMethod, ProxyMethodDescriptor methodDescriptor, ProxyUriDefinition proxyUriDefinition)
42+
{
43+
HttpMethod = httpMethod ?? throw new ArgumentNullException(nameof(httpMethod));
44+
MethodDescriptor = methodDescriptor ?? throw new ArgumentNullException(nameof(methodDescriptor));
45+
UriDefinition = proxyUriDefinition ?? throw new ArgumentNullException(nameof(proxyUriDefinition));
46+
}
2747
}
2848
}

0 commit comments

Comments
 (0)