Skip to content

Commit 09595a6

Browse files
committed
Fix: The file size is incorrect when requested by dwonload
Fix: http send size problem
1 parent ed32e1f commit 09595a6

File tree

8 files changed

+101
-48
lines changed

8 files changed

+101
-48
lines changed

XEngine_Source/StorageModule_Session/Session_Stroage/Session_DLStroage.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -153,11 +153,16 @@ BOOL CSession_DLStroage::Session_DLStroage_Insert(LPCTSTR lpszClientAddr, LPCTST
153153
st_Locker.unlock_shared();
154154

155155
SESSION_STORAGEINFO st_Client;
156-
struct _stat st_FStat;
156+
struct __stat64 st_FStat;
157157

158158
memset(&st_Client, '\0', sizeof(SESSION_STORAGEINFO));
159-
_stat(lpszFileDir, &st_FStat);
160-
159+
int nRet = _stat64(lpszFileDir, &st_FStat);
160+
if (-1 == nRet)
161+
{
162+
Session_IsErrorOccur = TRUE;
163+
Session_dwErrorCode = ERROR_STORAGE_MODULE_SESSION_OPENFILE;
164+
return FALSE;
165+
}
161166
st_Client.ullPosStart = nPosStart;
162167
st_Client.ullPosEnd = nPostEnd;
163168
st_Client.ullCount = st_FStat.st_size;

XEngine_Source/XEngine_StorageApp/StorageApp_Download.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -182,14 +182,21 @@ BOOL XEngine_Task_HttpDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in
182182
st_HDRParam.bIsClose = FALSE;
183183
}
184184
_tcscpy(st_HDRParam.tszMimeType, _T("bin"));
185-
RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, (int)ullSize);
185+
RfcComponents_HttpServer_SendMsgEx(xhDLHttp, tszSDBuffer, &nSDLen, &st_HDRParam, NULL, ullSize);
186186
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
187187
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("下载客户端:%s,请求下载文件成功,文件名:%s,总大小:%llu,发送大小:%llu,范围:%d - %d"), lpszClientAddr, tszFileDir, ullCount, ullSize, nPosStart, nPosEnd);
188188
return TRUE;
189189
}
190190
BOOL XEngine_Task_SendDownload(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen)
191191
{
192-
XEngine_Net_SendMsg(lpszClientAddr, lpszMsgBuffer, nMsgLen, STORAGE_NETTYPE_HTTPDOWNLOAD);
193-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("下载客户端:%s,正在发送文件数据,大小:%d"), lpszClientAddr, nMsgLen);
192+
if (XEngine_Net_SendMsg(lpszClientAddr, lpszMsgBuffer, nMsgLen, STORAGE_NETTYPE_HTTPDOWNLOAD))
193+
{
194+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_DEBUG, _T("下载客户端:%s,正在发送文件数据,大小:%d"), lpszClientAddr, nMsgLen);
195+
}
196+
else
197+
{
198+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_CLOSE, STORAGE_NETTYPE_HTTPDOWNLOAD);
199+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("下载客户端:%s,正在发送文件数据,大小:%d,发送失败,无法继续,移除发送队列"), lpszClientAddr, nMsgLen);
200+
}
194201
return TRUE;
195202
}

XEngine_Source/XEngine_StorageApp/StorageApp_Hdr.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,9 @@ using namespace std;
4646
#include "../StorageModule_Config/Config_Define.h"
4747
#include "../StorageModule_Config/Config_Error.h"
4848

49+
#define STORAGE_LEAVETYPE_HEARTBEAT 1
50+
#define STORAGE_LEAVETYPE_BYSELF 2
51+
#define STORAGE_LEAVETYPE_CLOSE 3
4952

5053
#define STORAGE_NETTYPE_HTTPUPLOADER 1
5154
#define STORAGE_NETTYPE_HTTPDOWNLOAD 2

XEngine_Source/XEngine_StorageApp/StorageApp_Network.cpp

Lines changed: 22 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ void CALLBACK XEngine_Callback_DownloadRecv(LPCTSTR lpszClientAddr, SOCKET hSock
1919
}
2020
void CALLBACK XEngine_Callback_DownloadLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
2121
{
22-
XEngine_Net_CloseClient(lpszClientAddr, FALSE, STORAGE_NETTYPE_HTTPDOWNLOAD);
22+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPDOWNLOAD);
2323
}
2424
//////////////////////////////////////////////////////////////////////////
2525
BOOL CALLBACK XEngine_Callback_UPLoaderLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
@@ -42,7 +42,7 @@ void CALLBACK XEngine_Callback_UPLoaderRecv(LPCTSTR lpszClientAddr, SOCKET hSock
4242
}
4343
void CALLBACK XEngine_Callback_UPLoaderLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
4444
{
45-
XEngine_Net_CloseClient(lpszClientAddr, FALSE, STORAGE_NETTYPE_HTTPUPLOADER);
45+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPUPLOADER);
4646
}
4747
//////////////////////////////////////////////////////////////////////////
4848
BOOL CALLBACK XEngine_Callback_CenterLogin(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
@@ -62,28 +62,28 @@ void CALLBACK XEngine_Callback_CenterRecv(LPCTSTR lpszClientAddr, SOCKET hSocket
6262
}
6363
void CALLBACK XEngine_Callback_CenterLeave(LPCTSTR lpszClientAddr, SOCKET hSocket, LPVOID lParam)
6464
{
65-
XEngine_Net_CloseClient(lpszClientAddr, FALSE, STORAGE_NETTYPE_HTTPCENTER);
65+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_BYSELF, STORAGE_NETTYPE_HTTPCENTER);
6666
}
6767
//////////////////////////////////////////////////////////////////////////
6868
void CALLBACK XEngine_Callback_HBDownload(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam)
6969
{
70-
XEngine_Net_CloseClient(lpszClientAddr, TRUE, STORAGE_NETTYPE_HTTPDOWNLOAD);
70+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPDOWNLOAD);
7171
}
7272
void CALLBACK XEngine_Callback_HBUPLoader(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam)
7373
{
74-
XEngine_Net_CloseClient(lpszClientAddr, TRUE, STORAGE_NETTYPE_HTTPUPLOADER);
74+
XEngine_Net_CloseClient(lpszClientAddr, STORAGE_LEAVETYPE_HEARTBEAT, STORAGE_NETTYPE_HTTPUPLOADER);
7575
}
7676
//////////////////////////////////////////////////////////////////////////
77-
BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, BOOL bHBLeave, int nType)
77+
BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClientType)
7878
{
79-
LPCTSTR lpszLeaveMsg = bHBLeave ? _T("心跳超时") : _T("主动断开");
79+
LPCTSTR lpszLeaveMsg;
8080
tstring m_StrClient;
8181

82-
if (STORAGE_NETTYPE_HTTPUPLOADER == nType)
82+
if (STORAGE_NETTYPE_HTTPUPLOADER == nClientType)
8383
{
8484
m_StrClient = _T("上传客户端");
8585
}
86-
else if (STORAGE_NETTYPE_HTTPDOWNLOAD == nType)
86+
else if (STORAGE_NETTYPE_HTTPDOWNLOAD == nClientType)
8787
{
8888
m_StrClient = _T("下载客户端");
8989
}
@@ -92,16 +92,28 @@ BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, BOOL bHBLeave, int nType)
9292
m_StrClient = _T("业务客户端");
9393
}
9494

95-
if (bHBLeave)
95+
if (STORAGE_LEAVETYPE_HEARTBEAT == nLeaveType)
9696
{
97+
lpszLeaveMsg = _T("心跳超时");
9798
NetCore_TCPXCore_CloseForClientEx(xhNetDownload, lpszClientAddr);
9899
NetCore_TCPXCore_CloseForClientEx(xhNetUPLoader, lpszClientAddr);
99100
}
101+
else if (STORAGE_LEAVETYPE_BYSELF == nLeaveType)
102+
{
103+
lpszLeaveMsg = _T("主动断开");
104+
SocketOpt_HeartBeat_DeleteAddrEx(xhHBDownload, lpszClientAddr);
105+
SocketOpt_HeartBeat_DeleteAddrEx(xhHBUPLoader, lpszClientAddr);
106+
}
100107
else
101108
{
109+
lpszLeaveMsg = _T("主动关闭");
110+
NetCore_TCPXCore_CloseForClientEx(xhNetDownload, lpszClientAddr);
111+
NetCore_TCPXCore_CloseForClientEx(xhNetUPLoader, lpszClientAddr);
112+
102113
SocketOpt_HeartBeat_DeleteAddrEx(xhHBDownload, lpszClientAddr);
103114
SocketOpt_HeartBeat_DeleteAddrEx(xhHBUPLoader, lpszClientAddr);
104115
}
116+
105117
Session_UPStroage_Delete(lpszClientAddr);
106118
Session_DLStroage_Delete(lpszClientAddr);
107119
RfcComponents_HttpServer_CloseClinetEx(xhUPHttp, lpszClientAddr);

XEngine_Source/XEngine_StorageApp/StorageApp_Network.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,5 @@ void CALLBACK XEngine_Callback_CenterLeave(LPCTSTR lpszClientAddr, SOCKET hSocke
1313
void CALLBACK XEngine_Callback_HBDownload(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam);
1414
void CALLBACK XEngine_Callback_HBUPLoader(LPCTSTR lpszClientAddr, SOCKET hSocket, int nStatus, LPVOID lParam);
1515

16-
BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, BOOL bHBLeave, int nType = STORAGE_NETTYPE_HTTPDOWNLOAD);
16+
BOOL XEngine_Net_CloseClient(LPCTSTR lpszClientAddr, int nLeaveType, int nClientType = STORAGE_NETTYPE_HTTPDOWNLOAD);
1717
BOOL XEngine_Net_SendMsg(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, int nMsgLen, int nType = STORAGE_NETTYPE_HTTPDOWNLOAD);

XEngine_Source/XEngine_StorageApp/StorageApp_Task.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,4 +143,25 @@ BOOL XEngine_Task_RangeFile(LPCTSTR lpszClientAddr, int* pInt_SPos, int* pInt_EP
143143
*pInt_EPos = _ttoi(tszValueStr);
144144
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("%s:%s,客户端的请求设置了数据范围:%s - %s"), lpszClientType, lpszClientAddr, tszKeyStr, tszValueStr);
145145
return TRUE;
146+
}
147+
BOOL XEngine_Task_VerHash(LPCTSTR lpszClientAddr ,LPCTSTR lpszFileName, LPCTSTR lpszFileHash, TCHAR** pptszListHdr, int nHdrCount)
148+
{
149+
LPCTSTR lpszKeyStr = _T("FileHash");
150+
TCHAR tszValueStr[MAX_PATH];
151+
memset(tszValueStr, '\0', MAX_PATH);
152+
153+
if (RfcComponents_HttpHelp_GetField(&pptszListHdr, nHdrCount, lpszKeyStr, tszValueStr))
154+
{
155+
if (0 != _tcsnicmp(lpszFileHash, tszValueStr, _tcslen(lpszFileHash)))
156+
{
157+
_tremove(lpszFileName);
158+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _T("上传客户端:%s,上传的文件信息HASH校验失败,无法继续,文件:%s 已被删除,原始HASH:%s,计算HASH:%s"), lpszClientAddr, lpszFileName, tszValueStr, lpszFileHash);
159+
return FALSE;
160+
}
161+
}
162+
else
163+
{
164+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,上传的信息没有附带HASH值,无法验证文件的正确性"), lpszClientAddr);
165+
}
166+
return TRUE;
146167
}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
#pragma once
22

33
BOOL XEngine_Task_ProxyAuth(LPCTSTR lpszClientAddr, LPCTSTR lpszPostUrl, TCHAR** pptszListHdr, int nHdrCount, int nSDType = STORAGE_NETTYPE_HTTPDOWNLOAD);
4-
BOOL XEngine_Task_RangeFile(LPCTSTR lpszClientAddr, int* pInt_SPos, int* pInt_EPos, TCHAR** pptszListHdr, int nHdrCount, int nSDType = STORAGE_NETTYPE_HTTPDOWNLOAD);
4+
BOOL XEngine_Task_RangeFile(LPCTSTR lpszClientAddr, int* pInt_SPos, int* pInt_EPos, TCHAR** pptszListHdr, int nHdrCount, int nSDType = STORAGE_NETTYPE_HTTPDOWNLOAD);
5+
BOOL XEngine_Task_VerHash(LPCTSTR lpszClientAddr, LPCTSTR lpszFileName, LPCTSTR lpszFileHash, TCHAR** pptszListHdr, int nHdrCount);

XEngine_Source/XEngine_StorageApp/StorageApp_UPLoader.cpp

Lines changed: 34 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -128,47 +128,51 @@ BOOL XEngine_Task_HttpUPLoader(LPCTSTR lpszClientAddr, LPCTSTR lpszMsgBuffer, in
128128
_tcscpy(st_ProtocolFile.st_ProtocolFile.tszFileName, pSt_HTTPParam->tszHttpUri + 1);
129129
st_ProtocolFile.st_ProtocolFile.nFileSize = nRVCount;
130130

131+
131132
OPenSsl_Api_Digest(tszFileDir, tszHashStr, NULL, TRUE, st_ServiceCfg.st_XStorage.nHashMode);
132133
BaseLib_OperatorString_StrToHex((char*)tszHashStr, 20, st_ProtocolFile.st_ProtocolFile.tszFileHash);
133-
134-
if (bIsSQL)
134+
//验证HASH值
135+
if (XEngine_Task_VerHash(lpszClientAddr, tszFileDir, st_ProtocolFile.st_ProtocolFile.tszFileHash, pptszListHdr, nHdrCount))
135136
{
136-
if (XStorageSQL_File_FileInsert(&st_ProtocolFile))
137+
if (bIsSQL)
137138
{
138-
if (st_ServiceCfg.st_XProxy.st_XProxyPass.bUPPass)
139+
if (XStorageSQL_File_FileInsert(&st_ProtocolFile))
139140
{
140-
int nPLen = MAX_PATH;
141-
int nHttpCode = 0;
142-
TCHAR tszProxyStr[MAX_PATH];
143-
SESSION_STORAGEINFO st_StorageInfo;
144-
145-
memset(tszProxyStr, '\0', MAX_PATH);
146-
memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO));
147-
148-
Session_UPStroage_GetInfo(lpszClientAddr, &st_StorageInfo);
149-
XStorageProtocol_Proxy_PacketUPDown(st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, tszProxyStr, &nPLen, st_ProtocolFile.st_ProtocolFile.tszFileHash);
150-
APIHelp_HttpRequest_Post(st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass, tszProxyStr, &nHttpCode);
151-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass);
141+
if (st_ServiceCfg.st_XProxy.st_XProxyPass.bUPPass)
142+
{
143+
int nPLen = MAX_PATH;
144+
int nHttpCode = 0;
145+
TCHAR tszProxyStr[MAX_PATH];
146+
SESSION_STORAGEINFO st_StorageInfo;
147+
148+
memset(tszProxyStr, '\0', MAX_PATH);
149+
memset(&st_StorageInfo, '\0', sizeof(SESSION_STORAGEINFO));
150+
151+
Session_UPStroage_GetInfo(lpszClientAddr, &st_StorageInfo);
152+
XStorageProtocol_Proxy_PacketUPDown(st_StorageInfo.tszFileDir, st_StorageInfo.tszClientAddr, st_StorageInfo.ullRWCount, tszProxyStr, &nPLen, st_ProtocolFile.st_ProtocolFile.tszFileHash);
153+
APIHelp_HttpRequest_Post(st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass, tszProxyStr, &nHttpCode);
154+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_NOTICE, _T("上传客户端:%s,请求完成通知返回值:%d,文件:%s,地址:%s"), lpszClientAddr, nHttpCode, st_StorageInfo.tszFileDir, st_ServiceCfg.st_XProxy.st_XProxyPass.tszUPPass);
155+
}
156+
st_HDRParam.bIsClose = FALSE;
157+
st_HDRParam.nHttpCode = 200;
158+
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
159+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER);
160+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount);
161+
}
162+
else
163+
{
164+
st_HDRParam.bIsClose = FALSE;
165+
st_HDRParam.nHttpCode = 403;
166+
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
167+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER);
168+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, XStorageDB_GetLastError());
152169
}
153-
st_HDRParam.bIsClose = FALSE;
154-
st_HDRParam.nHttpCode = 200;
155-
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
156-
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER);
157-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d"), lpszClientAddr, tszFileDir, nRVCount);
158170
}
159171
else
160172
{
161-
st_HDRParam.bIsClose = FALSE;
162-
st_HDRParam.nHttpCode = 403;
163-
RfcComponents_HttpServer_SendMsgEx(xhUPHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
164-
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPUPLOADER);
165-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _T("上传客户端:%s,请求上传文件失败,插入数据库失败:%s,错误:%lX"), lpszClientAddr, tszFileDir, XStorageDB_GetLastError());
173+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount);
166174
}
167175
}
168-
else
169-
{
170-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_WARN, _T("上传客户端:%s,请求上传文件成功,文件名:%s,大小:%d,数据库没有启用,不插入数据库"), lpszClientAddr, tszFileDir, nRVCount);
171-
}
172176
Session_UPStroage_Delete(lpszClientAddr);
173177
}
174178
else

0 commit comments

Comments
 (0)