public static RaygunRequestMessage Build(HttpRequestMessage request, RaygunRequestMessageOptions options) { var message = new RaygunRequestMessage(); options = options ?? new RaygunRequestMessageOptions(); message.HostName = request.RequestUri.Host; message.Url = request.RequestUri.AbsolutePath; message.HttpMethod = request.Method.ToString(); message.IPAddress = GetIPAddress(request); message.Form = ToDictionary(request.GetQueryNameValuePairs(), options.IsFormFieldIgnored); message.QueryString = ToDictionary(request.GetQueryNameValuePairs(), s => false); if (!options.IsRawDataIgnored) { object body; if (request.Properties.TryGetValue(RaygunWebApiDelegatingHandler.RequestBodyKey, out body)) { message.RawData = body.ToString(); } } SetHeaders(message, request, options.IsHeaderIgnored); return(message); }
public static RaygunRequestMessage Build(OwinEnvironment environment) { var request = new OwinRequest(environment); // ToDo: limit querystring, form, and header values to 256 characters var message = new RaygunRequestMessage(); message.HostName = request.Host.Value; message.Url = request.Uri.AbsolutePath; message.HttpMethod = request.Method; message.IPAddress = request.RemoteIpAddress; // ToDo: bring this up to par with the official client // ToDo: filter querystring values message.QueryString = request.Query.ToDictionary(_ => _.Key, _ => string.Join(", ", _.Value)); // ToDo: filter form values (add 'password' by default?) message.Form = request.ReadForm().ToDictionary(_ => _.Key, _ => string.Join(", ", _.Value)); // ToDo: filter headers message.Headers = request.Headers.ToDictionary(_ => _.Key, _ => string.Join(", ", _.Value)); message.Headers.Remove("Cookie"); message.Cookies = GetCookies(request.Cookies); if (request.ContentType != "text/html" && request.ContentType != "application/x-www-form-urlencoded" && request.Method != "GET") { var text = request.BodyAsString(); message.RawData = text.Substring(0, Math.Min(4096, text.Length)); } message.Data = GetData(request).Where(_ => _.Value != null).ToDictionary(_ => _.Key, _ => _.Value); return(message); }
private const int MAX_VALUE_LENGTH = 256; // Characters public static RaygunRequestMessage Build(HttpRequestMessage request, RaygunRequestMessageOptions options) { options = options ?? new RaygunRequestMessageOptions(); var message = new RaygunRequestMessage() { IPAddress = GetIPAddress(request), QueryString = GetQueryString(request, options), Form = GetForm(request, options), RawData = GetRawData(request, options), Headers = GetHeaders(request, options) }; try { message.HostName = request.RequestUri.Host; message.Url = request.RequestUri.AbsolutePath; message.HttpMethod = request.Method.ToString(); } catch (Exception e) { System.Diagnostics.Trace.WriteLine("Failed to get basic request info: {0}", e.Message); } return(message); }
private const int MAX_VALUE_LENGTH = 256; // Characters public static RaygunRequestMessage Build(HttpRequest request, RaygunRequestMessageOptions options) { options = options ?? new RaygunRequestMessageOptions(); RaygunRequestMessage message = new RaygunRequestMessage() { IPAddress = GetIpAddress(request), QueryString = GetQueryString(request, options), Cookies = GetCookies(request, options), Data = GetServerVariables(request, options), Form = GetForm(request, options), RawData = GetRawData(request, options), Headers = GetHeaders(request, options) }; try { message.HostName = request.Url.Host; message.Url = request.Url.AbsolutePath; message.HttpMethod = request.RequestType; } catch (Exception e) { RaygunLogger.Instance.Error($"Failed to get basic request info: { e.Message}"); } return(message); }
private static RaygunRequestMessage CreateRaygunRequestMessage(LogEntry logEntry) { if (logEntry.Http?.Request == null) { return(null); } var requestDetails = new RaygunRequestMessage { HttpMethod = logEntry.Http.Request.Method, Url = logEntry.Http.Request.Uri, HostName = logEntry.Http.Request.Host, RawData = GetTextContent(logEntry.Http.Request.Body), Headers = logEntry.Http.Request.Headers?.Where(h => !string.IsNullOrEmpty(h.Key)).ToLookup(h => h.Key, h => h.Value).ToDictionary(g => g.Key, g => g.First()) }; // TODO Uri.Query only works for absolute urls, wtf? if (logEntry.Http.Request.Uri.Contains('?')) { var queryString = HttpUtility.ParseQueryString(logEntry.Http.Request.Uri.Split('?').Last()); var applicableKeys = queryString.AllKeys.Where(s => !string.IsNullOrEmpty(s)); requestDetails.QueryString = applicableKeys.ToDictionary(k => k, k => queryString[k]); } return(requestDetails); }
public static RaygunRequestMessage Build(HttpRequestMessage request, RaygunRequestMessageOptions options) { var message = new RaygunRequestMessage(); options = options ?? new RaygunRequestMessageOptions(); message.HostName = request.RequestUri.Host; message.Url = request.RequestUri.AbsolutePath; message.HttpMethod = request.Method.ToString(); message.IPAddress = GetIPAddress(request); message.Form = ToDictionary(request.GetQueryNameValuePairs(), options.IsFormFieldIgnored); message.QueryString = ToDictionary(request.GetQueryNameValuePairs(), s => false); SetHeaders(message, request, options.IsHeaderIgnored); if (!options.IsRawDataIgnored) { string contentType = null; if (message.Headers != null && message.Headers.Contains("Content-Type")) { contentType = (string)message.Headers["Content-Type"]; } if (contentType == null || CultureInfo.InvariantCulture.CompareInfo.IndexOf(contentType, "application/x-www-form-urlencoded", CompareOptions.IgnoreCase) < 0) { object body; if (request.Properties.TryGetValue(RaygunWebApiDelegatingHandler.RequestBodyKey, out body)) { message.RawData = body.ToString(); } } } return(message); }
public void QueryStringTest() { var request = new HttpRequest("test", "http://google.com", "test=test"); var message = new RaygunRequestMessage(request, null); Assert.That(message.QueryString, Contains.Item(new KeyValuePair <string, string>("test", "test"))); }
public void IgnoreFormField_CaseInsensitive() { var request = CreateWritableRequest(); request.Form.Add("TESTFORMFIELD", "FormFieldValue"); Assert.AreEqual(1, request.Form.Count); var options = new RaygunRequestMessageOptions(new string[] { "testformfield" }, Enumerable.Empty <string>(), Enumerable.Empty <string>(), Enumerable.Empty <string>()); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Form.Count); }
private int CookieCount(RaygunRequestMessage message, string name) { int count = 0; foreach (Mindscape.Raygun4Net.Messages.RaygunRequestMessage.Cookie cookie in message.Cookies) { if (name.Equals(cookie.Name)) { count++; } } return count; }
public void DuplicateCookies() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TestCookie", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie", "CookieValue")); Assert.AreEqual(2, request.Cookies.Count); var message = new RaygunRequestMessage(request, new RaygunRequestMessageOptions()); Assert.AreEqual(2, message.Cookies.Count); Assert.AreEqual(2, CookieCount(message, "TestCookie")); }
public void IgnoreCookie_CaseInsensitive() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TESTCOOKIE", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie", "CookieValue")); request.Cookies.Add(new HttpCookie("testcookie", "CookieValue")); Assert.AreEqual(3, request.Cookies.Count); var options = new RaygunRequestMessageOptions(_empty, _empty, new string[] { "TeStCoOkIe" }, _empty); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Cookies.Count); }
public void IgnoreCookie_Contains() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TestCookieTest", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie", "CookieValue")); request.Cookies.Add(new HttpCookie("CookieTest", "CookieValue")); Assert.AreEqual(3, request.Cookies.Count); var options = new RaygunRequestMessageOptions(_empty, _empty, new string[] { "*cookie*" }, _empty); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Cookies.Count); }
public void IgnoreMultipleCookies() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TestCookie1", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie2", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie3", "CookieValue")); Assert.AreEqual(3, request.Cookies.Count); var options = new RaygunRequestMessageOptions(_empty, _empty, new string[] { "TestCookie1", "TestCookie3" }, _empty); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(1, message.Cookies.Count); Assert.AreEqual(1, CookieCount(message, "TestCookie2")); }
public void IgnoreAllFormFields() { var request = CreateWritableRequest(); request.Form.Add("TestFormField1", "FormFieldValue"); request.Form.Add("TestFormField2", "FormFieldValue"); request.Form.Add("TestFormField3", "FormFieldValue"); Assert.AreEqual(3, request.Form.Count); var options = new RaygunRequestMessageOptions(new string[] { "*" }, _empty, _empty, _empty); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Form.Count); }
public void IgnoreFormField_Contains() { var request = CreateWritableRequest(); request.Form.Add("TestFormFieldTest", "FormFieldValue"); request.Form.Add("TestFormField", "FormFieldValue"); request.Form.Add("FormFieldTest", "FormFieldValue"); Assert.AreEqual(3, request.Form.Count); var options = new RaygunRequestMessageOptions(new string[] { "*formfield*" }, Enumerable.Empty <string>(), Enumerable.Empty <string>(), Enumerable.Empty <string>()); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Form.Count); }
public void IgnoreAllCookies() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TestCookie1", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie2", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie3", "CookieValue")); Assert.AreEqual(3, request.Cookies.Count); var options = new RaygunRequestMessageOptions(Enumerable.Empty <string>(), Enumerable.Empty <string>(), new string[] { "*" }, Enumerable.Empty <string>()); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(0, message.Cookies.Count); }
public static RaygunRequestMessage Build(HttpRequest request, RaygunRequestMessageOptions options) { RaygunRequestMessage message = new RaygunRequestMessage(); options = options ?? new RaygunRequestMessageOptions(); message.HostName = request.Url.Host; message.Url = request.Url.AbsolutePath; message.HttpMethod = request.RequestType; message.IPAddress = GetIpAddress(request); message.QueryString = ToDictionary(request.QueryString, null); message.Headers = ToDictionary(request.Headers, options.IsHeaderIgnored); message.Headers.Remove("Cookie"); message.Form = ToDictionary(request.Form, options.IsFormFieldIgnored, true); message.Cookies = GetCookies(request.Cookies, options.IsCookieIgnored); // Remove ignored and duplicated variables message.Data = ToDictionary(request.ServerVariables, options.IsServerVariableIgnored); message.Data.Remove("ALL_HTTP"); message.Data.Remove("HTTP_COOKIE"); message.Data.Remove("ALL_RAW"); if (!options.IsRawDataIgnored) { try { var contentType = request.Headers["Content-Type"]; if (contentType != "text/html" && contentType != "application/x-www-form-urlencoded" && request.RequestType != "GET") { int length = 4096; request.InputStream.Seek(0, SeekOrigin.Begin); string temp = new StreamReader(request.InputStream).ReadToEnd(); if (length > temp.Length) { length = temp.Length; } message.RawData = temp.Substring(0, length); } } catch (HttpException) { } } return(message); }
public void IgnoreMultipleFormFields() { var request = CreateWritableRequest(); request.Form.Add("TestFormField1", "FormFieldValue"); request.Form.Add("TestFormField2", "FormFieldValue"); request.Form.Add("TestFormField3", "FormFieldValue"); Assert.AreEqual(3, request.Form.Count); var options = new RaygunRequestMessageOptions(new string[] { "TestFormField1", "TestFormField3" }, Enumerable.Empty <string>(), Enumerable.Empty <string>(), Enumerable.Empty <string>()); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(1, message.Form.Count); Assert.IsTrue(message.Form.Contains("TestFormField2")); }
/// <summary> /// Asynchronously transmits an exception to Raygun.io. /// </summary> /// <param name="exception">The exception to deliver.</param> /// <param name="tags">A list of strings associated with the message.</param> /// <param name="userCustomData">A key-value collection of custom data that will be added to the payload.</param> public void SendInBackground(Exception exception, System.Collections.Generic.IList <string> tags, System.Collections.IDictionary userCustomData) { if (CanSend(exception)) { // We need to process the HttpRequestMessage on the current thread, // otherwise it will be disposed while we are using it on the other thread. RaygunRequestMessage currentRequestMessage = BuildRequestMessage(); ThreadPool.QueueUserWorkItem(c => { _currentRequestMessage.Value = currentRequestMessage; StripAndSend(exception, tags, userCustomData); }); FlagAsSent(exception); } }
private static RaygunRequestMessage BuildRequestMessageFromStructureValue(StructureValue requestMessageStructure) { var requestMessage = new RaygunRequestMessage(); foreach (var property in requestMessageStructure.Properties) { switch (property.Name) { case nameof(RaygunRequestMessage.Url): requestMessage.Url = property.AsString(); break; case nameof(RaygunRequestMessage.HostName): requestMessage.HostName = property.AsString(); break; case nameof(RaygunRequestMessage.HttpMethod): requestMessage.HttpMethod = property.AsString(); break; case nameof(RaygunRequestMessage.IPAddress): requestMessage.IPAddress = property.AsString(); break; case nameof(RaygunRequestMessage.RawData): requestMessage.RawData = property.AsString(); break; case nameof(RaygunRequestMessage.Headers): requestMessage.Headers = property.AsDictionary(); break; case nameof(RaygunRequestMessage.QueryString): requestMessage.QueryString = property.AsDictionary(); break; case nameof(RaygunRequestMessage.Form): requestMessage.Form = property.AsDictionary(); break; case nameof(RaygunRequestMessage.Data): requestMessage.Data = property.AsDictionary(); break; } } return(requestMessage); }
public void FormFields() { var request = CreateWritableRequest(); request.Form.Add("TestFormField1", "FormFieldValue"); request.Form.Add("TestFormField2", "FormFieldValue"); request.Form.Add("TestFormField3", "FormFieldValue"); Assert.AreEqual(3, request.Form.Count); var message = new RaygunRequestMessage(request, new RaygunRequestMessageOptions()); Assert.AreEqual(3, message.Form.Count); Assert.IsTrue(message.Form.Contains("TestFormField1")); Assert.IsTrue(message.Form.Contains("TestFormField2")); Assert.IsTrue(message.Form.Contains("TestFormField3")); }
public void IgnoreCookie_EndsWith() { var request = new HttpRequest("test", "http://google.com", "test=test"); request.Cookies.Add(new HttpCookie("TestCookieTest", "CookieValue")); request.Cookies.Add(new HttpCookie("TestCookie", "CookieValue")); request.Cookies.Add(new HttpCookie("CookieTest", "CookieValue")); Assert.AreEqual(3, request.Cookies.Count); var options = new RaygunRequestMessageOptions(Enumerable.Empty <string>(), Enumerable.Empty <string>(), new string[] { "*cookie" }, Enumerable.Empty <string>()); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(2, message.Cookies.Count); Assert.AreEqual(1, CookieCount(message, "TestCookieTest")); Assert.AreEqual(1, CookieCount(message, "CookieTest")); }
public void IgnoreFormField_EndsWith() { var request = CreateWritableRequest(); request.Form.Add("TestFormFieldTest", "FormFieldValue"); request.Form.Add("TestFormField", "FormFieldValue"); request.Form.Add("FormFieldTest", "FormFieldValue"); Assert.AreEqual(3, request.Form.Count); var options = new RaygunRequestMessageOptions(new string[] { "*formfield" }, _empty, _empty, _empty); var message = new RaygunRequestMessage(request, options); Assert.AreEqual(2, message.Form.Count); Assert.IsTrue(message.Form.Contains("TestFormFieldTest")); Assert.IsTrue(message.Form.Contains("FormFieldTest")); }
protected override async Task SendAsync(Exception exception, IList <string> tags, IDictionary userCustomData) { if (CanSend(exception)) { RaygunRequestMessage currentRequestMessage = await BuildRequestMessage(); RaygunResponseMessage currentResponseMessage = BuildResponseMessage(); _currentHttpContext.Value = null; _currentRequestMessage.Value = currentRequestMessage; _currentResponseMessage.Value = currentResponseMessage; await StripAndSend(exception, tags, userCustomData, null); FlagAsSent(exception); } }
/// <summary> /// Asynchronously transmits an exception to Raygun. /// </summary> /// <param name="exception">The exception to deliver.</param> /// <param name="tags">A list of strings associated with the message.</param> /// <param name="userCustomData">A key-value collection of custom data that will be added to the payload.</param> /// <param name="userInfo">Information about the user including the identity string.</param> public override async Task SendInBackground(Exception exception, IList <string> tags, IDictionary userCustomData, RaygunIdentifierMessage userInfo) { if (CanSend(exception)) { // We need to process the Request on the current thread, // otherwise it will be disposed while we are using it on the other thread. RaygunRequestMessage currentRequestMessage = await BuildRequestMessage(); RaygunResponseMessage currentResponseMessage = BuildResponseMessage(); var task = Task.Run(async() => { _currentRequestMessage.Value = currentRequestMessage; _currentResponseMessage.Value = currentResponseMessage; await StripAndSend(exception, tags, userCustomData, userInfo); }); FlagAsSent(exception); await task; } }
public static async Task <RaygunRequestMessage> Build(HttpContext context, RaygunRequestMessageOptions options) { var request = context.Request; options = options ?? new RaygunRequestMessageOptions(); var message = new RaygunRequestMessage { HostName = request.Host.Value, Url = request.GetDisplayUrl(), HttpMethod = request.Method, IPAddress = GetIpAddress(context.Connection), Form = await GetForm(options, request), Cookies = GetCookies(options, request), QueryString = GetQueryString(request), RawData = GetRawData(options, request), Headers = GetHeaders(request, options.IsHeaderIgnored) }; return(message); }
public void Enrich(LogEvent logEvent, ILogEventPropertyFactory propertyFactory) { if (logEvent.Level < _restrictedToMinimumLevel) { return; } if (_httpContextAccessor?.HttpContext == null) { return; } var options = new RaygunRequestMessageOptions { IsRawDataIgnored = _raygunSettings.IsRawDataIgnored, UseXmlRawDataFilter = _raygunSettings.UseXmlRawDataFilter, IsRawDataIgnoredWhenFilteringFailed = _raygunSettings.IsRawDataIgnoredWhenFilteringFailed, UseKeyValuePairRawDataFilter = _raygunSettings.UseKeyValuePairRawDataFilter }; options.AddCookieNames(_raygunSettings.IgnoreCookieNames ?? Array.Empty <string>()); options.AddHeaderNames(_raygunSettings.IgnoreHeaderNames ?? Array.Empty <string>()); options.AddFormFieldNames(_raygunSettings.IgnoreFormFieldNames ?? Array.Empty <string>()); options.AddQueryParameterNames(_raygunSettings.IgnoreQueryParameterNames ?? Array.Empty <string>()); options.AddSensitiveFieldNames(_raygunSettings.IgnoreSensitiveFieldNames ?? Array.Empty <string>()); options.AddServerVariableNames(_raygunSettings.IgnoreServerVariableNames ?? Array.Empty <string>()); RaygunRequestMessage httpRequestMessage = RaygunAspNetCoreRequestMessageBuilder .Build(_httpContextAccessor.HttpContext, options) .GetAwaiter() .GetResult(); RaygunResponseMessage httpResponseMessage = RaygunAspNetCoreResponseMessageBuilder.Build(_httpContextAccessor.HttpContext); // The Raygun request/response messages are stored in the logEvent properties collection. // When the error is sent to Raygun, these messages are extracted from the known properties // and then removed so as to not duplicate data in the payload. logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(RaygunRequestMessagePropertyName, httpRequestMessage, true)); logEvent.AddPropertyIfAbsent(propertyFactory.CreateProperty(RaygunResponseMessagePropertyName, httpResponseMessage, true)); }
private static void SetHeaders(RaygunRequestMessage message, HttpRequestMessage request, Func <string, bool> ignored) { message.Headers = new Dictionary <string, string>(); foreach (var header in request.Headers.Where(h => !ignored(h.Key))) { message.Headers[header.Key] = string.Join(",", header.Value); } try { if (request.Content.Headers.ContentLength.HasValue && request.Content.Headers.ContentLength.Value > 0) { foreach (var header in request.Content.Headers) { message.Headers[header.Key] = string.Join(",", header.Value); } } } catch (Exception ex) { System.Diagnostics.Trace.WriteLine("Error retrieving Headers: {0}", ex.Message); } }
public void HttpMethodTest() { var message = new RaygunRequestMessage(_defaultRequest, null); Assert.That(message.HttpMethod, Is.EqualTo("GET")); }
public void UrlTest() { var message = new RaygunRequestMessage(_defaultRequest, null); Assert.That(message.Url, Is.EqualTo("/")); }