📄 webdav.h
字号:
}
// Is file locked and if so, do we have tokens corresponding to it?
BOOL CheckLockTokens(void) {
return (m_nLockTokens && IsGLELocked());
}
BOOL SetMultiStatusResponse(void) { return SetStatusAndXMLBody(STATUS_MULTISTATUS); }
BOOL SetMultiStatusErrorFromDestinationPath(RESPONSESTATUS rs, WIN32_FIND_DATA *pFindData, WCHAR *szDirectory, BOOL fRootDir, PCSTR szRootURL=NULL,BOOL fSkipFileMunge=FALSE);
BOOL SetMultiStatusErrorFromURL(RESPONSESTATUS rs, PCSTR szRootURL);
BOOL GetDepth(DEPTH_TYPE depthDefault=DEPTH_INFINITY);
void GetOverwrite(void);
BOOL AddContentLocationHeaderIfNeeded(void);
BOOL AddContentLocationHeader(void);
BOOL BuildBaseURLFromSourceURL(BOOL fHttpHeader=FALSE);
BOOL BuildBaseURL(PCSTR szRoot, BOOL fHttpHeader, BOOL fAppendSlash);
BOOL SetHREFTagFromDestinationPath(WIN32_FIND_DATA *pFindData, WCHAR *szDirectory, BOOL fRootDir, PCSTR szRootURL=NULL, BOOL fSkipFileMunge=FALSE);
BOOL RecursiveVisitDirs(WCHAR *szPath, DWORD dwContext, PFN_RECURSIVE_VISIT pfnVisit, BOOL fDeferDirectoryProcess);
BOOL DavGetFileAttributesEx(void);
BOOL SendLockErrorInfoIfNeeded(WCHAR *szPath);
void SendLockedConflictOrErr(WCHAR *szPath, WCHAR *szAlternatPath=NULL);
// ******************************************************
// Routines tightly bound to VERB implementation
// ******************************************************
// PROPFIND
public:
BOOL SendProperties(DWORD dwDavPropFlags,BOOL fSendNamesOnly);
BOOL AddUnknownXMLElement(const WCHAR *wszTagName, const DWORD ccTagName);
private:
BOOL SendSubsetOfProperties(void);
// PROPPATCH
BOOL SendPropPatchResponse(RESPONSESTATUS rs);
BOOL SendUnknownXMLElementsIfNeeded(RESPONSESTATUS rs);
// OPTIONS
void WriteSupportedVerb(VERB v, BOOL fFirstVerbInList=FALSE);
void WritePublicOptions(void);
// PROPPUT
BOOL WriteBodyToFile(HANDLE hFile, BOOL fChunked);
BOOL ReadNextBodySegment(PSTR szBuf, DWORD *pcbRead);
// DELETE
BOOL DeleteCollection(WCHAR *szPath, CHAR *szURL);
// MOVE+COPY
BOOL MoveCopyResource(BOOL fDeleteSrc);
PSTR GetDestinationHeader(PSTR *ppszDestinationPrefix, PSTR *ppszDestinationURL, PSTR *ppszSave);
BOOL HasAccessToDestVRoot(CHAR *szDestURL, WCHAR *szPath, PVROOTINFO pVRoot);
BOOL MoveCopyCollection(CMoveCopyContext *pcContext);
BOOL MoveCopyFile(BOOL fDeleteSrc, WCHAR *wszSrcPath, WCHAR *wszDestPath);
// LOCK+UNLOCK
BOOL CheckIfHeaders(void);
BOOL CheckLockHeader(void);
__int64 CheckLockTokenHeader(void);
BOOL CheckTokenExpression(PSTR szToken, WCHAR *szPath);
BOOL CheckETagExpression(PSTR szToken, WCHAR *szPath);
BOOL SendLockTags(CWebDavFileNode *pLockedNode, BOOL fPrintPropTag=TRUE);
BOOL GetLockTimeout(DWORD *pdwTimeout);
// When building up URLs based on current, do we do http:// or https:// ?
PCSTR GetHttpPrefix() { return m_pRequest->IsSecure() ? cszHttpsPrefix : cszHttpPrefix ; }
DWORD GetHttpPrefixLen() { return m_pRequest->IsSecure() ? ccHttpsPrefix : ccHttpPrefix; }
BOOL IsContentTypeXML(void);
BOOL HasServerReadAllData(void) { return (m_pRequest->m_bufRequest.Count() == m_pRequest->m_dwContentLength); }
RESPONSESTATUS VerifyXMLBody(void);
BOOL ParseXMLBody(ISAXContentHandler *pParser, BOOL fSetDefaultStatus=TRUE);
BOOL SetHREFTag(PCSTR szURL=NULL);
BOOL SetResponseTag(PCSTR szURL, RESPONSESTATUS rs);
// Wrap filesystem calls in event we need to unlock
BOOL DavDeleteFile(WCHAR *szFile);
public:
CWebDav(CHttpRequest *pRequest) : m_bufResp(pRequest) {
m_pRequest = pRequest;
if (pRequest->m_dwFileAttributes == (-1))
m_rt = RT_NULL;
else if (IsDirectory(pRequest->m_dwFileAttributes))
m_rt = RT_COLLECTION;
else
m_rt = RT_DOCUMENT;
m_Depth = DEPTH_UNKNOWN;
m_ccHostName = 0;
m_fSetStatus = FALSE;
m_fXMLBody = FALSE;
m_nLockTokens = 0;
m_fRetrievedFileAttribs = FALSE;
m_Overwrite = OVERWRITE_YES;
m_dwPropPatchUpdate = 0;
}
~CWebDav() {
;
}
void SetStatus(DWORD dw) {
m_pRequest->m_rs = (RESPONSESTATUS) dw;
m_fSetStatus = TRUE;
}
BOOL SetStatusAndXMLBody(RESPONSESTATUS rs);
BOOL FinalizeMultiStatusResponse(void);
void FinalConsistencyCheck(BOOL fCodeReturnedToWebServer) {
#if defined (DEBUG)
m_bufResp.FinalBufferConsistencyCheck();
// If we're not using multistatus XML response, then nothing
// better have written to the buffer (data isn't flushed in this case).
if (!m_fXMLBody)
DEBUGCHK(m_bufResp.IsEmpty());
// If we return TRUE to HTTPD, then we better be a 2XX status code.
// Similiarly, if we return FALSE we better not be a 2XX status.
DEBUG_CHECK_ERRCODE(fCodeReturnedToWebServer);
#endif
}
// Simple accessors
BOOL IsCollection(void) { return (m_rt==RT_COLLECTION); }
BOOL IsDocument(void) { return (m_rt==RT_DOCUMENT); }
BOOL IsNull(void) { return (m_rt==RT_NULL); }
BOOL HasBody(void) { return (m_pRequest->m_dwContentLength != 0) ; }
// recursive directory helpers
BOOL SendPropertiesVisitFcn(WIN32_FIND_DATA *pFindData, DWORD dwContext, WCHAR *szPhysicalPath, BOOL fRootDir);
BOOL SendPropertyNamesVisitFcn(WIN32_FIND_DATA *pFindData, DWORD dwContext, WCHAR *szTraversalPath, BOOL fRootDir);
BOOL DeleteVisitFcn(WIN32_FIND_DATAW *pFindData, DWORD dwContext, WCHAR *szPath, BOOL fIsRoot);
BOOL MoveCopyVisitFcn(WIN32_FIND_DATAW *pFindData, DWORD dwContext, WCHAR *szPath, BOOL fIsRoot);
// shared mode
// HTTP VERB handeler routines
// These functions return TRUE if they returned everything they needed
// to to client, FALSE if they've set an error code that HandleRequest needs to
// process and send back.
BOOL DavUnsupported(void);
BOOL DavOptions(void);
BOOL DavPut(void);
BOOL DavMove(void);
BOOL DavCopy(void);
BOOL DavDelete(void);
BOOL DavMkcol(void);
BOOL DavPropfind(void);
BOOL DavProppatch(void);
// BOOL DavSearch(void);
BOOL DavLock(void);
BOOL DavUnlock(void);
#if 0
BOOL DavSubscribe(void)
BOOL DavUnsubscribe(void);
BOOL DavPoll(void);
BOOL DavBDelete(void);
BOOL DavBCopy(void);
BOOL DavBMove(void);
BOOL DavBProppatch(void);
BOOL DavBPropfind(void);
BOOL DavX_MS_Enumatts(void);
#endif // 0
//
// Functions to process SAX data of selected nodes. The functions return
// HRESULTs because the value is directly returned to the SAX processor.
//
HRESULT ProcessWin32FileAttribs(SVSSimpleBuffer *pBuf);
BOOL IsFileNameTooLongForFilesys(const WCHAR *szFile) {
return (wcslen(szFile) > (MAX_PATH-1));
}
BOOL IsSrcFileNameLenTooLong(void) {
return IsFileNameTooLongForFilesys(m_pRequest->m_wszPath);
}
BOOL IsFileLocked(const WCHAR *szPath);
// When directory is non-empty, then deleting a file recursively failed, which means
// that it set the error for us.
BOOL SendErrorOnRemoveDirectoryFailure(void) {
return (GetLastError() != ERROR_DIR_NOT_EMPTY);
}
};
//
// Utility functions
//
void GetEndOfFileWithNoSlashes(PSTR *ppszStart, PSTR *ppszSave, CHAR *pcSave);
PSTR SkipHTTPPrefixAndHostName(PSTR szURL);
BOOL IsPathSubDir(WCHAR *szSrc, DWORD ccSrc, WCHAR *szDest, DWORD ccDest);
void GetCurrentFileTime(FILETIME *pft);
void BuildFileName(WCHAR *szWriteBuf, WCHAR *szPath, WCHAR *szFileName);
BOOL SetEmptyTagWin32NS(CXMLBuffer *pBuffer, PCSTR pszElement, DWORD ccElement);
BOOL SetTagWin32NS(CXMLBuffer *pBuffer, PCSTR pszName, DWORD ccName, PCSTR szValue);
//
// DAV constant strings and #defines
//
// DAV XML strings
extern const CHAR cszXMLVersionA[];
extern const DWORD ccXMLVersionA;
extern const CHAR cszMultiStatusNS[];
extern const DWORD ccMultiStatusNS;
extern const CHAR cszMultiStatus[];
extern const DWORD ccMultiStatus;
extern const CHAR cszResponse[];
extern const DWORD ccResponse;
extern const CHAR cszHref[];
extern const DWORD ccHref;
extern const CHAR cszPropstat[];
extern const DWORD ccPropstat;
extern const CHAR cszProp[];
extern const DWORD ccProp;
extern const CHAR cszPropNS[];
extern const DWORD ccPropNS;
extern const CHAR cszStatus[];
extern const DWORD ccStatus;
extern const CHAR cszGetcontentLengthNS[];
extern const DWORD ccGetcontentLengthNS;
extern const CHAR cszGetcontentLength[];
extern const DWORD ccGetcontentLength;
extern const CHAR cszDisplayName[];
extern const DWORD ccDisplayName;
extern const CHAR cszCreationDateNS[];
extern const DWORD ccCreationDateNS;
extern const CHAR cszCreationDate[];
extern const DWORD ccCreationDate;
extern const CHAR cszGetETag[];
extern const DWORD ccGetETag;
extern const CHAR cszLastModifiedNS[];
extern const DWORD ccLastModifiedNS;
extern const CHAR cszLastModified[];
extern const DWORD ccLastModified;
extern const CHAR cszResourceType[];
extern const DWORD ccResourceType;
extern const CHAR cszCollection[];
extern const DWORD ccCollection;
extern const CHAR cszIsHiddenNS[];
extern const DWORD ccIsHiddenNS;
extern const CHAR cszIsHidden[];
extern const DWORD ccIsHidden;
extern const CHAR cszIsCollectionNS[];
extern const DWORD ccIsCollectionNS;
extern const CHAR cszIsCollection[];
extern const DWORD ccIsCollection;
extern const CHAR cszTextXML[];
extern const DWORD ccTextXML;
extern const CHAR cszApplicationXML[];
extern const DWORD ccApplicationXML;
extern const CHAR cszGetcontentType[];
extern const DWORD ccGetcontentType;
extern const CHAR cszSupportedLock[];
extern const DWORD ccSupportedLock;
extern const CHAR cszLockEntry[];
extern const DWORD ccLockEntry;
extern const CHAR cszMSNamespace[];
extern const DWORD ccMSNamespace;
extern const CHAR cszWin32FileAttribs[];
extern const DWORD ccWin32FileAttribs;
extern const CHAR cszWin32LastAccessTime[];
extern const DWORD ccWin32LastAccessTime;
extern const CHAR cszWin32LastModifiedTime[];
extern const DWORD ccWin32LastModifiedTime;
extern const CHAR cszWin32CreationTime[];
extern const DWORD ccWin32CreationTime;
// LOCK XML strings
extern const CHAR cszLockDiscovery[];
extern const DWORD ccLockDiscovery;
extern const CHAR cszActiveLock[];
extern const DWORD ccActiveLock;
extern const CHAR cszLockType[];
extern const DWORD ccLockType;
extern const CHAR cszWrite[];
extern const DWORD ccWrite;
extern const CHAR cszLockScope[];
extern const DWORD ccLockScope;
extern const CHAR cszShared[];
extern const DWORD ccShared;
extern const CHAR cszExclusive[];
extern const DWORD ccExclusive;
extern const CHAR cszLockTokenTag[];
extern const DWORD ccLockTokenTag;
extern const CHAR cszOwner[];
extern const DWORD ccOwner;
extern const CHAR cszTimeoutTag[];
extern const DWORD ccTimeoutTag;
extern const CHAR cszDepthTag[];
extern const DWORD ccDepthTag;
extern const CHAR cszSecond[];
extern const DWORD ccSecond;
extern const CHAR cszInfinite[];
extern const DWORD ccInfinite;
extern const CHAR cszNot[];
extern const DWORD ccNot;
// DAV header data
extern const CHAR csz0[];
extern const DWORD cc0;
extern const CHAR csz1[];
extern const DWORD cc1;
extern const CHAR cszInfinity[];
extern const DWORD ccInfinity;
extern const CHAR csz1NoRoot[];
extern const DWORD cc1NoRoot;
// DAV properties that can be requested on PROPFIND
#define DAV_PROP_CONTENT_LENGTH 0x00000001
#define DAV_PROP_CREATION_DATE 0x00000002
#define DAV_PROP_DISPLAY_NAME 0x00000004
#define DAV_PROP_GET_ETAG 0x00000008
#define DAV_PROP_GET_LAST_MODIFIED 0x00000010
#define DAV_PROP_RESOURCE_TYPE 0x00000020
#define DAV_PROP_SUPPORTED_LOCK 0x00000040
#define DAV_PROP_IS_HIDDEN 0x00000080
#define DAV_PROP_IS_COLLECTION 0x00000100
#define DAV_PROP_LOCK_DISCOVERY 0x00000200
#define DAV_PROP_GET_CONTENT_TYPE 0x00000400
#define DAV_PROP_W32_FILE_ATTRIBUTES 0x00000800
#define DAV_PROP_W32_CREATION_TIME 0x00001000
#define DAV_PROP_W32_LAST_ACCESS_TIME 0x00002000
#define DAV_PROP_W32_LAST_MODIFY_TIME 0x00004000
#define DAV_PROP_ALL 0xFFFFFFFF
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -