void CMMSocket::OnReceive(int nErrorCode){ static char GlobalReadBuffer[10240]; if(nErrorCode != 0){ return; } const UINT SIZE_PRESERVE = 0x1000; uint32 readMax = sizeof(GlobalReadBuffer); uint32 dwSize = Receive(GlobalReadBuffer, readMax); if(dwSize == SOCKET_ERROR || dwSize == 0){ return; } if (m_dwBufSize < dwSize + m_dwRecv) { // reallocate char* pNewBuf = new char[m_dwBufSize = dwSize + m_dwRecv + SIZE_PRESERVE]; if (!pNewBuf) { shutdown(m_hSocket, SD_BOTH); Close(); return; } if (m_pBuf) { CopyMemory(pNewBuf, m_pBuf, m_dwRecv); delete[] m_pBuf; } m_pBuf = pNewBuf; } CopyMemory(m_pBuf + m_dwRecv, GlobalReadBuffer, dwSize); m_dwRecv += dwSize; // check if we have all that we want if (!m_dwHttpHeaderLen) { // try to find it bool bPrevEndl = false; for (DWORD dwPos = 0; dwPos < m_dwRecv; dwPos++) if ('\n' == m_pBuf[dwPos]) if (bPrevEndl) { // We just found the end of the http header // Now write the message's position into two first DWORDs of the buffer m_dwHttpHeaderLen = dwPos + 1; for (dwPos = 0; dwPos < m_dwHttpHeaderLen; ) { char* pPtr = (char*)memchr(m_pBuf + dwPos, '\n', m_dwHttpHeaderLen - dwPos); if (!pPtr) break; DWORD dwNextPos = pPtr - m_pBuf; // check this header char szMatch[] = "content-length"; if (!strnicmp(m_pBuf + dwPos, szMatch, sizeof(szMatch) - 1)) { dwPos += sizeof(szMatch) - 1; pPtr = (char*)memchr(m_pBuf + dwPos, ':', m_dwHttpHeaderLen - dwPos); if (pPtr) m_dwHttpContentLen = atol((pPtr) + 1); break; } dwPos = dwNextPos + 1; } break; } else { bPrevEndl = true; } else if ('\r' != m_pBuf[dwPos]) bPrevEndl = false; } if (m_dwHttpHeaderLen && !m_dwHttpContentLen) m_dwHttpContentLen = m_dwRecv - m_dwHttpHeaderLen; if (m_dwHttpHeaderLen && m_dwHttpContentLen < m_dwRecv && (!m_dwHttpContentLen || (m_dwHttpHeaderLen + m_dwHttpContentLen <= m_dwRecv))) { OnRequestReceived(m_pBuf, m_dwHttpHeaderLen, m_pBuf + m_dwHttpHeaderLen, m_dwHttpContentLen); if (m_dwRecv > m_dwHttpHeaderLen + m_dwHttpContentLen) { // move our data m_dwRecv -= m_dwHttpHeaderLen + m_dwHttpContentLen; MoveMemory(m_pBuf, m_pBuf + m_dwHttpHeaderLen + m_dwHttpContentLen, m_dwRecv); } else m_dwRecv = 0; m_dwHttpHeaderLen = 0; m_dwHttpContentLen = 0; } }
void CWebSocket::OnReceived(void* pData, DWORD dwSize) { EMULE_TRY const UINT SIZE_PRESERVE = 0x1000; if (m_dwBufSize < dwSize + m_dwRecv) { // Reallocate char *pNewBuf = new char[m_dwBufSize = dwSize + m_dwRecv + SIZE_PRESERVE]; if (pNewBuf == NULL) { m_bValid = false; // Internal problem return; } if (m_pBuf != NULL) { memcpy2(pNewBuf, m_pBuf, m_dwRecv); delete[] m_pBuf; } m_pBuf = pNewBuf; } memcpy2(m_pBuf + m_dwRecv, pData, dwSize); m_dwRecv += dwSize; // Check if we have all that we want if (m_dwHttpHeaderLen == 0) { // Try to find it bool bPrevEndl = false; for (DWORD dwPos = 0; dwPos < m_dwRecv; dwPos++) { if ('\n' == m_pBuf[dwPos]) { if (bPrevEndl) { // We just found the end of the http header // Now write the message's position into two first DWORDs of the buffer m_dwHttpHeaderLen = dwPos + 1; // Try to find now the 'Content-Length' header for (dwPos = 0; dwPos < m_dwHttpHeaderLen;) { char *pPtr = reinterpret_cast<char*>(memchr(m_pBuf + dwPos, '\n', m_dwHttpHeaderLen - dwPos)); if (pPtr == NULL) break; DWORD dwNextPos = pPtr - m_pBuf; // Check this header static const char acMatch[] = "content-length"; if (strnicmp(m_pBuf + dwPos, acMatch, sizeof(acMatch) - 1) == 0) { dwPos += sizeof(acMatch) - 1; pPtr = reinterpret_cast<char *>(memchr(m_pBuf + dwPos, ':', m_dwHttpHeaderLen - dwPos)); if (pPtr != NULL) m_dwHttpContentLen = atol(pPtr + 1); break; } dwPos = dwNextPos + 1; } break; } else bPrevEndl = true; } else if ('\r' != m_pBuf[dwPos]) bPrevEndl = false; } } if ((m_dwHttpHeaderLen != 0) && !m_bCanRecv && (m_dwHttpContentLen == 0)) m_dwHttpContentLen = m_dwRecv - m_dwHttpHeaderLen; // of course if ((m_dwHttpHeaderLen != 0) && (m_dwHttpContentLen < m_dwRecv) && ((m_dwHttpContentLen == 0) || (m_dwHttpHeaderLen + m_dwHttpContentLen <= m_dwRecv))) { OnRequestReceived(m_pBuf, m_dwHttpHeaderLen, m_pBuf + m_dwHttpHeaderLen, m_dwHttpContentLen); if (m_bCanRecv && (m_dwRecv > m_dwHttpHeaderLen + m_dwHttpContentLen)) { // Move our data m_dwRecv -= m_dwHttpHeaderLen + m_dwHttpContentLen; MoveMemory(m_pBuf, m_pBuf + m_dwHttpHeaderLen + m_dwHttpContentLen, m_dwRecv); } else m_dwRecv = 0; m_dwHttpHeaderLen = 0; m_dwHttpContentLen = 0; } EMULE_CATCH2 }
void CWebSocket::OnReceived(void* pData, DWORD dwSize, in_addr inad) { const UINT SIZE_PRESERVE = 0x1000; if (m_dwBufSize < dwSize + m_dwRecv) { // reallocate char* pNewBuf = new char[m_dwBufSize = dwSize + m_dwRecv + SIZE_PRESERVE]; if (!pNewBuf) { m_bValid = false; // internal problem return; } if (m_pBuf) { CopyMemory(pNewBuf, m_pBuf, m_dwRecv); delete[] m_pBuf; } m_pBuf = pNewBuf; } CopyMemory(m_pBuf + m_dwRecv, pData, dwSize); m_dwRecv += dwSize; // check if we have all that we want if (!m_dwHttpHeaderLen) { // try to find it bool bPrevEndl = false; for (DWORD dwPos = 0; dwPos < m_dwRecv; dwPos++) if ('\n' == m_pBuf[dwPos]) if (bPrevEndl) { // We just found the end of the http header // Now write the message's position into two first DWORDs of the buffer m_dwHttpHeaderLen = dwPos + 1; // try to find now the 'Content-Length' header for (dwPos = 0; dwPos < m_dwHttpHeaderLen; ) { // Elandal: pPtr is actually a char*, not a void* char* pPtr = (char*)memchr(m_pBuf + dwPos, '\n', m_dwHttpHeaderLen - dwPos); if (!pPtr) break; // Elandal: And thus now the pointer substraction works as it should DWORD dwNextPos = pPtr - m_pBuf; // check this header char szMatch[] = "content-length"; if (!strnicmp(m_pBuf + dwPos, szMatch, sizeof(szMatch) - 1)) { dwPos += sizeof(szMatch) - 1; pPtr = (char*)memchr(m_pBuf + dwPos, ':', m_dwHttpHeaderLen - dwPos); if (pPtr) m_dwHttpContentLen = atol((pPtr) + 1); break; } dwPos = dwNextPos + 1; } break; } else { bPrevEndl = true; } else if ('\r' != m_pBuf[dwPos]) bPrevEndl = false; } if (m_dwHttpHeaderLen && !m_bCanRecv && !m_dwHttpContentLen) m_dwHttpContentLen = m_dwRecv - m_dwHttpHeaderLen; // of course if (m_dwHttpHeaderLen && m_dwHttpContentLen < m_dwRecv && (!m_dwHttpContentLen || (m_dwHttpHeaderLen + m_dwHttpContentLen <= m_dwRecv))) { OnRequestReceived(m_pBuf, m_dwHttpHeaderLen, m_pBuf + m_dwHttpHeaderLen, m_dwHttpContentLen, inad); if (m_bCanRecv && (m_dwRecv > m_dwHttpHeaderLen + m_dwHttpContentLen)) { // move our data m_dwRecv -= m_dwHttpHeaderLen + m_dwHttpContentLen; MoveMemory(m_pBuf, m_pBuf + m_dwHttpHeaderLen + m_dwHttpContentLen, m_dwRecv); } else m_dwRecv = 0; m_dwHttpHeaderLen = 0; m_dwHttpContentLen = 0; } }