-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFiddleInterface.cs
129 lines (112 loc) · 5.24 KB
/
FiddleInterface.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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
namespace Fiddler.Importer.WARC
{
[ProfferFormat("WARC", "Web Archive https://iipc.github.io/warc-specifications/specifications/warc-format/warc-1.0/")]
public class FiddleInterface : ISessionImporter
{
public Session[] ImportSessions(string sImportFormat, Dictionary<string, object> dictOptions,
EventHandler<ProgressCallbackEventArgs> evtProgressNotifications)
{
try
{
if (sImportFormat != "WARC")
throw new ArgumentException("Invalid import format");
string filename = null, content = null;
// filename = @"X:\stuff\fiddler-warc\samples\logfile.csv";
if (dictOptions != null)
{
if (dictOptions.ContainsKey("Filename"))
filename = dictOptions["Filename"] as string;
else if (dictOptions.ContainsKey("Content"))
content = dictOptions["Content"] as string;
}
if (String.IsNullOrWhiteSpace(filename) && content == null)
{
var filter = "WARC file (*.warc)|*.warc|Text files (*.txt)|*.txt|Log files (*.log)|.log|All files (*.*)|*.*";
filter = "All files (*.*)|*.*";
filename = Fiddler.Utilities.ObtainOpenFilename("Import " + sImportFormat, filter);
}
WARCParser warc;
if (!String.IsNullOrWhiteSpace(filename))
warc = new WARCParser(new FileStream(filename, FileMode.Open));
else if (content != null)
warc = new WARCParser(new MemoryStream(Encoding.UTF8.GetBytes(content)));
else
throw new ArgumentException("Invalid options");
var sessions = new List<Session>();
using (warc)
{
WARCParser.Record prevRequest = null;
foreach (var record in warc.parse())
{
if (prevRequest == null)
{
if (record.Type == "request")
prevRequest = record;
}
else
{
WARCParser.Record request = prevRequest;
WARCParser.Record response = null;
if (record.Type == "response")
response = record;
if (response == null)
{
var session = new Session(
request.Body,
null,
SessionFlags.ImportedFromOtherTool);
session.Timers.ClientBeginRequest = request.Date;
sessions.Add(session);
}
else if (request.RecordID == response.ConcurrentTo)
{
if (!String.IsNullOrWhiteSpace(request.SentBy))
{
var session = new Session(
request.Body,
response.Body,
SessionFlags.ImportedFromOtherTool);
session.Timers.ClientBeginRequest = request.Date;
session.Timers.ServerDoneResponse = response.Date;
sessions.Add(session);
}
}
else
{
if (!String.IsNullOrWhiteSpace(request.SentBy))
{
var requestSession = new Session(
request.Body,
null,
SessionFlags.ImportedFromOtherTool);
requestSession.Timers.ClientBeginRequest = request.Date;
sessions.Add(requestSession);
}
var responseSession = new Session(
null,
response.Body,
SessionFlags.ImportedFromOtherTool);
responseSession.Timers.ServerDoneResponse = response.Date;
sessions.Add(responseSession);
}
prevRequest = null;
}
}
}
return sessions.ToArray();
}
catch (Exception ex)
{
FiddlerApplication.ReportException(ex, "Failed to import NetLog");
return null;
}
}
public void Dispose()
{
}
}
}