Skip to content

Commit 26048ca

Browse files
committed
fixed:webdav response type is incorrect
modify:upload method mix support added:not found response for web dav
1 parent 8713938 commit 26048ca

File tree

6 files changed

+115
-18
lines changed

6 files changed

+115
-18
lines changed

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.cpp

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,70 @@ bool CProtocol_StoragePacket::Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer
640640
return true;
641641
}
642642
/********************************************************************
643+
函数名称:Protocol_StoragePacket_Notfound
644+
函数功能:没有找到
645+
参数.一:ptszMsgBuffer
646+
In/Out:Out
647+
类型:字符指针
648+
可空:N
649+
意思:输出打好包的XML数据
650+
参数.二:pInt_MsgLen
651+
In/Out:Out
652+
类型:整数型指针
653+
可空:N
654+
意思:输出大小
655+
参数.三:lpszFileName
656+
In/Out:Out
657+
类型:常量字符指针
658+
可空:N
659+
意思:输入要打包的数据
660+
返回值
661+
类型:逻辑型
662+
意思:是否成功
663+
备注:
664+
*********************************************************************/
665+
bool CProtocol_StoragePacket::Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName)
666+
{
667+
Protocol_IsErrorOccur = false;
668+
669+
if ((NULL == ptszMsgBuffer) || (NULL == pInt_MsgLen))
670+
{
671+
Protocol_IsErrorOccur = true;
672+
Protocol_dwErrorCode = ERROR_XENGINE_STORAGE_PROTOCOL_PARAMENT;
673+
return false;
674+
}
675+
// 创建一个 XML 文档
676+
XMLDocument m_XMLDocument;
677+
// XML 声明
678+
XMLDeclaration* pSt_XMLDeclaration = m_XMLDocument.NewDeclaration(R"(xml version="1.0" encoding="utf-8")");
679+
m_XMLDocument.InsertFirstChild(pSt_XMLDeclaration);
680+
681+
// 根元素 <multistatus>
682+
XMLElement* pSt_XMLRoot = m_XMLDocument.NewElement("d:error");
683+
pSt_XMLRoot->SetAttribute("xmlns:d", "DAV:");
684+
m_XMLDocument.InsertEndChild(pSt_XMLRoot);
685+
686+
// 子元素 <href>
687+
XMLElement* pSt_XMLHerf = m_XMLDocument.NewElement("d:href");
688+
pSt_XMLHerf->SetText(lpszFileName);
689+
pSt_XMLRoot->InsertEndChild(pSt_XMLHerf);
690+
// 子元素 <status>
691+
XMLElement* pSt_XMLStatus = m_XMLDocument.NewElement("d:status");
692+
pSt_XMLStatus->SetText(_X("HTTP/1.1 404 Not Found"));
693+
pSt_XMLRoot->InsertEndChild(pSt_XMLStatus);
694+
// 子元素 <responsedescription>
695+
XMLElement* pSt_XMLResponseDesc = m_XMLDocument.NewElement("d:responsedescription");
696+
pSt_XMLResponseDesc->SetText(_X("Not found"));
697+
pSt_XMLRoot->InsertEndChild(pSt_XMLResponseDesc);
698+
// 将 XML 数据保存到字符串
699+
XMLPrinter m_XMLPrinter;
700+
m_XMLDocument.Print(&m_XMLPrinter);
701+
702+
*pInt_MsgLen = m_XMLPrinter.CStrSize() - 1;
703+
memcpy(ptszMsgBuffer, m_XMLPrinter.CStr(), *pInt_MsgLen);
704+
return true;
705+
}
706+
/********************************************************************
643707
函数名称:Protocol_StoragePacket_WDPropfind
644708
函数功能:propfind协议打包处理函数
645709
参数.一:ptszMsgBuffer

XEngine_Source/StorageModule_Protocol/Protocol_Packet/Protocol_StoragePacket.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class CProtocol_StoragePacket
2727
bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XNETHANDLE xhToken, XENGINE_ACTIONINFO* pSt_ActionInfo);
2828
bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list<XENGINE_STORAGEBUCKET>* pStl_ListBucket);
2929
public:
30+
bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName);
3031
bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey);
3132
bool Protocol_StoragePacket_WDLock(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XENGINE_WEBDAVLOCK* pSt_WDLock);
3233
bool Protocol_StoragePacket_WDPropPatch(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName, std::list<string>* pStl_ListName);

XEngine_Source/StorageModule_Protocol/StorageModule_Protocol.def

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ EXPORTS
2323
Protocol_StoragePacket_REQFile
2424
Protocol_StoragePacket_Action
2525
Protocol_StoragePacket_Bucket
26+
Protocol_StoragePacket_Notfound
2627
Protocol_StoragePacket_WDPropfind
2728
Protocol_StoragePacket_WDLock
2829
Protocol_StoragePacket_WDPropPatch

XEngine_Source/StorageModule_Protocol/StorageProtocol_Define.h

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -618,6 +618,30 @@ extern "C" bool Protocol_StoragePacket_Action(XCHAR* ptszMsgBuffer, int* pInt_Ms
618618
*********************************************************************/
619619
extern "C" bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, list<XENGINE_STORAGEBUCKET>* pStl_ListBucket);
620620
/********************************************************************
621+
函数名称:Protocol_StoragePacket_Notfound
622+
函数功能:没有找到
623+
参数.一:ptszMsgBuffer
624+
In/Out:Out
625+
类型:字符指针
626+
可空:N
627+
意思:输出打好包的XML数据
628+
参数.二:pInt_MsgLen
629+
In/Out:Out
630+
类型:整数型指针
631+
可空:N
632+
意思:输出大小
633+
参数.三:lpszFileName
634+
In/Out:Out
635+
类型:常量字符指针
636+
可空:N
637+
意思:输入要打包的数据
638+
返回值
639+
类型:逻辑型
640+
意思:是否成功
641+
备注:
642+
*********************************************************************/
643+
extern "C" bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName);
644+
/********************************************************************
621645
函数名称:Protocol_StoragePacket_WDPropfind
622646
函数功能:propfind协议打包处理函数
623647
参数.一:ptszMsgBuffer

XEngine_Source/StorageModule_Protocol/pch.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ extern "C" bool Protocol_StoragePacket_Bucket(XCHAR* ptszMsgBuffer, int* pInt_Ms
104104
{
105105
return m_StoragePacket.Protocol_StoragePacket_Bucket(ptszMsgBuffer, pInt_MsgLen, pStl_ListBucket);
106106
}
107+
extern "C" bool Protocol_StoragePacket_Notfound(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, LPCXSTR lpszFileName)
108+
{
109+
return m_StoragePacket.Protocol_StoragePacket_Notfound(ptszMsgBuffer, pInt_MsgLen, lpszFileName);
110+
}
107111
extern "C" bool Protocol_StoragePacket_WDPropfind(XCHAR* ptszMsgBuffer, int* pInt_MsgLen, XCHAR*** ppptszListFile, int nFileCount, LPCXSTR lpszBucketPath, LPCXSTR lpszBucketKey)
108112
{
109113
return m_StoragePacket.Protocol_StoragePacket_WDPropfind(ptszMsgBuffer, pInt_MsgLen, ppptszListFile, nFileCount, lpszBucketPath, lpszBucketKey);

XEngine_Source/XEngine_StorageApp/StorageApp_Webdav.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int
6060

6161
st_HDRParam.bIsClose = false;
6262
st_HDRParam.nHttpCode = 200;
63+
_tcsxcpy(st_HDRParam.tszMimeType, _X("xml"));
6364
//http://127.0.0.1:5103/storagekey1
6465
if (0 == _tcsxnicmp(lpszMethodOption, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodOption)))
6566
{
@@ -94,17 +95,28 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int
9495
}
9596
int nListCount = 0;
9697
XCHAR** pptszListFile;
97-
XCHAR tszFindStr[XPATH_MAX] = {};
9898
//得到是否是文件
99-
if (APIHelp_Api_UrlStr(st_StorageBucket.tszBuckKey, pSt_HTTPParam->tszHttpUri))
99+
int nALen = 0;
100+
XCHAR tszFileUrl[XPATH_MAX] = {};
101+
SYSTEMAPI_FILE_ATTR st_FileAttr = {};
102+
_tcsxcpy(tszFileUrl, pSt_HTTPParam->tszHttpUri + 1);
103+
BaseLib_String_Replace(tszFileUrl, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath);
104+
105+
if (!SystemApi_File_GetFileAttr(tszFileUrl, &st_FileAttr))
106+
{
107+
st_HDRParam.nHttpCode = 404;
108+
Protocol_StoragePacket_Notfound(tszRVBuffer, &nRVLen, pSt_HTTPParam->tszHttpUri);
109+
HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
110+
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV);
111+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法失败,文件没有找到,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
112+
return false;
113+
}
114+
if (st_FileAttr.bFile)
100115
{
101-
int nALen = 0;
102-
_tcsxcpy(tszFindStr, pSt_HTTPParam->tszHttpUri + 1);
103-
BaseLib_String_Replace(tszFindStr, &nALen, st_StorageBucket.tszBuckKey, st_StorageBucket.tszFilePath, true);
104116
//如果是文件
105117
nListCount = 1;
106118
BaseLib_Memory_Malloc((XPPPMEM)&pptszListFile, nListCount, XPATH_MAX);
107-
_tcsxcpy(pptszListFile[0], tszFindStr);
119+
_tcsxcpy(pptszListFile[0], tszFileUrl);
108120
}
109121
else
110122
{
@@ -113,29 +125,20 @@ bool XEngine_Task_HttpWebdav(LPCXSTR lpszClientAddr, LPCXSTR lpszMsgBuffer, int
113125
HttpProtocol_ServerHelp_GetField(&pptszListHdr, nHdrCount, _X("Depth"), tszVluStr);
114126
if (1 == _ttxoi(tszVluStr))
115127
{
116-
SystemApi_File_EnumFile(tszFindStr, &pptszListFile, &nListCount, false, 3);
128+
SystemApi_File_EnumFile(tszFileUrl, &pptszListFile, &nListCount, false, 3);
117129
}
118130
else
119131
{
120-
SystemApi_File_EnumFile(tszFindStr, &pptszListFile, &nListCount);
132+
SystemApi_File_EnumFile(tszFileUrl, &pptszListFile, &nListCount);
121133
}
122134
}
123-
//枚举文件
124-
if (0 == nListCount)
125-
{
126-
st_HDRParam.nHttpCode = 404;
127-
HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam);
128-
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV);
129-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_ERROR, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法失败,文件没有找到,URL:%s"), lpszClientAddr, pSt_HTTPParam->tszHttpUri);
130-
return false;
131-
}
132135
Protocol_StoragePacket_WDPropfind(tszRVBuffer, &nRVLen, &pptszListFile, nListCount, st_StorageBucket.tszFilePath, st_StorageBucket.tszBuckKey);
133136

134137
st_HDRParam.nHttpCode = 207;
135138
_tcsxcpy(st_HDRParam.tszMimeType, _X("xml"));
136139
HttpProtocol_Server_SendMsgEx(xhWebdavHttp, tszSDBuffer, &nSDLen, &st_HDRParam, tszRVBuffer, nRVLen);
137140
XEngine_Net_SendMsg(lpszClientAddr, tszSDBuffer, nSDLen, STORAGE_NETTYPE_HTTPWEBDAV);
138-
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法成功,文件名称:%s"), lpszClientAddr, tszFindStr);
141+
XLOG_PRINT(xhLog, XENGINE_HELPCOMPONENTS_XLOG_IN_LOGLEVEL_INFO, _X("WEBDAV客户端:%s,处理WEBDAV协议PROPFIND方法成功,文件名称:%s"), lpszClientAddr, tszFileUrl);
139142
}
140143
else if (0 == _tcsxnicmp(lpszMethodGet, pSt_HTTPParam->tszHttpMethod, _tcsxlen(lpszMethodGet)))
141144
{

0 commit comments

Comments
 (0)