#include "StdAfx.h" #include "HttpServerListenerImpl.h" CHttpServerListenerImpl::CHttpServerListenerImpl(void) { } CHttpServerListenerImpl::~CHttpServerListenerImpl(void) { } EnHandleResult CHttpServerListenerImpl::OnClose(ITcpServer* pSender, CONNID dwConnID, EnSocketOperation enOperation, int iErrorCode) { return HR_OK; } // ÇëÇóÍê³É EnHttpParseResult CHttpServerListenerImpl::OnHeadersComplete(IHttpServer* pSender, CONNID dwConnID) { return HPR_OK; } EnHttpParseResult CHttpServerListenerImpl::OnBody(IHttpServer* pSender, CONNID dwConnID, const BYTE* pData, int iLength) { return HPR_OK; } EnHttpParseResult CHttpServerListenerImpl::OnMessageComplete(IHttpServer* pSender, CONNID dwConnID) { CString strFileName, strFileType; CStringA strMethodA,strPathA; LPCSTR lpMethod = pSender->GetMethod(dwConnID); LPCSTR lpPath = pSender->GetUrlField(dwConnID, HUF_PATH); strPathA.Format("%s",lpPath); strMethodA.Format("%s",lpMethod); strFileName = m_strListenPath; strFileName += strPathA; strFileType = GetFileType( strFileName ); if( strMethodA.MakeLower() == _T("get") ) { THeader header[2] = {}; if( strFileType.MakeLower() == _T(".js") ) { header[0].name = "Content-Type"; header[0].value = "text/js"; } else if( strFileType.MakeLower() == _T(".css") ) { header[0].name = "Content-Type"; header[0].value = "text/css"; } else if( strFileType.MakeLower() == _T(".html") ) { header[0].name = "Content-Type"; header[0].value = "text/html"; }else if(strFileType.MakeLower() == _T(".png")) { header[0].name = "Content-Type"; header[0].value = "application/x-plt"; } else{ header[0].name = "Content-Type"; header[0].value = "text/plain"; } CStringA strBody = GetFileContent( strFileName ); int iBodyLength = strBody.GetLength(); CStringA strContentLength; strContentLength.Format("%u", iBodyLength); header[1].name = "Content-Length"; header[1].value = strContentLength; int iHeaderCount = sizeof(header) / sizeof(THeader); pSender->SendResponse( dwConnID, HSC_OK, "HP Http Server OK", header, iHeaderCount, (const BYTE*)(LPCSTR)strBody, iBodyLength); if(!pSender->IsKeepAlive(dwConnID)) pSender->Release(dwConnID); }// end if( strMethodA.MakeLower() == _T("get") ) return HPR_OK; } EnHttpParseResult CHttpServerListenerImpl::OnParseError(IHttpServer* pSender, CONNID dwConnID, int iErrorCode, LPCSTR lpszErrorDesc) { return HPR_OK; } void CHttpServerListenerImpl::SetListenPath( CString strListenPath ) { m_strListenPath = strListenPath; } CString CHttpServerListenerImpl::GetFileType( CString &strFileName ) { int n = strFileName.ReverseFind('.'); if( -1 == n ) return _T(""); return strFileName.Right(strFileName.GetLength() - n); } CStringA CHttpServerListenerImpl::GetFileContent( CString &strFileName ) { if(!IsExist(strFileName)) { return ""; } CFile file(strFileName,CFile::modeRead|CFile::typeBinary); file.SeekToBegin(); char *buf; int len=file.GetLength(); buf=new char[len+1]; file.Read(buf,len); buf[len]=0; CStringA resStr= buf; delete buf; file.Close(); return resStr; } // ÅжÏÎļþÊÇ·ñ´æÔÚ bool CHttpServerListenerImpl::IsExist( CString strFile) { DWORD dwAttrib = GetFileAttributes(strFile); return INVALID_FILE_ATTRIBUTES != dwAttrib && 0 == (dwAttrib & FILE_ATTRIBUTE_DIRECTORY); }