public void DisposeAlsoDisposesDecoratedStream() { var ms = new MemoryStream(); var decorator = new MirrorStreamDecorator(ms); decorator.Dispose(); Assert.IsFalse(ms.CanRead); Assert.IsFalse(ms.CanWrite); }
public static Mock <HttpContextBase> MockHttpContext(string responseBody = null, string inputStream = null) { if (responseBody == null) { responseBody = $"ResponseBody {Guid.NewGuid()}"; } if (inputStream == null) { inputStream = $"InputStream {Guid.NewGuid()}"; } var ms = new MirrorStreamDecorator(new MemoryStream()); var sw = new StreamWriter(ms); sw.Write(responseBody); sw.Flush(); var httpRequest = new Mock <HttpRequestBase>(); httpRequest.Setup(p => p.Url).Returns(UrlParser.GenerateUri("/Home/Index")); httpRequest.Setup(p => p.HttpMethod).Returns("POST"); httpRequest.Setup(p => p.InputStream).Returns(new MemoryStream(Encoding.UTF8.GetBytes(inputStream))); httpRequest.Setup(p => p.Headers).Returns(GenerateNameValueCollection(new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>("Content-Type", "application/json") })); var httpResponse = new Mock <HttpResponseBase>(); httpResponse.Setup(p => p.StatusCode).Returns(204); httpResponse.SetupProperty(p => p.Filter, ms); httpResponse.Setup(p => p.Headers).Returns(GenerateNameValueCollection(new List <KeyValuePair <string, string> > { new KeyValuePair <string, string>("Content-Type", "application/json") })); var httpContext = new Mock <HttpContextBase>(); httpContext.Setup(p => p.Request).Returns(httpRequest.Object); httpContext.Setup(p => p.Response).Returns(httpResponse.Object); httpContext.Setup(p => p.Items).Returns(new Dictionary <string, object>()); return(httpContext); }
public void DisposesTheResponseMirrorStreamDecorator() { var ms = new MirrorStreamDecorator(new MemoryStream()); var httpResponse = new Mock <HttpResponseBase>(); httpResponse.SetupProperty(p => p.Filter, ms); var httpContext = Helpers.MockHttpContext(); httpContext.Setup(p => p.Response).Returns(httpResponse.Object); KissLogHttpModule module = new KissLogHttpModule(); module.OnEndRequest(httpContext.Object); Assert.IsTrue(ms.MirrorStream.CanRead == false); }
public void ClosingOrDisposingTheDecoratedStreamDoesNotDisposeTheMirrorStream() { MirrorStreamDecorator decorator = null; using (var ms = new MemoryStream()) { decorator = new MirrorStreamDecorator(ms); using (var sw = new StreamWriter(decorator)) { sw.Write($"Input stream {Guid.NewGuid()}"); sw.Flush(); } ms.Close(); } Assert.IsTrue(decorator.MirrorStream.CanRead); Assert.IsTrue(decorator.MirrorStream.CanWrite); }
public void CopiesContent() { string body = $"Input stream {Guid.NewGuid()}"; string result = null; var decorator = new MirrorStreamDecorator(new MemoryStream()); using (var sw = new StreamWriter(decorator)) { sw.Write(body); sw.Flush(); } using (StreamReader reader = new StreamReader(decorator.MirrorStream, decorator.Encoding)) { decorator.MirrorStream.Position = 0; result = reader.ReadToEndAsync().Result; } Assert.AreEqual(body, result); }
internal void OnEndRequest(HttpContextBase httpContext) { if (httpContext == null) { throw new ArgumentNullException(nameof(httpContext)); } if (httpContext.Response == null) { InternalLogger.LogException(new NullHttpResponseException(nameof(OnEndRequest))); return; } if (httpContext.Request == null) { InternalLogger.LogException(new NullHttpRequestException(nameof(OnEndRequest))); return; } var factory = new LoggerFactory(); Logger logger = factory.GetInstance(httpContext); // IIS redirect bypasses the IHttpModule.BeginRequest event if (logger.DataContainer.HttpProperties == null) { KissLog.Http.HttpRequest httpRequest = HttpRequestFactory.Create(httpContext.Request); logger.DataContainer.SetHttpProperties(new Http.HttpProperties(httpRequest)); } MirrorStreamDecorator responseStream = GetResponseStream(httpContext.Response); long contentLength = responseStream == null ? 0 : responseStream.MirrorStream.Length; KissLog.Http.HttpResponse httpResponse = HttpResponseFactory.Create(httpContext.Response, contentLength); logger.DataContainer.HttpProperties.SetResponse(httpResponse); Exception ex = httpContext.Server?.GetLastError(); if (ex != null) { logger.Error(ex); } if (responseStream != null) { if (KissLog.InternalHelpers.CanReadResponseBody(httpResponse.Properties.Headers)) { if (ShouldLogResponseBody(logger, factory, httpContext)) { ILogResponseBodyStrategy logResponseBody = LogResponseBodyStrategyFactory.Create(responseStream.MirrorStream, responseStream.Encoding, logger); logResponseBody.Execute(); } } responseStream.MirrorStream.Dispose(); } IEnumerable <Logger> loggers = factory.GetAll(httpContext); KissLog.InternalHelpers.WrapInTryCatch(() => { NotifyListeners.NotifyFlush.Notify(loggers.ToArray()); }); }
public void UsesUtf8EncodingIfStreamEncodingIsNull() { var stream = new MirrorStreamDecorator(new MemoryStream()); Assert.AreEqual(Encoding.UTF8, stream.Encoding); }
public void ThrowsExceptionWhenStreamIsNull() { var item = new MirrorStreamDecorator(null); }
public async Task Invoke(HttpContext context) { KissLog.Http.HttpRequest httpRequest = HttpRequestFactory.Create(context.Request); var factory = new LoggerFactory(); Logger logger = factory.GetInstance(context); logger.DataContainer.SetHttpProperties(new Http.HttpProperties(httpRequest)); KissLog.InternalHelpers.WrapInTryCatch(() => { NotifyListeners.NotifyBeginRequest.Notify(httpRequest); }); ExceptionDispatchInfo ex = null; if (context.Response.Body != null && context.Response.Body is MirrorStreamDecorator == false) { context.Response.Body = new MirrorStreamDecorator(context.Response.Body); } try { await _next(context); } catch (Exception e) { ex = ExceptionDispatchInfo.Capture(e); throw; } finally { MirrorStreamDecorator responseStream = GetResponseStream(context.Response); long contentLength = responseStream == null ? 0 : responseStream.MirrorStream.Length; int statusCode = context.Response.StatusCode; if (ex != null) { statusCode = (int)HttpStatusCode.InternalServerError; logger.Error(ex.SourceException); } KissLog.Http.HttpResponse httpResponse = HttpResponseFactory.Create(context.Response, contentLength); httpResponse.SetStatusCode(statusCode); logger.DataContainer.HttpProperties.SetResponse(httpResponse); if (responseStream != null) { if (KissLog.InternalHelpers.CanReadResponseBody(httpResponse.Properties.Headers)) { if (ShouldLogResponseBody(logger, factory, context)) { ILogResponseBodyStrategy logResponseBody = LogResponseBodyStrategyFactory.Create(responseStream.MirrorStream, responseStream.Encoding, logger); logResponseBody.Execute(); } } responseStream.MirrorStream.Dispose(); } IEnumerable <Logger> loggers = factory.GetAll(context); KissLog.InternalHelpers.WrapInTryCatch(() => { NotifyListeners.NotifyFlush.Notify(loggers.ToArray()); }); } }