Skip to content

Commit f0735c7

Browse files
authored
Merge pull request #142 from aws/mark-net6
Add a class to forward requests to a core application controller
2 parents 8b3b47a + 4bede1d commit f0735c7

File tree

1 file changed

+136
-0
lines changed

1 file changed

+136
-0
lines changed
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
/*
2+
3+
using Microsoft.AspNetCore.Http.Extensions;
4+
using System.Net;
5+
6+
namespace Modernize.Web.Mvc.Controllers
7+
{
8+
public static class MonolithService
9+
{
10+
//TODO Add Service Host
11+
private static string ServiceHost = "";
12+
13+
//TODO Add Service Port
14+
private static string ServicePort = "";
15+
private static string ServiceUrl = $"https://{ServiceHost}";
16+
private static HttpClientHandler handler = new HttpClientHandler()
17+
{
18+
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
19+
};
20+
private static HttpClient client = new HttpClient(handler);
21+
22+
23+
public static async Task<string> CreateRequestAsync(HttpRequestMessage httpRequest, Microsoft.AspNetCore.Routing.RouteData routeData)
24+
{
25+
string? actionName = routeData?.Values["action"]?.ToString();
26+
string? controllerName = routeData?.Values["controller"]?.ToString();
27+
var httpMessage = GetRequestMessage(httpRequest, controllerName, actionName);
28+
return await InvokeRequestAsync(httpMessage);
29+
}
30+
31+
public static string CreateRequest(HttpRequestMessage httpRequest, Microsoft.AspNetCore.Routing.RouteData routeData)
32+
{
33+
string? actionName = routeData?.Values["action"]?.ToString();
34+
string? controllerName = routeData?.Values["controller"]?.ToString();
35+
var httpMessage = GetRequestMessage(httpRequest, controllerName, actionName);
36+
return InvokeRequest(httpMessage);
37+
}
38+
39+
40+
public static async Task<string> CreateRequestAsync(HttpRequest httpRequest, Microsoft.AspNetCore.Routing.RouteData routeData)
41+
{
42+
string? actionName = routeData?.Values["action"]?.ToString();
43+
string? controllerName = routeData?.Values["controller"]?.ToString();
44+
var httpMessage = GetRequestMessage(httpRequest, controllerName, actionName);
45+
return await InvokeRequestAsync(httpMessage);
46+
}
47+
48+
public static string CreateRequest(HttpRequest httpRequest, Microsoft.AspNetCore.Routing.RouteData routeData)
49+
{
50+
string? actionName = routeData?.Values["action"]?.ToString();
51+
string? controllerName = routeData?.Values["controller"]?.ToString();
52+
var httpMessage = GetRequestMessage(httpRequest, controllerName, actionName);
53+
return InvokeRequest(httpMessage);
54+
}
55+
56+
private static async Task<string> InvokeRequestAsync(HttpRequestMessage requestMessage)
57+
{
58+
var result = await client.SendAsync(requestMessage).ConfigureAwait(false);
59+
var stringResult = await result.Content.ReadAsStringAsync().ConfigureAwait(false);
60+
return stringResult;
61+
}
62+
63+
private static string InvokeRequest(HttpRequestMessage requestMessage)
64+
{
65+
var result = client.SendAsync(requestMessage).Result;
66+
var stringResult = result.Content.ReadAsStringAsync().Result;
67+
return stringResult;
68+
}
69+
70+
private static HttpRequestMessage GetRequestMessage(HttpRequestMessage httpRequestMessage, string? controllerName, string? actionName)
71+
{
72+
var currentUri = httpRequestMessage.RequestUri;
73+
var uriBuilder = new UriBuilder($"{ServiceUrl}/{controllerName}/{actionName}")
74+
{
75+
Host = ServiceHost,
76+
Port = int.Parse(ServicePort),
77+
Fragment = currentUri?.Fragment,
78+
Scheme = currentUri?.Scheme,
79+
Path = currentUri?.PathAndQuery
80+
};
81+
82+
var newRequest = httpRequestMessage;
83+
newRequest.RequestUri = uriBuilder.Uri;
84+
return newRequest;
85+
}
86+
private static HttpRequestMessage GetRequestMessage(HttpRequest httpRequest, string controllerName, string actionName)
87+
{
88+
var httpMethod = new HttpMethod(httpRequest.Method);
89+
var currentUri = new Uri(httpRequest.GetDisplayUrl());
90+
var uriBuilder = new UriBuilder($"{ServiceUrl}/{controllerName}/{actionName}")
91+
{
92+
Host = ServiceHost,
93+
Port = int.Parse(ServicePort),
94+
Fragment = currentUri.Fragment,
95+
Scheme = currentUri.Scheme,
96+
Path = currentUri.PathAndQuery
97+
};
98+
var requestMessage = new HttpRequestMessage(httpMethod, uriBuilder.Uri);
99+
var currentHeaders = httpRequest.Headers.Keys.ToArray();
100+
101+
if (httpMethod == HttpMethod.Post || httpMethod == HttpMethod.Put)
102+
{
103+
var streamReader = new StreamReader(httpRequest.Body).ReadToEnd();
104+
requestMessage.Content = new StringContent(streamReader);
105+
requestMessage.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(httpRequest.ContentType);
106+
//requestMessage.Content.Headers.ContentEncoding.Add(httpRequest.ContentEncoding.HeaderName);
107+
requestMessage.Content.Headers.ContentLength = httpRequest.ContentLength;
108+
}
109+
for (int i = 0; i < currentHeaders.Length; i++)
110+
{
111+
try
112+
{
113+
if (currentHeaders[i] == "Host")
114+
{
115+
requestMessage?.Headers.Add(currentHeaders[i], ServiceHost);
116+
}
117+
else if (currentHeaders[i].StartsWith("Content-"))
118+
{
119+
requestMessage?.Content?.Headers.TryAddWithoutValidation(currentHeaders[i], httpRequest.Headers[currentHeaders[i]].FirstOrDefault());
120+
}
121+
else
122+
{
123+
requestMessage?.Headers.TryAddWithoutValidation(currentHeaders[i], httpRequest.Headers[currentHeaders[i]].FirstOrDefault());
124+
}
125+
}
126+
catch (Exception ex)
127+
{
128+
}
129+
}
130+
return requestMessage;
131+
}
132+
}
133+
}
134+
135+
136+
*/

0 commit comments

Comments
 (0)