Skip to content

Commit a9270b2

Browse files
authored
#188129245 Add: Support for logging body in aws lambda (#90)
* Add: Support for aws lambda Add: Support for aws lambda Bump version to 1.4.9 * Refactor: Update README.md Refactor: Update README.md * Refactor: Call next middleware only once Refactor: Call next middleware only once
1 parent 6403803 commit a9270b2

File tree

5 files changed

+66
-9
lines changed

5 files changed

+66
-9
lines changed

Moesif.Middleware/Moesif.Middleware.nuspec

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<package >
33
<metadata>
44
<id>Moesif.Middleware</id>
5-
<version>1.4.8</version>
5+
<version>1.4.9</version>
66
<title>MoesifMiddleware</title>
77
<authors>Moesif</authors>
88
<owners>Moesif</owners>

Moesif.Middleware/NetCore/MoesifMiddlewareNetCore.cs

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ public class MoesifMiddlewareNetCore
6666

6767
public bool logBody;
6868

69+
public bool isLambda;
70+
6971
private AutoResetEvent configEvent ;
7072

7173
private AutoResetEvent governanceEvent;
@@ -83,7 +85,7 @@ public MoesifMiddlewareNetCore(Dictionary<string, object> _middleware)
8385
try
8486
{
8587
// Initialize client
86-
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netcore/1.4.8", debug);
88+
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netcore/1.4.9", debug);
8789
debug = loggerHelper.GetConfigBoolValues(moesifOptions, "LocalDebug", false);
8890
companyHelper = new CompanyHelper();
8991
userHelper = new UserHelper();
@@ -104,8 +106,9 @@ public MoesifMiddlewareNetCore(RequestDelegate next, Dictionary<string, object>
104106
{
105107
// Initialize client
106108
debug = loggerHelper.GetConfigBoolValues(moesifOptions, "LocalDebug", false);
107-
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netcore/1.4.8", debug);
109+
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netcore/1.4.9", debug);
108110
logBody = loggerHelper.GetConfigBoolValues(moesifOptions, "LogBody", true);
111+
isLambda = loggerHelper.GetConfigBoolValues(moesifOptions, "IsLambda", false);
109112
_next = next;
110113
config = AppConfig.getDefaultAppConfig();
111114
userHelper = new UserHelper(); // Create a new instance of userHelper
@@ -324,9 +327,16 @@ public async Task Invoke(HttpContext httpContext)
324327
}
325328
else
326329
{
330+
if (isLambda)
331+
{
332+
eventModel.Response = await FormatLambdaResponse(httpContext, transactionId);
333+
334+
} else
335+
{
336+
eventModel.Response = FormatResponse(httpContext.Response, outputCaptureOwin, transactionId);
337+
}
327338

328-
eventModel.Response = FormatResponse(httpContext.Response, outputCaptureOwin, transactionId);
329-
if(eventModel.CompanyId == null)
339+
if (eventModel.CompanyId == null)
330340
{
331341

332342
eventModel.CompanyId = loggerHelper.GetConfigValues("IdentifyCompany", moesifOptions, httpContext.Request, httpContext.Response, debug);
@@ -425,6 +435,50 @@ private EventResponseModel FormatResponse(HttpResponse response, StreamHelper st
425435
return eventRsp;
426436
}
427437

438+
private async Task<EventResponseModel> FormatLambdaResponse(HttpContext httpContext, string transactionId)
439+
{
440+
// Response headers
441+
var rspHeaders = loggerHelper.ToHeaders(httpContext.Response.Headers, debug);
442+
443+
// Add Transaction Id to Response Header
444+
rspHeaders = loggerHelper.AddTransactionId("X-Moesif-Transaction-Id", transactionId, rspHeaders);
445+
446+
var responseWrapper = new Tuple<object, string>(null, null);
447+
if (logBody)
448+
{
449+
// ResponseBody
450+
string contentEncoding = "";
451+
rspHeaders.TryGetValue("Content-Encoding", out contentEncoding);
452+
453+
var originalResponseBodyStream = httpContext.Response.Body;
454+
string responseBody = string.Empty;
455+
using (var responseBodyStream = new MemoryStream())
456+
{
457+
httpContext.Response.Body = responseBodyStream; // Use the memory stream for the response
458+
459+
// Capture the response
460+
httpContext.Response.Body.Seek(0, SeekOrigin.Begin);
461+
responseBody = await new StreamReader(httpContext.Response.Body).ReadToEndAsync();
462+
httpContext.Response.Body.Seek(0, SeekOrigin.Begin); // Reset the position for the response to be sent
463+
464+
// Copy the response body back to the original stream
465+
await responseBodyStream.CopyToAsync(originalResponseBodyStream);
466+
}
467+
468+
// Serialize Response body
469+
responseWrapper = loggerHelper.Serialize(responseBody, httpContext.Response.ContentType, logBody, debug);
470+
}
471+
var eventRsp = new EventResponseModel()
472+
{
473+
Time = DateTime.UtcNow,
474+
Status = httpContext.Response.StatusCode,
475+
Headers = rspHeaders,
476+
Body = responseWrapper.Item1,
477+
TransferEncoding = responseWrapper.Item2
478+
};
479+
return eventRsp;
480+
}
481+
428482
private String getUserId(HttpContext httpContext, EventRequestModel request)
429483
{
430484
Object iu;

Moesif.Middleware/NetFramework/MoesifMiddlewareNetFramework.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ public MoesifMiddlewareNetFramework(Dictionary<String,object> options) : base(nu
8282
_logger = null;
8383
loggerHelper = new LoggerHelper(_logger);
8484
debug = loggerHelper.GetConfigBoolValues(moesifOptions, "LocalDebug", false);
85-
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netframework/1.4.8", debug);
85+
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netframework/1.4.9", debug);
8686
userHelper = new UserHelper(); // Create a new instance of userHelper
8787
companyHelper = new CompanyHelper(); // Create a new instane of companyHelper
8888
clientIpHelper = new ClientIp(); // Create a new instance of client Ip
@@ -98,7 +98,7 @@ public MoesifMiddlewareNetFramework(OwinMiddleware next, Dictionary<string, obje
9898
{
9999
// Initialize client
100100
debug = loggerHelper.GetConfigBoolValues(moesifOptions, "LocalDebug", false);
101-
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netframework/1.4.8", debug);
101+
client = new MoesifApiClient(moesifOptions["ApplicationId"].ToString(), "moesif-netframework/1.4.9", debug);
102102
logBody = loggerHelper.GetConfigBoolValues(moesifOptions, "LogBody", true);
103103
isBatchingEnabled = loggerHelper.GetConfigBoolValues(moesifOptions, "EnableBatching", true); // Enable batching
104104
disableStreamOverride = loggerHelper.GetConfigBoolValues(moesifOptions, "DisableStreamOverride", false); // Reset Request Body position

Moesif.Middleware/Properties/AssemblyInfo.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,5 +23,5 @@
2323
// You can specify all the values or you can default the Build and Revision Numbers
2424
// by using the '*' as shown below:
2525
// [assembly: AssemblyVersion("1.0.*")]
26-
[assembly: AssemblyVersion("1.4.8")]
27-
[assembly: AssemblyFileVersion("1.4.8")]
26+
[assembly: AssemblyVersion("1.4.9")]
27+
[assembly: AssemblyFileVersion("1.4.9")]

README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,9 @@ _boolean_, default true. Set to false to not log the request and response body t
126126
#### __`AuthorizationUserIdField`__
127127
(optional), _string_, Field name in JWT/OpenId token's payload for identifying users. Only applicable if authorization_header_name is set and is a Bearer token.
128128

129+
#### __`IsLambda`__
130+
_boolean_, default false. Set to true if integrating with AWS Lambda functions.
131+
129132
#### __`Capture_Outgoing_Requests`__
130133
(optional), Set to capture all outgoing API calls from your app to third parties like Stripe or to your own dependencies while using [System.Net.Http](https://docs.microsoft.com/en-us/dotnet/api/system.net.http?view=netframework-4.8) package. The options below is applied to outgoing API calls. When the request is outgoing, for options functions that take request and response as input arguments, the request and response objects passed in are [HttpRequestMessage](https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httprequestmessage) request and [HttpResponseMessage](https://docs.microsoft.com/en-us/uwp/api/windows.web.http.httpresponsemessage) response objects.
131134

0 commit comments

Comments
 (0)