Fiddler для запроса HTTP-запросов с соблюдением сроков
Может ли запрос HTTP быть воспроизведен с использованием Fiddler с соблюдением установленного времени сеанса?
Я попытался воспроизвести сессию с помощью Fiddler, но воспроизведение отправляет запросы на максимальной скорости, игнорируя время захвата.
Я попытался добавить это в функцию onBeforeRequest():
if (oSession.HostnameIs("example.com") && oSession.uriContains("page.html")) {
// I tried this
System.Threading.Thread.Sleep(1000);
// and this
// oSession["response-trickle-delay"] = "30";
}
но не очень хорошо работает, и я должен повторить это для каждого захваченного URI.
Мне нужно воспроизвести захваченный сеанс, но запросы должны быть отправлены с той же задержкой, что и записанные. Является ли это возможным?
2 ответа
Fiddler сам не пытается учитывать относительное время при воспроизведении запросов.
Вы можете написать скрипт или расширение, которое будет делать это, основываясь на каждом Session
объекты oTimers
данные.
Вот мое решение, оно может быть полезным для других:
static function DoTimedReplay() {
var oSessions = FiddlerApplication.UI.GetSelectedSessions();
if (oSessions.Length == 0) {
oSessions = FiddlerApplication.UI.GetAllSessions();
if (oSessions.Length == 0) {
FiddlerObject.alert("No session available.");
return;
}
}
FiddlerObject.StatusText = "Start replay";
var iStart = Environment.TickCount;
for (var x:int = 0; x < oSessions.Length; x++) {
var iDelay:Int32 = x == 0 ? 0 :
System.Math.Round(
(oSessions[x].Timers.ClientBeginRequest - oSessions[x - 1].Timers.ClientBeginRequest).TotalMilliseconds
);
replay(oSessions[x], iStart + iDelay);
}
FiddlerObject.StatusText = "Replay Done";
}
static function replay(oSession: Session, iDelay: Int32) {
if (!String.IsNullOrEmpty(oSession["X-Replayed"]))
return;
try {
var oSD = new System.Collections.Specialized.StringDictionary();
oSD.Add("X-Replayed", "True");
while (iDelay > Environment.TickCount) {
Application.DoEvents();
}
FiddlerApplication.oProxy.SendRequest(oSession.oRequest.headers, oSession.requestBodyBytes, oSD);
} catch(ex) {
var iTickCount = Environment.TickCount + 10000;
while (iTickCount > Environment.TickCount) {
Application.DoEvents();
}
}
}
ура