fiddlercore 類庫應用- 檢查客戶端呼叫的服務介面內容.
fiddlercore是.NET類庫,你可以加入到.NET框架和單框架的應用。 也可以應用到Managed C++公共執行時語言程式中.本次是在 Managed C++ 程式中應用的。 fiddlercore可以捕獲和修改HTTP和HTTPS流量就像Fiddler一樣,但沒有Fiddler的UI。
fiddlercore主要特點
HTTP和HTTPS流量捕獲和修改。
強大的內容過濾和修改的物件模型。
儲存和過載網路流量。
我主要的目的是抓取到某個應用程式內部所有的服務請求. 以檢測各個服務狀態,各個服務介面請求的狀態, 請求介面的url格式, 請求包體,返回包體等內容,這樣輔助部署實施人員能夠排查出應用程式問題,並通過服務的狀態,引數解決掉問題. 比如,可能某個服務關閉當掉,客戶端請求就是返回500以上服務內部錯誤的code值, 400 為服務拒絕客戶端請求,客戶端請求引數不正確等錯誤code值, 200 為請求正確的code。
下面是 應用程式碼. 初始化.
System::String^ m_CliIp = gcnew System::String("NoSAZ");
Fiddler::FiddlerApplication::SetAppDisplayName("FiddlerCoreDemoApp");
EventReceiver^ pR = gcnew EventReceiver;
pR->pTestDlg= this;
Fiddler::FiddlerApplication::OnNotification += gcnew EventHandler<NotificationEventArgs^>(pR,&EventReceiver::OnNotification);
Fiddler::FiddlerApplication::Log->OnLogString += gcnew EventHandler<LogEventArgs^>(pR,&EventReceiver::Log_OnLogString);
Fiddler::FiddlerApplication::BeforeRequest += gcnew SessionStateHandler(pR,&EventReceiver::BeforeRequest);
Fiddler::FiddlerApplication::BeforeResponse += gcnew SessionStateHandler(pR,&EventReceiver::BeforeResponse);
Fiddler::FiddlerApplication::AfterSessionComplete += gcnew SessionStateHandler(pR,&EventReceiver::AfterSessionComplete);
Fiddler::CONFIG::IgnoreServerCertErrors = false;
int iPort = 8877;
Fiddler::FiddlerApplication::Startup(iPort, Fiddler::FiddlerCoreStartupFlags::Default);
Fiddler::FiddlerApplication::Log->LogFormat("Created endpoint listening on port {0}", iPort);
Fiddler::FiddlerApplication::Log->LogFormat("Starting with settings: [{0}]", Fiddler::FiddlerCoreStartupFlags::Default);
Fiddler::FiddlerApplication::Log->LogFormat("Gateway: {0}", CONFIG::UpstreamGateway.ToString());
System::String^ sSecureEndpointHostname = gcnew System::String("localhost");
int iSecureEndpointPort = 7777;
GlobalObjects::oSecureEndpoint
= Fiddler::FiddlerApplication::CreateProxyEndpoint(iSecureEndpointPort, true, "localhost");
if (GlobalObjects::oSecureEndpoint)
{
Fiddler::FiddlerApplication::Log->LogFormat("開始監控 HTTP 過程 .");
}
// 抓取過程
public ref struct ArgsReceiver
{
String^ Argsstrurl;
String^ ArgsMethod;
int^ Argsosid;
SessionStates^ Argsss;
};
public ref struct EventReceiver
{
public:
class CTest001Dlg* pTestDlg;
void OnNotification(System::Object^ sender, Fiddler::NotificationEventArgs^ e)
{
Console::WriteLine("OnNotification");
}
void Log_OnLogString(System::Object^ sender, Fiddler::LogEventArgs ^e)
{
pTestDlg->AddMessage(e->LogString);
}
void BeforeRequest(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
{
}
void BeforeResponse(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
{
}
void AfterSessionComplete(Fiddler::Session^ os)//, Fiddler::Session os(Fiddler::Session os)
{
String^ strClientName = os->LocalProcess;
int index = strClientName->LastIndexOf("ezjcj3");
if(index > -1)//判斷是ezjcj3發出的請求
{
// 將資料傳送道list列表中
pTestDlg->AddReqToList(os);
}
}
};
顯示部分
void CTest001Dlg::AddReqToList(Fiddler::Session^ os)
{
try
{
//list列表中顯示
int icount = m_listurl.GetItemCount();
int ^ osid = os->id; // 請求ID
System::String^ sid = osid->ToString("G");
char* ch1 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(sid);
int nRow = m_listurl.InsertItem(icount, CString(ch1));//插入行
String^ strMet = os->oRequest->headers->HTTPMethod;
char* ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strMet);
m_listurl.SetItemText(nRow, 1, CString(ch2));//設定資料
String^ strurl = os->fullUrl;// 整個請求路徑
ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strurl);
m_listurl.SetItemText(nRow, 2, CString(ch2));//設定資料
String^ strSt = os->oResponse->headers->HTTPResponseStatus;// 最終狀態
ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strSt);
m_listurl.SetItemText(nRow, 3, CString(ch2));//設定資料
String^ strtype = os->oResponse->MIMEType;// 最終狀態
ch2 = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(strtype);
m_listurl.SetItemText(nRow,4, CString(ch2));//設定資料
System::String^ strPath = gcnew String(m_strExePath);
String^ sFilename1 = System::String::Format("{0}{1}{2}{3}",strPath,"fiddler_log\\",sid,".txt");
os->SaveResponse(sFilename1,FALSE); // 儲存返回內容
}
catch(...)
{
}
}