📄 webserverpage.cpp
字号:
CHttpCGI cgi;
settings.m_pCGI = &cgi;
#endif
//and start it up
AddMsg(_T("MiniCA Web server is starting...\n"), FALSE);
CMiniCaHttpServer theWebServer;
pTheWebServer = &theWebServer;
if (!theWebServer.Start(&settings))
{
AddMsg(_T("Failed to start up the web server\n"), FALSE);
return FALSE;
}
//Display some additional info when the web servering is starting
CString strMsg;
strMsg.Format(_T("Listening for incoming connections on port %d\n"), settings.m_nPort);
AddMsg(strMsg, FALSE);
if (settings.m_bDNSLookup)
AddMsg(_T("Reverse DNS lookups will be performed on client requests\n"), FALSE);
if (settings.m_bBind)
{
strMsg.Format(_T("Binding to local address: %s\n"), settings.m_sBindAddress);
AddMsg(strMsg, FALSE);
}
strMsg.Format(_T("Client idle timeout: %d ms\n"), settings.m_dwIdleClientTimeout);
AddMsg(strMsg, FALSE);
strMsg.Format(_T("Client write timeout: %d ms\n"), settings.m_dwWritableTimeout);
AddMsg(strMsg, FALSE);
strMsg.Format(_T("Configured Server Name: %s\n"), settings.m_sServerName);
AddMsg(strMsg, FALSE);
strMsg.Format(_T("Thread pool size: %d\n"), settings.m_nThreadPoolSize);
AddMsg(strMsg, FALSE);
if (settings.m_bEnableThreadLifetime)
{
strMsg.Format(_T("Threads in the thread pool will be recycled every %d minute(s)\n"), settings.m_dwThreadLifetime);
AddMsg(strMsg, FALSE);
}
if (settings.m_bUseIOCPQueue)
{
AddMsg(_T("Using IOCP Thread pool queue\n"), FALSE);
}
else
AddMsg(_T("Using Directed Thread pool queue\n"), FALSE);
if (settings.m_bKeepAlives)
AddMsg(_T("Using Keep Alives\n"), FALSE);
if (settings.m_bAutoExpire)
AddMsg(_T("Reponses will be marked with an immediate \"Expires\" header\n"), FALSE);
if (settings.m_bAllowDeleteRequest)
AddMsg(_T("HTTP DELETE verb will be allowed\n"), FALSE);
else
AddMsg(_T("HTTP DELETE verb will not be allowed\n"), FALSE);
#ifndef W3MFC_NO_CGI_SUPPORT
{
strMsg.Format(_T("CGI Response Buffer size: %d\n"), settings.m_dwCGIResponseBufferSize);
AddMsg(strMsg, FALSE);
}
#else
{
strMsg.Format(_T("CGI support is disabled in this configuration\n"), FALSE);
AddMsg(strMsg);
}
#endif
#ifndef W3MFC_NO_ISAPI_SUPPORT
AddMsg(_T("ISAPI support is provided in this configuration\n"), FALSE);
if (settings.m_bCacheISAPI)
AddMsg(_T("ISAPI dlls will be cached in memory\n"), FALSE);
else
AddMsg(_T("ISAPI dlls will not be cached in memory\n"), FALSE);
#else
AddMsg(_T("ISAPI support is disabled in this configuration\n"), FALSE);
#endif
if (settings.m_bAllowAnonymous)
AddMsg(_T("Anonymous Connections allowed\n"), FALSE);
else
AddMsg(_T("Anonymous Connections are not allowed\n"), FALSE);
if (settings.m_bAllowBasicAuthentication)
AddMsg(_T("Basic Authentication allowed\n"), FALSE);
if (settings.m_bAllowNTLMAuthentication)
AddMsg(_T("NTLM Authentication allowed\n"), FALSE);
if (settings.m_bPerformPassthroughAuthentication)
AddMsg(_T("Passthrough Authentication will be allowed\n"), FALSE);
else
AddMsg(_T("Passthrough Authentication is not allowed\n"), FALSE);
#ifdef W3MFC_SSL_SUPPORT
if (settings.m_SSLProtocol != CHttpServerSettings::SSL_NONE)
{
switch (settings.m_SSLProtocol)
{
case CHttpServerSettings::SSL_V2:
{
AddMsg(_T("Server will use SSL v2 protocol\n"), FALSE);
break;
}
case CHttpServerSettings::SSL_V3:
{
AddMsg(_T("Server will use SSL v3 protocol\n"), FALSE);
break;
}
case CHttpServerSettings::SSL_V2_OR_V3:
{
AddMsg(_T("Server will use SSL v3 protocol (downgrading to V2 if necessary)\n"), FALSE);
break;
}
case CHttpServerSettings::TLS_V1:
{
AddMsg(_T("Server will use TLS v1 protocol\n"), FALSE);
break;
}
default:
{
break;
}
}
strMsg.Format(_T("Server certificate is %s\n"), settings.m_sServerCertificateFile);
AddMsg(strMsg, FALSE);
if (!settings.m_sPrivateKeyFile.IsEmpty())
{
strMsg.Format(_T("Private key is %s\n"), settings.m_sPrivateKeyFile);
AddMsg(strMsg, FALSE);
}
if (!settings.m_sSSLRandomnessFile.IsEmpty())
{
strMsg.Format(_T("OpenSSL Randomness file is %s\n"), settings.m_sSSLRandomnessFile);
AddMsg(strMsg, FALSE);
}
strMsg.Format(_T("SSL Negotiation timeout will be %d milliseconds\n"), settings.m_dwSSLNegotiationTimeout);
AddMsg(strMsg, FALSE);
if (settings.m_bReuseSessions)
{
AddMsg(_T("SSL Sessions can be reused\n"), FALSE);
strMsg.Format(_T("SSL Session timeout will be %d seconds\n"), settings.m_dwSSLSessionTimeout);
AddMsg(strMsg, FALSE);
}
else
AddMsg(_T("SSL Sessions can not be reused\n"), FALSE);
}
#endif
//Check that everything in the thread pool also started up ok
if (!theWebServer.GetThreadPool().WaitForThreadsInitInstance())
return FALSE;
//Register the console handler to allow the program to be gracefully terminated
//Wait until the server finishes
m_WebTree.SetNodeText( m_hWebRoot, _T(MiniCT_1003)); //MiniCT_1003
m_WebTree.SetNodeColor(m_hWebRoot,RGB(0,128,0));
m_WebTree.SetNodeColor(m_hWebClient,RGB(0,128,0));
m_WebTree.SetNodeColor(m_hWebServer,RGB(0,128,0),TRUE);
GetDlgItem(IDC_BRESERT)->EnableWindow(TRUE);
GetDlgItem(IDC_BSTOP)->EnableWindow(TRUE);
GetDlgItem(IDC_SERVER)->EnableWindow(FALSE);
theWebServer.Wait();
AddMsg(_T("Web server has shut down...\n"), FALSE);
return TRUE;
}
BOOL CWebServerPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// g_pWebList = &m_WebList;
CString strMsg;
// TODO: Add extra initialization here
//Initialise Sockets
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,0), &wsaData) != 0)
{
strMsg.Format(_T("Failed to initialise Winsock, GetLastError:%d\n"), ::GetLastError());
AddMsg(strMsg);
return FALSE;
}
//Confirm that the WinSock DLL supports 2.0
if (LOBYTE(wsaData.wVersion) != 2)
{
strMsg.Format(_T("Failed to initialize a compatible Winsock 2 TCP/IP stack, GetLastError:%d\n"), ::GetLastError());
AddMsg(strMsg);
return FALSE;
}
m_WebTree
.SetTextFont( 9, FALSE, FALSE, "Arial Unicode MS" )
.SetDefaultTextColor( RGB(0,64,255));
m_hWebRoot = m_WebTree.InsertChild( HTOPNODE, _T(MiniCT_1000)); //MiniCT_1000
m_WebTree.SetNodeColor(m_hWebRoot,RGB(255,0,0));
m_hWebClient = m_WebTree.InsertChild( m_hWebRoot, _T(MiniCT_1001)); //MiniCT_1001
m_WebTree.SetNodeColor(m_hWebClient,RGB(255,0,0));
m_hWebServer = m_WebTree.InsertChild( m_hWebRoot, _T(MiniCT_1002)); //MiniCT_1002
m_WebTree.SetNodeColor(m_hWebServer,RGB(255,0,0));
CString strIniPathName = ((CMiniCaApp *)AfxGetApp())->GetAppPath() + "\\WebServer.ini";
CFile file;
if(!file.Open(strIniPathName,CFile::modeRead))
{
/*得到配置*/
HRSRC hRsrc = 0;
hRsrc = FindResource(NULL,MAKEINTRESOURCE(IDR_WEBSERVER_INI),"INI");
DWORD lenCert = SizeofResource(NULL, hRsrc);
HGLOBAL hgCert=LoadResource(NULL,hRsrc);
LPSTR lpCert=(LPSTR)LockResource(hgCert);
file.Open(strIniPathName,CFile::modeCreate|CFile::modeWrite); //存文件
{
file.Write(lpCert,lenCert);
}
}
file.Close();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION: OCX Property Pages should return FALSE
}
void CWebServerPage::AddMsg(CString strMsg, BOOL bClient, BOOL bSucceed)
{
if(!bClient && !bSucceed) //错误信息
{
HTREENODE hTemp = m_pWebTree->InsertChild(m_hWebServer, strMsg);
m_pWebTree->SetNodeColor(hTemp,RGB(255,0,0));
}
else
{
if(bClient)
m_pWebTree->InsertChild(m_hWebClient, strMsg);
else
m_pWebTree->InsertChild(m_hWebServer, strMsg);
}
}
void CWebServerPage::OnBstop()
{
// TODO: Add your control notification handler code here
StopServer();
}
void CWebServerPage::OnClose()
{
// TODO: Add your message handler code here and/or call default
// OnBstop();
// Sleep(2000);
//Close down sockets
// CPropertyPage::OnClose();
}
void CWebServerPage::StopServer()
{
if(WebServiceThread)
{
pTheWebServer->Stop();
m_WebTree.SetNodeText( m_hWebRoot, _T(MiniCT_1000)); //MiniCT_1000
m_WebTree.SetNodeColor(m_hWebRoot,RGB(255,0,0));
m_WebTree.SetNodeColor(m_hWebClient,RGB(255,0,0));
m_WebTree.SetNodeColor(m_hWebServer,RGB(255,0,0),TRUE);
WebServiceThread = NULL;
GetDlgItem(IDC_BRESERT)->EnableWindow(FALSE);
GetDlgItem(IDC_BSTOP)->EnableWindow(FALSE);
GetDlgItem(IDC_SERVER)->EnableWindow(TRUE);
}
}
BOOL CWebServerPage::IsWebRun()
{
return (WebServiceThread == NULL ? FALSE : TRUE);
}
void CWebServerPage::OnDestroy()
{
CPropertyPage::OnDestroy();
// TODO: Add your message handler code here
/*#ifdef W3MFC_SSL_SUPPORT
//Clean up the SSL critical sections
if (m_pOpenSSLCritSections)
{
delete [] m_pOpenSSLCritSections;
m_pOpenSSLCritSections = NULL;
}
#endif*/
WSACleanup();
}
void CWebServerPage::OnBresert() //重启服务
{
// TODO: Add your control notification handler code here
StopServer();
OnServer();
}
void CWebServerPage::OnBclear() //信息清除
{
// TODO: Add your control notification handler code here
if(m_hWebClient)
m_WebTree.DeleteNode(m_hWebClient);
if(m_hWebServer)
m_WebTree.DeleteNode(m_hWebServer);
m_hWebClient = m_WebTree.InsertChild( m_hWebRoot, _T(MiniCT_1001));
m_hWebServer = m_WebTree.InsertChild( m_hWebRoot, _T(MiniCT_1002));
m_WebTree.SetNodeColor(m_hWebServer,RGB(255,0,0));
}
void CWebServerPage::TranslateCT() //繙譯諸如樹型控件,列錶控件等內容
{
SetDlgItemText(IDC_BCLEAR, MiniCT_11901);
SetDlgItemText(IDC_BSTOP, MiniCT_11902);
SetDlgItemText(IDC_BRESERT, MiniCT_11903);
SetDlgItemText(IDC_SERVER, MiniCT_11904);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -