int DivisionString(CStringA strSeparate, CStringA strSourceString, CStringA * pStringArray, int nArrayCount) { if( strSeparate.GetLength() == 0 || strSourceString.GetLength() == 0|| pStringArray == NULL || nArrayCount <=1 ) { return 0; } int nCount = 0; while(true) { int nEnd = strSourceString.Find(strSeparate,0); if ( nEnd >= 0 ) { pStringArray[nCount] = strSourceString.Left(nEnd); nCount++; strSourceString = strSourceString.Right(strSourceString.GetLength() - nEnd-strSeparate.GetLength()); } else { pStringArray[nCount] = strSourceString; nCount++; strSourceString = ""; break; } if ( nCount >= nArrayCount) { break; } } return nCount; }
void CWebSocket::OnRequestReceived(char* pHeader, DWORD dwHeaderLen, char* pData, DWORD dwDataLen, in_addr inad) { CStringA sHeader(pHeader, dwHeaderLen); CStringA sData(pData, dwDataLen); CStringA sURL; bool filereq=false; if(sHeader.Left(3) == "GET") sURL = sHeader.Trim(); else if(sHeader.Left(4) == "POST") sURL = "?" + sData.Trim(); // '?' to imitate GET syntax for ParseURL if(sURL.Find(" ") > -1) sURL = sURL.Mid(sURL.Find(" ")+1, sURL.GetLength()); if(sURL.Find(" ") > -1) sURL = sURL.Left(sURL.Find(" ")); if (sURL.GetLength()>4 && // min length (for valid extentions) (sURL.Right(4).MakeLower()==".gif" || sURL.Right(4).MakeLower()==".jpg" || sURL.Right(4).MakeLower()==".png" || sURL.Right(4).MakeLower()==".ico" ||sURL.Right(4).MakeLower()==".css" ||sURL.Right(3).MakeLower()==".js" || sURL.Right(4).MakeLower()==".bmp" || sURL.Right(5).MakeLower()==".jpeg" ) && sURL.Find("..")==-1 // dont allow leaving the emule-webserver-folder for accessing files ) filereq=true; ThreadData Data; Data.sURL = sURL; Data.pThis = m_pParent; Data.inadr = inad; Data.pSocket = this; if (!filereq) m_pParent->ProcessURL(Data); else m_pParent->ProcessFileReq(Data); Disconnect(); }
void CWebSocket::OnRequestReceived(char *pHeader, DWORD dwHeaderLen, char *pData, DWORD dwDataLen) { EMULE_TRY CStringA sHeader(pHeader, dwHeaderLen); CStringA sURL; int iIdx; bool bFileReq = false; if (sHeader.Left(3) == "GET") { sURL = sHeader.TrimRight(); } else if (sHeader.Left(4) == "POST") { CStringA sData(pData, dwDataLen); sURL = '?'; sURL += sData.Trim(); // '?' to imitate GET syntax for ParseURL } iIdx = sURL.Find(' '); if (iIdx >= 0) sURL = sURL.Mid(iIdx + 1); iIdx = sURL.Find(' '); if (iIdx >= 0) sURL = sURL.Left(iIdx); if (sURL.GetLength() > 4) { CStringA strExt4 = sURL.Right(4).MakeLower(); if (( (strExt4 == ".gif") || (strExt4 == ".jpg") || (strExt4 == ".png") || (strExt4 == ".ico") || (strExt4 == ".css") || (sURL.Right(3).MakeLower() == ".js") || (strExt4 == ".bmp") || (sURL.Right(5).MakeLower() == ".jpeg") || (strExt4 == ".xml") || (strExt4 == ".txt") ) && sURL.Find("..") < 0 ) // don't allow leaving the emule-webserver-folder for accessing files { bFileReq = true; } } // HTTP header AcceptEncoding CStringA strAcceptEncoding; iIdx = sHeader.Find("Accept-Encoding: "); if (iIdx >= 0) { int iIdx2 = sHeader.Find("\r\n", iIdx += 17); strAcceptEncoding = sHeader.Mid(iIdx, iIdx2 - iIdx); } // End AcceptEncoding // HTTP header IfModifiedSince CStringA strIfModifiedSince; iIdx = sHeader.Find("If-Modified-Since: "); if (iIdx >= 0) { int iIdx2 = sHeader.Find("\r\n", iIdx += 19); strIfModifiedSince = sHeader.Mid(iIdx, iIdx2 - iIdx); } // End IfModifiedSince ThreadData Data; Data.sURL = sURL; Data.pThis = m_pParent; Data.pSocket = this; Data.strAcceptEncoding = strAcceptEncoding; Data.strIfModifiedSince = strIfModifiedSince; if (!bFileReq) m_pParent->ProcessGeneralReq(Data); else m_pParent->ProcessFileReq(Data); Disconnect(); EMULE_CATCH2 }
BOOL LoadResources(LPCTSTR szFilename) { FILE* pFile = NULL; if ( _tfopen_s( &pFile, szFilename, _T("rb") ) == 0 ) { CStringA sID; for ( States nState = stFile ; nState != stError ; ) { CStringA sLine; CHAR* res = fgets( sLine.GetBuffer( 4096 ), 4096, pFile ); sLine.ReleaseBuffer(); if ( ! res ) { if ( nState != stFile ) _tprintf( _T("Error: Unexpected end of file\n") ); break; // End of file } sLine.Trim( ", \t\r\n" ); if ( sLine.IsEmpty() || sLine.GetAt( 0 ) == '/' || sLine.GetAt( 0 ) == '#' ) continue; // Skip empty line, comment and pragma switch ( nState ) { case stFile: if ( sLine == "STRINGTABLE" ) nState = stStringTable; else if ( sLine == "GUIDELINES DESIGNINFO" ) nState = stGuidelines; else { int nPos = sLine.Find( " DIALOG" ); // DIALOG or DIALOGEX if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" inside DIALOG\n"), sID ); return 2; } if ( g_oDialogs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" inside DIALOG\n"), sID ); return 2; } g_oDialogs.SetAt( sID, nID ); } nPos = sLine.Find( " ICON " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of ICON\n"), sID ); return 2; } if ( g_oIcons.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of ICON\n"), sID ); return 2; } g_oIcons.SetAt( sID, nID ); } nPos = sLine.Find( " HTML " ); if ( nPos == -1 ) nPos = sLine.Find( " GZIP " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of HTML\n"), sID ); return 2; } if ( g_oHtmls.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of HTML\n"), sID ); return 2; } g_oHtmls.SetAt( sID, nID ); } nPos = sLine.Find( " BITMAP " ); if ( nPos == -1 ) nPos = sLine.Find( " JPEG " ); if ( nPos == -1 ) nPos = sLine.Find( " PNG " ); if ( nPos != -1 ) { CStringA sID = sLine.SpanExcluding( " " ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown ID \"%hs\" of BITMAP\n"), sID ); return 2; } if ( g_oBitmaps.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate ID \"%hs\" of BITMAP\n"), sID ); return 2; } g_oBitmaps.SetAt( sID, nID ); } } break; case stGuidelines: if ( sLine == "BEGIN" ) nState = stGuidelinesContent; else { _tprintf( _T("Error: BEGIN not found after GUIDELINES DESIGNINFO\n") ); return 2; } break; case stGuidelinesContent: if ( sLine == "END" ) nState = stFile; else if ( sLine.Right( 6 ) == "DIALOG" ) { nState = stGuidelinesDialog; CStringA sID = sLine.SpanExcluding( "," ); UINT nID; if ( ! g_oIDs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Unknown dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } if ( g_oGuidelines.Lookup( sID, nID ) ) { _tprintf( _T("Error: Duplicate dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } if ( ! g_oDialogs.Lookup( sID, nID ) ) { _tprintf( _T("Error: Orphan dialog ID \"%hs\" inside GUIDELINES\n"), sID ); return 2; } g_oGuidelines.SetAt( sID, nID ); } else { _tprintf( _T("Error: Unknown line \"%hs\" inside GUIDELINES\n"), sLine ); return 2; } break; case stGuidelinesDialog: if ( sLine == "END" ) nState = stGuidelinesContent; break; case stStringTable: if ( sLine == "BEGIN" ) nState = stContent; else { _tprintf( _T("Error: BEGIN not found after STRINGTABLE\n") ); return 2; } break; case stContent: if ( sLine == "END" ) nState = stFile; else { int nPos = sLine.FindOneOf( ", \t" ); if ( nPos != -1 ) { if ( ProcessString( sLine.Left( nPos ), sLine.Mid( nPos + 1 ).TrimLeft( ", \t" ) ) ) nState = stContent; else nState = stError; } else { sID = sLine; nState = stString; } } break; case stString: if ( ProcessString( sID, sLine ) ) nState = stContent; else nState = stError; sID.Empty(); break; } } fclose( pFile ); } return TRUE; }