forked from ravendb/ravendb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
JsonFormatterAndFieldsFilterer.cs
106 lines (97 loc) · 2.53 KB
/
JsonFormatterAndFieldsFilterer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
using System;
using System.Collections.Generic;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using Raven.Client.Connection.Profiling;
using System.Linq;
using Raven.Json.Linq;
namespace Raven.Client.MvcIntegration
{
public class JsonFormatterAndFieldsFilterer
{
private readonly HashSet<string> fieldsToFilter = new HashSet<string>();
public JsonFormatterAndFieldsFilterer(HashSet<string> fieldsToFilter)
{
this.fieldsToFilter = fieldsToFilter;
}
public ProfilingInformation Filter(ProfilingInformation information)
{
var profilingInformation = ProfilingInformation.CreateProfilingInformation(information.Id);
profilingInformation.At = information.At;
profilingInformation.Context = information.Context;
profilingInformation.DurationMilliseconds = information.DurationMilliseconds;
profilingInformation.Requests = information.Requests.Select(FilterRequest).ToList();
return profilingInformation;
}
private RequestResultArgs FilterRequest(RequestResultArgs input)
{
return new RequestResultArgs
{
DurationMilliseconds = input.DurationMilliseconds,
At = input.At,
HttpResult = input.HttpResult,
Method = input.Method,
Status = input.Status,
Url = input.Url,
PostedData = FilterData(input.PostedData),
Result = FilterData(input.Result)
};
}
private string FilterData(string result)
{
RavenJToken token;
try
{
token = RavenJToken.Parse(result);
}
catch (Exception)
{
return result;
}
Visit(token);
return token.ToString(Formatting.Indented);
}
private void Visit(RavenJToken token)
{
switch (token.Type)
{
case JTokenType.Object:
var obj = (RavenJObject) token;
Action after = () => { };
foreach (var item in obj)
{
Visit(item.Value);
if (fieldsToFilter.Contains(item.Key))
{
var itemCopy = item;
after += () => obj[itemCopy.Key] = "...private...";
}
}
after();
break;
case JTokenType.Array:
foreach (var items in ((RavenJArray)token))
{
Visit(items);
}
break;
case JTokenType.Constructor:
case JTokenType.Property:
case JTokenType.Comment:
case JTokenType.None:
case JTokenType.Integer:
case JTokenType.Float:
case JTokenType.String:
case JTokenType.Boolean:
case JTokenType.Null:
case JTokenType.Undefined:
case JTokenType.Date:
case JTokenType.Raw:
case JTokenType.Bytes:
break;
default:
throw new ArgumentOutOfRangeException(token.Type.ToString());
}
}
}
}