Skip to content

Commit 4cdcbcf

Browse files
committed
improved:propfind protocol
1 parent 231aceb commit 4cdcbcf

File tree

6 files changed

+187
-13
lines changed

6 files changed

+187
-13
lines changed

XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.cpp

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,8 @@ bool CAPIHelp_Api::APIHelp_Api_Boundary(XCHAR*** ppptszList, int nListCount, XCH
427427
*********************************************************************/
428428
bool CAPIHelp_Api::APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize)
429429
{
430+
APIHelp_IsErrorOccur = false;
431+
430432
int nListCount = 0;
431433
int nPathType = 0;
432434
__int64u nDirCount = 0; //当前目录大小
@@ -453,5 +455,91 @@ bool CAPIHelp_Api::APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIR
453455
}
454456
BaseLib_OperatorMemory_Free((XPPPMEM)&ppListFile, nListCount);
455457
*pInt_DIRSize = nDirCount;
458+
return true;
459+
}
460+
/********************************************************************
461+
函数名称:APIHelp_Api_UrlStr
462+
函数功能:获取URL的KEY
463+
参数.一:ptszKeyStr
464+
In/Out:Out
465+
类型:字符指针
466+
可空:N
467+
意思:输出获取到的数据
468+
参数.二:lpszUrl
469+
In/Out:In
470+
类型:常量字符指针
471+
可空:N
472+
意思:输入要获取的数据
473+
返回值
474+
类型:逻辑型
475+
意思:是否成功
476+
备注:
477+
*********************************************************************/
478+
bool CAPIHelp_Api::APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl)
479+
{
480+
APIHelp_IsErrorOccur = false;
481+
482+
XCHAR tszUrlStr[MAX_PATH] = {};
483+
_tcsxcpy(tszUrlStr, lpszUrl);
484+
// 查找第一个 '/' 的位置
485+
XCHAR *ptszFirstStr = _tcsxchr(tszUrlStr, '/');
486+
if (ptszFirstStr == NULL)
487+
{
488+
return false;
489+
}
490+
// 查找第二个 '/' 的位置
491+
XCHAR* ptszSecondStr = _tcsxchr(ptszFirstStr + 1, '/');
492+
if (ptszSecondStr == NULL)
493+
{
494+
return false;
495+
}
496+
// 计算提取字符串的长度
497+
int nLen = ptszSecondStr - ptszFirstStr - 1;
498+
// 复制字符串
499+
_tcsxncpy(ptszKeyStr, ptszFirstStr + 1, nLen);
500+
// 添加字符串结束符
501+
ptszKeyStr[nLen] = '\0';
502+
503+
return true;
504+
}
505+
/********************************************************************
506+
函数名称:APIHelp_Api_UrlChange
507+
函数功能:URL修改
508+
参数.一:ptszStr
509+
In/Out:In/Out
510+
类型:字符指针
511+
可空:N
512+
意思:输出修改后的内容,输入修改前的内容
513+
参数.二:lpszSourceStr
514+
In/Out:In
515+
类型:常量字符指针
516+
可空:N
517+
意思:输入要替换的字符串
518+
参数.三:lpszDestStr
519+
In/Out:In
520+
类型:常量字符指针
521+
可空:N
522+
意思:输入修改后的字符串
523+
返回值
524+
类型:逻辑型
525+
意思:是否成功
526+
备注:
527+
*********************************************************************/
528+
bool CAPIHelp_Api::APIHelp_Api_UrlChange(XCHAR* ptszStr, LPCXSTR lpszSourceStr, LPCXSTR lpszDestStr)
529+
{
530+
APIHelp_IsErrorOccur = false;
531+
532+
std::string m_Str = ptszStr;
533+
std::string m_StrSource = lpszSourceStr;
534+
std::string m_StrDest = lpszDestStr;
535+
536+
size_t startPos = 0;
537+
while ((startPos = m_Str.find(m_StrSource, startPos)) != std::string::npos)
538+
{
539+
m_Str.replace(startPos, m_StrSource.length(), m_StrDest);
540+
startPos += m_StrDest.length(); // 防止在替换新字符串后陷入无限循环
541+
}
542+
_tcsxcpy(ptszStr, m_Str.c_str());
543+
456544
return true;
457545
}

XEngine_Source/StorageModule_APIHelp/APIHelp_Api/APIHelp_Api.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ class CAPIHelp_Api
2525
bool APIHelp_Api_UrlParse(XCHAR*** ppptszList, int nListCount, XCHAR* ptszFileName, XCHAR* ptszKeyName);
2626
bool APIHelp_Api_Boundary(XCHAR*** ppptszList, int nListCount, XCHAR* ptszBoundStr);
2727
bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize);
28+
bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl);
29+
bool APIHelp_Api_UrlChange(XCHAR* ptszKeyStr, LPCXSTR lpszSourceStr, LPCXSTR lpszDestStr);
2830
protected:
2931
private:
3032
};

XEngine_Source/StorageModule_APIHelp/APIHelp_Define.h

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -351,4 +351,47 @@ extern "C" bool APIHelp_Api_Boundary(XCHAR*** ppptszList, int nListCount, XCHAR*
351351
意思:是否成功
352352
备注:
353353
*********************************************************************/
354-
extern "C" bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize);
354+
extern "C" bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u* pInt_DIRSize);
355+
/********************************************************************
356+
函数名称:APIHelp_Api_UrlStr
357+
函数功能:获取URL的KEY
358+
参数.一:ptszKeyStr
359+
In/Out:Out
360+
类型:字符指针
361+
可空:N
362+
意思:输出获取到的数据
363+
参数.二:lpszUrl
364+
In/Out:In
365+
类型:常量字符指针
366+
可空:N
367+
意思:输入要获取的数据
368+
返回值
369+
类型:逻辑型
370+
意思:是否成功
371+
备注:
372+
*********************************************************************/
373+
extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl);
374+
/********************************************************************
375+
函数名称:APIHelp_Api_UrlChange
376+
函数功能:URL修改
377+
参数.一:ptszStr
378+
In/Out:In/Out
379+
类型:字符指针
380+
可空:N
381+
意思:输出修改后的内容,输入修改前的内容
382+
参数.二:lpszSourceStr
383+
In/Out:In
384+
类型:常量字符指针
385+
可空:N
386+
意思:输入要替换的字符串
387+
参数.三:lpszDestStr
388+
In/Out:In
389+
类型:常量字符指针
390+
可空:N
391+
意思:输入修改后的字符串
392+
返回值
393+
类型:逻辑型
394+
意思:是否成功
395+
备注:
396+
*********************************************************************/
397+
extern "C" bool APIHelp_Api_UrlChange(XCHAR* ptszKeyStr, LPCXSTR lpszSourceStr, LPCXSTR lpszDestStr);

XEngine_Source/StorageModule_APIHelp/StorageModule_APIHelp.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,4 +16,6 @@ EXPORTS
1616
APIHelp_Api_GetIPInfo
1717
APIHelp_Api_UrlParse
1818
APIHelp_Api_Boundary
19-
APIHelp_Api_GetDIRSize
19+
APIHelp_Api_GetDIRSize
20+
APIHelp_Api_UrlStr
21+
APIHelp_Api_UrlChange

XEngine_Source/StorageModule_APIHelp/pch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,4 +85,12 @@ extern "C" bool APIHelp_Api_Boundary(XCHAR * **ppptszList, int nListCount, XCHAR
8585
extern "C" bool APIHelp_Api_GetDIRSize(LPCXSTR lpszDIRStr, __int64u * pInt_DIRSize)
8686
{
8787
return m_APIHelp.APIHelp_Api_GetDIRSize(lpszDIRStr, pInt_DIRSize);
88+
}
89+
extern "C" bool APIHelp_Api_UrlStr(XCHAR* ptszKeyStr, LPCXSTR lpszUrl)
90+
{
91+
return m_APIHelp.APIHelp_Api_UrlStr(ptszKeyStr, lpszUrl);
92+
}
93+
extern "C" bool APIHelp_Api_UrlChange(XCHAR* ptszKeyStr, LPCXSTR lpszSourceStr, LPCXSTR lpszDestStr)
94+
{
95+
return m_APIHelp.APIHelp_Api_UrlChange(ptszKeyStr, lpszSourceStr, lpszDestStr);
8896
}

XEngine_Source/XEngine_StorageApp/Storage_APPTask/Storage_TaskWebdav.cpp

Lines changed: 42 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,41 +12,72 @@ bool Storage_TaskWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int nMsgL
1212
XENGINE_ACTIONINFO st_ActionInfo = {};
1313
RFCCOMPONENTS_HTTP_HDRPARAM st_HDRParam = {};
1414

15-
st_HDRParam.bIsClose = true;
15+
st_HDRParam.bIsClose = false;
1616
st_HDRParam.nHttpCode = 200;
1717

1818
if (0 == _tcsxnicmp(lpszAPIPropfind, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszAPIPropfind)))
1919
{
20+
if (_tcsxlen(pSt_HTTPParam->tszHttpUri) <= 1)
21+
{
22+
st_HDRParam.bIsClose = true;
23+
st_HDRParam.nHttpCode = 403;
24+
HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
25+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
26+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,处理WEBDAV协议PROPFIND方法失败,地址不正确,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
27+
return false;
28+
}
2029
XENGINE_STORAGEBUCKET st_StorageBucket = {};
2130
if (!APIHelp_Distributed_CTStorage(pSt_HTTPParam->tszHttpUri + 1, st_LoadbalanceCfg.st_LoadBalance.pStl_ListBucket, &st_StorageBucket))
2231
{
32+
st_HDRParam.bIsClose = true;
2333
st_HDRParam.nHttpCode = 400;
2434
HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
2535
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
2636
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,处理WEBDAV协议PROPFIND方法失败,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
2737
return false;
2838
}
39+
XCHAR tszFindStr[MAX_PATH] = {};
40+
//得到是否是文件
41+
if (APIHelp_Api_UrlStr(st_StorageBucket.tszBuckKey, pSt_HTTPParam->tszHttpUri))
42+
{
43+
int nALen = 0;
44+
_tcsxcpy(tszFindStr, pSt_HTTPParam->tszHttpUri + 1);
45+
APIHelp_Api_UrlChange(tszFindStr, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath);
46+
}
47+
else
48+
{
49+
//得到深度
50+
XCHAR tszVluStr[8] = {};
51+
HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Depth"), tszVluStr);
52+
if (1 == _ttxoi(tszVluStr))
53+
{
54+
_xstprintf(tszFindStr, _X("%s/*"), st_StorageBucket.tszFilePath);
55+
}
56+
else
57+
{
58+
_tcsxcpy(tszFindStr, st_StorageBucket.tszFilePath);
59+
}
60+
}
61+
//枚举文件
2962
int nListCount = 0;
3063
XCHAR** pptszListFile;
31-
32-
XCHAR tszVluStr[8] = {};
33-
HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Depth"), tszVluStr);
34-
35-
if (1 == _ttxoi(tszVluStr))
64+
SystemApi_File_EnumFile(tszFindStr, &pptszListFile, &nListCount);
65+
if (0 == nListCount)
3666
{
37-
_tcsxcat(st_StorageBucket.tszFilePath, _X("/*"));
67+
st_HDRParam.nHttpCode = 404;
68+
HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
69+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
70+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,处理WEBDAV协议PROPFIND方法失败,文件没有找到,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
71+
return false;
3872
}
39-
40-
SystemApi_File_EnumFile(st_StorageBucket.tszFilePath, &pptszListFile, &nListCount);
4173
Protocol_StoragePacket_Propfind(tszRVBuffer, &nRVLen, &pptszListFile, nListCount);
4274
nRVLen -= 1;
4375

4476
st_HDRParam.nHttpCode = 207;
4577
_tcsxcpy(st_HDRParam.tszMimeType, _X("xml"));
46-
4778
HttpProtocol_Server_SendMsgEx(xhCenterHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
4879
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPCENTER);
49-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,处理WEBDAV协议PROPFIND方法成功,KEY名称:%s"), lpszClientAddr, st_StorageBucket.tszFileName);
80+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("业务客户端:%s,处理WEBDAV协议PROPFIND方法成功,文件名称:%s"), lpszClientAddr, tszFindStr);
5081
return false;
5182
}
5283

0 commit comments

Comments
 (0)