⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 webserverpage.cpp

📁 MiniCA V2.0版本源码。《小型CA系统V2.1含源码》发表以来
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	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 + -