webdav: Allow to save documents again, after locking is implemented.

We need to extend PUT method with lock token in 'If' header, so that it
does not fail on a resource locked by us.

Change-Id: I82a9e3303a34607dba8bb874d1eb0fac23b9f11d
This commit is contained in:
Matúš Kukan
2014-04-04 10:30:38 +02:00
parent d13f1ed261
commit e250a013ba
3 changed files with 18 additions and 4 deletions

View File

@@ -29,10 +29,12 @@ namespace http_dav_ucp
SerfPutReqProcImpl::SerfPutReqProcImpl( const char* inPath, SerfPutReqProcImpl::SerfPutReqProcImpl( const char* inPath,
const DAVRequestHeaders& inRequestHeaders, const DAVRequestHeaders& inRequestHeaders,
const char* inData, const char* inData,
apr_size_t inDataLen ) apr_size_t inDataLen,
const OUString& sToken )
: SerfRequestProcessorImpl( inPath, inRequestHeaders ) : SerfRequestProcessorImpl( inPath, inRequestHeaders )
, mpData( inData ) , mpData( inData )
, mnDataLen( inDataLen ) , mnDataLen( inDataLen )
, msToken( sToken )
{ {
} }
@@ -64,6 +66,11 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
// general header fields provided by caller // general header fields provided by caller
setRequestHeaders( hdrs_bkt ); setRequestHeaders( hdrs_bkt );
// 'If' header with token, so that we can save document locked by us
const OString sIfHeader( "<" + OString(getPathStr()) + "> (<" + OUStringToOString(
msToken, RTL_TEXTENCODING_UTF8) + ">)" );
serf_bucket_headers_set( hdrs_bkt, "If", sIfHeader.getStr() );
return req_bkt; return req_bkt;
} }

View File

@@ -31,7 +31,8 @@ public:
SerfPutReqProcImpl( const char* inPath, SerfPutReqProcImpl( const char* inPath,
const DAVRequestHeaders& inRequestHeaders, const DAVRequestHeaders& inRequestHeaders,
const char* inData, const char* inData,
apr_size_t inDataLen ); apr_size_t inDataLen,
const OUString& sToken );
virtual ~SerfPutReqProcImpl(); virtual ~SerfPutReqProcImpl();
@@ -49,7 +50,7 @@ protected:
private: private:
const char* mpData; const char* mpData;
apr_size_t mnDataLen; apr_size_t mnDataLen;
OUString msToken;
}; };
} // namespace http_dav_ucp } // namespace http_dav_ucp

View File

@@ -203,10 +203,16 @@ bool SerfRequestProcessor::processPut( const char* inData,
apr_size_t inDataLen, apr_size_t inDataLen,
apr_status_t& outSerfStatus ) apr_status_t& outSerfStatus )
{ {
// get the lock from lock store
const OUString sToken(
apr_environment::AprEnv::getAprEnv()->getSerfLockStore()->getLockToken(
OUString::createFromAscii(mPathStr)) );
mpProcImpl = new SerfPutReqProcImpl( mPathStr, mpProcImpl = new SerfPutReqProcImpl( mPathStr,
mrSerfSession.getRequestEnvironment().m_aRequestHeaders, mrSerfSession.getRequestEnvironment().m_aRequestHeaders,
inData, inData,
inDataLen ); inDataLen,
sToken );
outSerfStatus = runProcessor(); outSerfStatus = runProcessor();
return outSerfStatus == APR_SUCCESS; return outSerfStatus == APR_SUCCESS;