RedSpace
Emekli Mod
- Katılım
- 3 Ara 2019
- Mesajlar
- 373
- Beğeniler
- 514
Uzun zamandır bunun üstünde çalışıyordum. Çoğu yazılımcı arkadaşımızın Reverse Engineering projelerinde işine yaraması umuduyla burada açık kaynak kodlu bir şekilde paylaşıyorum. Öncelikle bunun ne işe yaradığını anlatayım. HTTP proxy kullanarak, tarayıcıdan kaynaklanan bir HTTP isteğini web sunucusuna gönderilmeden önce durdurabilir ve / veya web sunucusundan gelen HTTP yanıtlarını tarayıcıya ulaşmadan ve onun tarafından oluşturulmadan hemen önce yakalayabilir veya değiştirebilir
Uyarı: References yani kütüphane Titanium.Web.Proxy.Http NuGet paketini yüklemeniz gerekir.
Proxy'yi test sınıfı başına bir kez başlatıyoruz. Hatta her test çalıştırması için bir kez bile yapabilirsiniz. TurstRootCertificate özelliğinin true olarak ayarlanması, proxy'yi kullanan kök sertifikaya yerel olarak güvenir. Sonraki satırda, bir uç nokta oluşturuyoruz ve proxy'ye 18882 numaralı bağlantı noktasını dinlemesini söylüyoruz. Elbette gerekirse değiştirebilirsiniz. Ardından proxy'yi HTTP ve HTTPS trafiği için birincil sistem proxy'si olarak ayarlıyoruz. BeforeRequest ve BeforeResponse olaylarını daha sonra açıklayacağım . Sınıf temizliğinde proxy sunucusunu durdururuz. Her testten önce, tarayıcıyı başlatır ve başlatılan proxy'yi kullanacak şekilde yapılandırırız. Biz kullanacağız _requestsHistory ve _responsesHistoryyapılan taleplere ve ilgili yanıtlara erişmek için sözlükler. Her test için yeniden başlatılmaları gerekir, bu nedenle TestCleanup yönteminde onları temizliyoruz .
Proxy BeforeRequest Event Handlers
BeforeRequest olayı için bir olay işleyicisi kaydedebiliriz ve isteklerin bilgileriyle bazı şeyler yapabiliriz. Olay işleyicilerini oluşturduktan sonra, bunları BeforeRequest veya BeforeResponse olaylarına abone olmanız gerekir . Herhangi bir işleyici olmadan vekil işe yaramaz!
Kayıt HTTP Requests Event Handler
Block Specific Requests Event Handler
Redirect Requests Event Handler
Modify Requests Event Handler
Proxy BeforeResponse Event Handlers
BeforeResponse etkinliği için bir olay işleyicisi kaydedebiliriz ve yanıt bilgileriyle ilgili bazı şeyler yapabiliriz.
Capture HTTP Responses Event Handler
Modify Responses Event Handler
HTTP Proxy in Testi
Tüm istek ve yanıtları sakladığımız yerde bahsettiğim iki kodu kullanıyoruz. İddia yöntemlerinde, bu koleksiyonları filtreleriz ve bazı koşulların doğru mu yanlış mı olduğunu kontrol ederiz. Olanaklar sınırsızdır.
Bu url adresi bir istekte bulunuyormuş gibi gösterin
Bu url adresinde asla hata kodu çıkmasına izin vermeyin
Sayfada boyutu büyük resim çıkarsa yanıt almayı kes
Uyarı: References yani kütüphane Titanium.Web.Proxy.Http NuGet paketini yüklemeniz gerekir.
Proxy'yi test sınıfı başına bir kez başlatıyoruz. Hatta her test çalıştırması için bir kez bile yapabilirsiniz. TurstRootCertificate özelliğinin true olarak ayarlanması, proxy'yi kullanan kök sertifikaya yerel olarak güvenir. Sonraki satırda, bir uç nokta oluşturuyoruz ve proxy'ye 18882 numaralı bağlantı noktasını dinlemesini söylüyoruz. Elbette gerekirse değiştirebilirsiniz. Ardından proxy'yi HTTP ve HTTPS trafiği için birincil sistem proxy'si olarak ayarlıyoruz. BeforeRequest ve BeforeResponse olaylarını daha sonra açıklayacağım . Sınıf temizliğinde proxy sunucusunu durdururuz. Her testten önce, tarayıcıyı başlatır ve başlatılan proxy'yi kullanacak şekilde yapılandırırız. Biz kullanacağız _requestsHistory ve _responsesHistoryyapılan taleplere ve ilgili yanıtlara erişmek için sözlükler. Her test için yeniden başlatılmaları gerekir, bu nedenle TestCleanup yönteminde onları temizliyoruz .
Kod:
private IWebDriver _driver;
private ProxyServer _proxyServer;
private readonly IDictionary<Guid, Proxy.Request> _requestsHistory =
new ConcurrentDictionary<Guid, Proxy.Request>();
private readonly IDictionary<Guid, Proxy.Response> _responsesHistory =
new ConcurrentDictionary<Guid, Proxy.Response>();
[OneTimeSetUp]
public void ClassInit()
{
_proxyServer = new ProxyServer
{
TrustRootCertificate = true
};
var explicitEndPoint = new ExplicitProxyEndPoint(System.Net.IPAddress.Any, 18882, true);
_proxyServer.AddEndPoint(explicitEndPoint);
_proxyServer.Start();
_proxyServer.SetAsSystemHttpProxy(explicitEndPoint);
_proxyServer.SetAsSystemHttpsProxy(explicitEndPoint);
_proxyServer.BeforeRequest += OnRequestCaptureTrafficEventHandler;
_proxyServer.BeforeResponse += OnResponseCaptureTrafficEventHandler;
}
[OneTimeTearDown]
public void ClassCleanup()
{
_proxyServer.Stop();
}
[SetUp]
public void TestInit()
{
var proxy = new OpenQA.Selenium.Proxy
{
HttpProxy = "http://localhost:18882",
SslProxy = "http://localhost:18882",
FtpProxy = "http://localhost:18882"
};
var options = new ChromeOptions
{
Proxy = proxy
};
_driver = new ChromeDriver(options);
}
[TearDown]
public void TestCleanup()
{
_driver.Dispose();
_requestsHistory.Clear();
_responsesHistory.Clear();
}
Proxy BeforeRequest Event Handlers
BeforeRequest olayı için bir olay işleyicisi kaydedebiliriz ve isteklerin bilgileriyle bazı şeyler yapabiliriz. Olay işleyicilerini oluşturduktan sonra, bunları BeforeRequest veya BeforeResponse olaylarına abone olmanız gerekir . Herhangi bir işleyici olmadan vekil işe yaramaz!
Kayıt HTTP Requests Event Handler
Kod:
private async Task OnRequestCaptureTrafficEventHandler(object sender, SessionEventArgs e) => await Task.Run(
() =>
{
if (!_requestsHistory.ContainsKey(e.HttpClient.Request.GetHashCode()) && e.HttpClient != null && e.HttpClient.Request != null)
{
_requestsHistory.Add(e.HttpClient.Request.GetHashCode(), e.HttpClient.Request);
}
});
Block Specific Requests Event Handler
Kod:
private async Task OnRequestBlockResourceEventHandler(object sender, SessionEventArgs e)
=> await Task.Run(
() =>
{
if (e.HttpClient.Request.RequestUri.ToString().Contains("analytics"))
{
string customBody = string.Empty;
e.Ok(Encoding.UTF8.GetBytes(customBody));
}
});
Redirect Requests Event Handler
Kod:
private async Task OnRequestRedirectTrafficEventHandler(object sender, SessionEventArgs e)
{
if (e.WebSession.Request.RequestUri.AbsoluteUri.Contains("logo.svg"))
{
await e.Redirect("https://automatetheplanet.com/wp-content/uploads/2016/12/homepage-img-1.svg");
}
}
Modify Requests Event Handler
Kod:
private async Task OnRequestModifyTrafficEventHandler(object sender, SessionEventArgs e)
=> await Task.Run(
() =>
{
var method = e.HttpClient.Request.Method.ToUpper();
if ((method == "POST" || method == "PUT" || method == "PATCH" || method == "GET"))
{
//Get/Set request body bytes
byte[] bodyBytes = e.GetRequestBody().Result;
e.SetRequestBody(bodyBytes);
//Get/Set request body as string
string bodyString = e.GetRequestBodyAsString().Result;
e.SetRequestBodyString(bodyString);
}
});
Proxy BeforeResponse Event Handlers
BeforeResponse etkinliği için bir olay işleyicisi kaydedebiliriz ve yanıt bilgileriyle ilgili bazı şeyler yapabiliriz.
Capture HTTP Responses Event Handler
Kod:
private async Task OnResponseCaptureTrafficEventHandler(object sender, SessionEventArgs e) => await Task.Run(
() =>
{
if (!_responsesHistory.ContainsKey(e.HttpClient.Response.GetHashCode()) && e.HttpClient != null && e.HttpClient.Response != null)
{
_responsesHistory.Add(e.HttpClient.Response.GetHashCode(), e.HttpClient.Response);
}
});
Modify Responses Event Handler
Kod:
private async Task OnResponseModifyTrafficEventHandler(object sender, SessionEventArgs e) => await Task.Run(
() =>
{
if (e.HttpClient.Request.Method == "GET" || e.HttpClient.Request.Method == "POST")
{
if (e.HttpClient.Response.StatusCode == 200)
{
if (e.HttpClient.Response.ContentType != null && e.HttpClient.Response.ContentType.Trim().ToLower().Contains("text/html"))
{
byte[] bodyBytes = e.GetResponseBody().Result;
e.SetResponseBody(bodyBytes);
string body = e.GetResponseBodyAsString().Result;
e.SetResponseBodyString(body);
}
}
}
});
HTTP Proxy in Testi
Tüm istek ve yanıtları sakladığımız yerde bahsettiğim iki kodu kullanıyoruz. İddia yöntemlerinde, bu koleksiyonları filtreleriz ve bazı koşulların doğru mu yanlış mı olduğunu kontrol ederiz. Olanaklar sınırsızdır.
Bu url adresi bir istekte bulunuyormuş gibi gösterin
Kod:
[Test]
public void FontRequestMade_When_NavigateToHomePage()
{
_driver.Navigate().GoToUrl("https://automatetheplanet.com/");
AssertRequestMade("fontawesome-webfont.woff2?v=4.7.0");
}
private void AssertRequestMade(string url)
{
bool areRequestsMade = _requestsHistory.Values.Any(r => r.RequestUri.ToString().Contains(url));
Assert.IsTrue(areRequestsMade);
}
Bu url adresinde asla hata kodu çıkmasına izin vermeyin
Kod:
[Test]
public void NoErrorCodes_When_NavigateToHomePage()
{
_driver.Navigate().GoToUrl("https://automatetheplanet.com/");
AssertNoErrorCodes();
}
private void AssertNoErrorCodes()
{
bool areThereErrorCodes = _responsesHistory.Values.Any(r => r.StatusCode > 400 && r.StatusCode < 599);
Assert.IsFalse(areThereErrorCodes);
}
Sayfada boyutu büyük resim çıkarsa yanıt almayı kes
Kod:
[Test]
public void TestNoLargeImages_When_NavigateToHomePage()
{
_driver.Navigate().GoToUrl("https://automatetheplanet.com/");
AssertNoLargeImagesRequested();
}
private void AssertNoLargeImagesRequested()
{
bool areThereLargeImages =
_requestsHistory.Values.Any(r =>
r.ContentType != null
&& r.ContentType.StartsWith("image")
&& r.ContentLength < 40000);
Assert.IsFalse(areThereLargeImages);
}