8,327
社区成员
发帖
与我相关
我的任务
分享
DWORD CIISExtendExtension::HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pecb)
{
DebgPrint("Begin HttpExtensionProc!\n");
bExit = FALSE;
DWORD dwLen = 0;
BOOL retn = FALSE;
DWORD dwPostSize = 0;
DWORD dwThreadId = 0;
Thread_Param *param;
char *postDataBuffer = NULL;
HSE_EXEC_URL_INFO ExecUrlInfo = {0};
HSE_EXEC_URL_ENTITY_INFO *pEntity = NULL;
//获取URL
pecb->GetServerVariable(pecb->ConnID,"URL",0,&dwLen);
Url = new char[dwLen+1];
if (Url == NULL)
{
DebgPrint("Alloc Url buffer error!\n");
return HSE_STATUS_ERROR;
}
pecb->GetServerVariable(pecb->ConnID,"URL",Url,&dwLen);
DebgPrint(Url);
//首次Client连接过来,记录Client的IP和PORT
//通过特定URL数据进行比对确认Client
if (!stricmp(Url,"/index.html") && !stricmp(pecb->lpszMethod,"POST"))
{
//**************************************************************************************//
//这个指针没释放
param = new Thread_Param;
param->sClient = this->sClient;
param->pecb = pecb;
//创建线程,线程句柄没关闭
hTread = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)FowardDataToClient,param,0,&dwThreadId);
if (hTread == NULL)
{
DebgPrint("Create thread error!\n");
return FALSE;
}
DebgPrint("Create thread success!\n");
//**************************************************************************************//
while (TRUE)
{
//获取传送的POST数据
if (pecb->cbTotalBytes > 0)
{
postDataBuffer = (char *)LocalAlloc(LPTR,pecb->cbTotalBytes);
if(postDataBuffer == NULL)
{
DebgPrint("LocalAlloc error!\n");
return HSE_STATUS_ERROR;
}
memcpy(postDataBuffer,pecb->lpbData,pecb->cbAvailable);
if (pecb->cbTotalBytes-pecb->cbAvailable > 0)
{
//读取剩余的数据
pecb->ReadClient(pecb->ConnID,(LPVOID)(postDataBuffer+pecb->cbAvailable),&dwPostSize);
DebgPrint(postDataBuffer);
}
}
Sleep(100);
DebgPrint(postDataBuffer);
//将接收的数据转发给3389服务端
if(send(sClient,postDataBuffer,pecb->cbTotalBytes,0) == SOCKET_ERROR)
{
int erroCode = WSAGetLastError();
DebgPrint("Send post data error!\n");
LocalFree(postDataBuffer);
return HSE_STATUS_ERROR;
}
ZeroMemory(postDataBuffer,pecb->cbTotalBytes);
}
LocalFree(postDataBuffer);
delete Url;
return HSE_STATUS_SUCCESS_AND_KEEP_CONN;
}
//如果不是客户端的数据,就正常返回请求的网页
else
{
ExecUrlInfo.dwExecUrlFlags = HSE_EXEC_URL_IGNORE_CURRENT_INTERCEPTOR;
retn = pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_IO_COMPLETION,HseIoCompletionProc, NULL, (LPDWORD)pEntity);
if (!retn)
{
DebgPrint("HSE_REQ_IO_COMPLETION support error!\n");
delete Url;
return HSE_STATUS_ERROR;
}
retn = pecb->ServerSupportFunction(pecb->ConnID, HSE_REQ_EXEC_URL, &ExecUrlInfo, NULL, NULL);
if (!retn)
{
DebgPrint("HSE_REQ_EXEC_URL support error!\n");
delete Url;
return HSE_STATUS_ERROR;
}
delete Url;
return HSE_STATUS_PENDING;
}
//处理结束 并保持连接
return HSE_STATUS_SUCCESS_AND_KEEP_CONN;
}