Skip to content

Commit ba02ab1

Browse files
committed
added:proppatch protocol support
fixed:APIHelp_Distributed_DLStorage sometime is file name and key is incorrect
1 parent 7fe6a6a commit ba02ab1

File tree

9 files changed

+232
-10
lines changed

9 files changed

+232
-10
lines changed

XEngine_Source/StorageModule_APIHelp/APIHelp_Distributed/APIHelp_Distributed.cpp

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,8 @@ bool CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer,
170170
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_PARAMENT;
171171
return false;
172172
}
173-
bool bFound = false;
173+
bool bFileFound = false;
174+
bool bBucketFound = false;
174175
XCHAR tszKeyStr[128];
175176
memset(tszKeyStr, '\0', sizeof(tszKeyStr));
176177
//获得key
@@ -180,38 +181,43 @@ bool CAPIHelp_Distributed::APIHelp_Distributed_DLStorage(LPCXSTR lpszMsgBuffer,
180181
{
181182
if ('/' == lpszMsgBuffer[i])
182183
{
183-
bFound = true;
184+
bFileFound = true;
184185
break;
185186
}
186187
}
187-
if (bFound)
188+
if (bFileFound)
188189
{
189-
_tcsxcpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + i);
190190
memcpy(tszKeyStr, lpszMsgBuffer + 1, i - 1);
191191
}
192192
else
193193
{
194-
_tcsxcpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + 1);
195194
_tcsxcpy(tszKeyStr, lpszMsgBuffer + 1);
196195
}
197-
bFound = false;
198196
//获得对应存储
199197
for (auto stl_ListIterator = pStl_ListBucket->begin(); stl_ListIterator != pStl_ListBucket->end(); stl_ListIterator++)
200198
{
201199
if (0 == _tcsxncmp(tszKeyStr, stl_ListIterator->tszBuckKey, _tcsxlen(stl_ListIterator->tszBuckKey)))
202200
{
203-
bFound = true;
201+
bBucketFound = true;
204202
*pSt_StorageBucket = *stl_ListIterator;
205203
break;
206204
}
207205
}
208-
if (!bFound)
206+
if (!bBucketFound)
209207
{
210208
APIHelp_IsErrorOccur = true;
211209
APIHelp_dwErrorCode = ERROR_STORAGE_MODULE_APIHELP_NOTFOUND;
212210
return false;
213211
}
214212

213+
if (bFileFound)
214+
{
215+
_tcsxcpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + i);
216+
}
217+
else
218+
{
219+
_tcsxcpy(pSt_StorageBucket->tszFileName, lpszMsgBuffer + 1);
220+
}
215221
return true;
216222
}
217223
/********************************************************************

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -809,6 +809,85 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer
809809
XMLPrinter m_XMLPrinter;
810810
m_XMLDocument.Print(&m_XMLPrinter);
811811

812+
*pInt_MsgLen = m_XMLPrinter.CStrSize() - 1;
813+
memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), *pInt_MsgLen);
814+
return true;
815+
}
816+
/********************************************************************
817+
函数名称:Protocol_StoragePacket_WDPropPatch
818+
函数功能:webdavPROPPATCH协议封装
819+
参数.一:ptszMsgBuffer
820+
In/Out:Out
821+
类型:字符指针
822+
可空:N
823+
意思:输出组好包的请求缓冲区
824+
参数.二:pInt_MsgLen
825+
In/Out:Out
826+
类型:整数型指针
827+
可空:N
828+
意思:输出缓冲区大小
829+
参数.三:lpszFileName
830+
In/Out:In
831+
类型:常量字符指针
832+
可空:N
833+
意思:输入文件名
834+
参数.四:pStl_ListName
835+
In/Out:In
836+
类型:STL容器指针
837+
可空:N
838+
意思:输入打包的属性列表
839+
返回值
840+
类型:逻辑型
841+
意思:是否成功
842+
备注:
843+
*********************************************************************/
844+
bool CProtocol_StoragePacket::Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list<string>* pStl_ListName)
845+
{
846+
Protocol_IsErrorOccur = false;
847+
848+
if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen))
849+
{
850+
Protocol_IsErrorOccur = true;
851+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT;
852+
return false;
853+
}
854+
// 创建一个 XML 文档
855+
XMLDocument m_XMLDocument;
856+
// XML 声明
857+
XMLDeclaration* pSt_XMLDeclaration = m_XMLDocument.NewDeclaration(R"(xml version="1.0" encoding="utf-8")");
858+
m_XMLDocument.InsertFirstChild(pSt_XMLDeclaration);
859+
860+
// 根元素 <multistatus>
861+
XMLElement* pSt_XMLRoot = m_XMLDocument.NewElement("d:multistatus");
862+
pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:");
863+
m_XMLDocument.InsertEndChild(pSt_XMLRoot);
864+
// 子元素 <response>
865+
XMLElement* pSt_XMLResponse = m_XMLDocument.NewElement("D:response");
866+
pSt_XMLRoot->InsertEndChild(pSt_XMLResponse);
867+
// 子元素 <href>
868+
XMLElement* pSt_XMLHRef = m_XMLDocument.NewElement("D:href");
869+
pSt_XMLHRef->SetText(lpszFileName);
870+
pSt_XMLResponse->InsertEndChild(pSt_XMLHRef);
871+
// 子元素 <propstat>
872+
XMLElement* pSt_XMLPropStat = m_XMLDocument.NewElement("D:propstat");
873+
pSt_XMLResponse->InsertEndChild(pSt_XMLPropStat);
874+
// 子元素 <prop>
875+
XMLElement* pSt_XMLProp = m_XMLDocument.NewElement("D:prop");
876+
pSt_XMLPropStat->InsertEndChild(pSt_XMLProp);
877+
// 子元素
878+
for (auto stl_ListIterator = pStl_ListName->begin(); stl_ListIterator != pStl_ListName->end(); stl_ListIterator++)
879+
{
880+
XMLElement* pSt_XMLListValue = m_XMLDocument.NewElement(stl_ListIterator->c_str());
881+
pSt_XMLProp->InsertEndChild(pSt_XMLListValue);
882+
}
883+
// 子元素 <status>
884+
XMLElement* pSt_XMLStatus = m_XMLDocument.NewElement("D:status");
885+
pSt_XMLStatus->SetText("HTTP/1.1 200 OK");
886+
pSt_XMLPropStat->InsertEndChild(pSt_XMLStatus);
887+
// 将 XML 数据保存到字符串
888+
XMLPrinter m_XMLPrinter;
889+
m_XMLDocument.Print(&m_XMLPrinter);
890+
812891
*pInt_MsgLen = m_XMLPrinter.CStrSize() - 1;
813892
memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), *pInt_MsgLen);
814893
return true;

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,5 @@ class CProtocol_StoragePacket
2727
public:
2828
bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
2929
bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
30+
bool Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list<string>* pStl_ListName);
3031
};

XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -629,4 +629,62 @@ bool CProtocol_StorageParse::Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer,
629629
}
630630
}
631631
return true;
632+
}
633+
/********************************************************************
634+
函数名称:Protocol_StorageParse_WDPropPatch
635+
函数功能:解析proppatch协议
636+
参数.一:lpszMsgBuffer
637+
In/Out:In
638+
类型:常量字符指针
639+
可空:N
640+
意思:输入要解析的内容
641+
参数.二:nMsgLen
642+
In/Out:In
643+
类型:整数型
644+
可空:N
645+
意思:输入要解析的大小
646+
参数.三:pStl_ListName
647+
In/Out:Out
648+
类型:LIST容器指针
649+
可空:N
650+
意思:输出解析的数据
651+
返回值
652+
类型:逻辑型
653+
意思:是否成功
654+
备注:
655+
*********************************************************************/
656+
bool CProtocol_StorageParse::Protocol_StorageParse_WDPropPatch(LPCXSTR lpszMsgBuffer, int nMsgLen, std::list<string>* pStl_ListName)
657+
{
658+
Protocol_IsErrorOccur = false;
659+
660+
XMLDocument m_XMLDocument;
661+
XMLError m_XMLResult = m_XMLDocument.Parse(lpszMsgBuffer);
662+
if (XML_SUCCESS != m_XMLResult)
663+
{
664+
Protocol_IsErrorOccur = true;
665+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARSE;
666+
return false;
667+
}
668+
//获取根元素
669+
XMLElement* pSt_XMLRoot = m_XMLDocument.RootElement();
670+
if (NULL == pSt_XMLRoot)
671+
{
672+
Protocol_IsErrorOccur = true;
673+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_ROOT;
674+
return false;
675+
}
676+
XMLElement* pSt_XMLPropertySet = pSt_XMLRoot->FirstChildElement("D:set");
677+
if (NULL != pSt_XMLPropertySet)
678+
{
679+
XMLElement* pSt_XMLPropertyProp = pSt_XMLPropertySet->FirstChildElement("D:prop");
680+
if (NULL != pSt_XMLPropertyProp)
681+
{
682+
//获得所有名称
683+
for (XMLElement* pSt_XMLChild = pSt_XMLPropertyProp->FirstChildElement(); NULL != pSt_XMLChild; pSt_XMLChild = pSt_XMLChild->NextSiblingElement())
684+
{
685+
pStl_ListName->push_back(pSt_XMLChild->Name());
686+
}
687+
}
688+
}
689+
return true;
632690
}

XEngine_Source/StorageModule_Protocol/Protocol_Parse/Protocol_StorageParse.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,5 @@ class CProtocol_StorageParse
2626
bool Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_ACTIONINFO* pSt_ActionInfo);
2727
public:
2828
bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
29+
bool Protocol_StorageParse_WDPropPatch(LPCXSTR lpszMsgBuffer, int nMsgLen, std::list<string>* pStl_ListName);
2930
};

XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ EXPORTS
1212
Protocol_StorageParse_P2PToken
1313
Protocol_StorageParse_Action
1414
Protocol_StorageParse_WDLock
15+
Protocol_StorageParse_WDPropPatch
1516

1617
Protocol_StoragePacket_BasicAuth
1718
Protocol_StoragePacket_UPDown
@@ -21,4 +22,5 @@ EXPORTS
2122
Protocol_StoragePacket_REQFile
2223
Protocol_StoragePacket_Action
2324
Protocol_StoragePacket_WDPropfind
24-
Protocol_StoragePacket_WDLock
25+
Protocol_StoragePacket_WDLock
26+
Protocol_StoragePacket_WDPropPatch

XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,6 +269,30 @@ extern "C" bool Protocol_StorageParse_Action(LPCXSTR lpszMsgBuffer, int nMsgLen,
269269
备注:
270270
*********************************************************************/
271271
extern "C" bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
272+
/********************************************************************
273+
函数名称:Protocol_StorageParse_WDPropPatch
274+
函数功能:解析proppatch协议
275+
参数.一:lpszMsgBuffer
276+
In/Out:In
277+
类型:常量字符指针
278+
可空:N
279+
意思:输入要解析的内容
280+
参数.二:nMsgLen
281+
In/Out:In
282+
类型:整数型
283+
可空:N
284+
意思:输入要解析的大小
285+
参数.三:pStl_ListName
286+
In/Out:Out
287+
类型:LIST容器指针
288+
可空:N
289+
意思:输出解析的数据
290+
返回值
291+
类型:逻辑型
292+
意思:是否成功
293+
备注:
294+
*********************************************************************/
295+
extern "C" bool Protocol_StorageParse_WDPropPatch(LPCXSTR lpszMsgBuffer, int nMsgLen, std::list<string>* pStl_ListName);
272296
/************************************************************************/
273297
/* 打包协议导出 */
274298
/************************************************************************/
@@ -602,4 +626,33 @@ extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pIn
602626
意思:是否成功
603627
备注:
604628
*********************************************************************/
605-
extern "C" bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
629+
extern "C" bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
630+
/********************************************************************
631+
函数名称:Protocol_StoragePacket_WDPropPatch
632+
函数功能:webdavPROPPATCH协议封装
633+
参数.一:ptszMsgBuffer
634+
In/Out:Out
635+
类型:字符指针
636+
可空:N
637+
意思:输出组好包的请求缓冲区
638+
参数.二:pInt_MsgLen
639+
In/Out:Out
640+
类型:整数型指针
641+
可空:N
642+
意思:输出缓冲区大小
643+
参数.三:lpszFileName
644+
In/Out:In
645+
类型:常量字符指针
646+
可空:N
647+
意思:输入文件名
648+
参数.四:pStl_ListName
649+
In/Out:In
650+
类型:STL容器指针
651+
可空:N
652+
意思:输入打包的属性列表
653+
返回值
654+
类型:逻辑型
655+
意思:是否成功
656+
备注:
657+
*********************************************************************/
658+
extern "C" bool Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list<string>* pStl_ListName);

XEngine_Source/StorageModule_Protocol/pch.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ extern "C" bool Protocol_StorageParse_WDLock(LPCXSTR lpszMsgBuffer, int nMsgLen,
6161
{
6262
return m_StorageParse.Protocol_StorageParse_WDLock(lpszMsgBuffer, nMsgLen, pSt_WDLock);
6363
}
64+
extern "C" bool Protocol_StorageParse_WDPropPatch(LPCXSTR lpszMsgBuffer, int nMsgLen, std::list<string>* pStl_ListName)
65+
{
66+
return m_StorageParse.Protocol_StorageParse_WDPropPatch(lpszMsgBuffer, nMsgLen, pStl_ListName);
67+
}
6468
/************************************************************************/
6569
/* 打包协议导出 */
6670
/************************************************************************/
@@ -99,4 +103,8 @@ extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pIn
99103
extern "C" bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock)
100104
{
101105
return m_StoragePacket.Protocol_StoragePacket_WDLock(ptszMsgBuffer, pInt_MsgLen, pSt_WDLock);
106+
}
107+
extern "C" bool Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list<string>* pStl_ListName)
108+
{
109+
return m_StoragePacket.Protocol_StoragePacket_WDPropPatch(ptszMsgBuffer, pInt_MsgLen, lpszFileName, pStl_ListName);
102110
}

XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,20 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int
217217
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议LOCK方法成功,锁用户:%s"), lpszClientAddr, st_WDLock.tszOwner);
218218
return true;
219219
}
220+
else if (0 == _tcsxnicmp(lpszMethodPropPatch, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodPropPatch)))
221+
{
222+
st_HDRParam.bIsClose = false;
223+
st_HDRParam.nHttpCode = 207;
224+
225+
std::list<string> stl_ListName;
226+
Protocol_StorageParse_WDPropPatch(lpszMsgBuffer, nMsgLen, &stl_ListName);
227+
228+
Protocol_StoragePacket_WDPropPatch(tszRVBuffer, &nRVLen, pSt_HTTPParam->tszHttpUri, &stl_ListName);
229+
HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
230+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV);
231+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPPATCH方法成功,锁用户:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
232+
return true;
233+
}
220234
else if (0 == _tcsxnicmp(lpszMethodDel, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodDel)))
221235
{
222236
//使用重定向实现上传

0 commit comments

Comments
 (0)