diff options
author | Matúš Kukan <matus.kukan@collabora.com> | 2014-04-04 10:30:38 +0200 |
---|---|---|
committer | Matúš Kukan <matus.kukan@collabora.com> | 2014-04-04 11:34:46 +0200 |
commit | f20967d686d1be5171f32c6f5e64a554b7adddb7 (patch) | |
tree | 505519a6869b487649164f94ddff727b356e844e | |
parent | 68bcfe3847a6bc636921d7f85d9fc41f692152ea (diff) |
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.
(cherry picked from commit e250a013bae4b58a9304518aefc6da0dab574103)
Change-Id: I82a9e3303a34607dba8bb874d1eb0fac23b9f11d
-rw-r--r-- | ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx | 14 | ||||
-rw-r--r-- | ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx | 5 | ||||
-rw-r--r-- | ucb/source/ucp/webdav/SerfRequestProcessor.cxx | 8 |
3 files changed, 23 insertions, 4 deletions
diff --git a/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx b/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx index d9f7b91a451e..904fdba72d86 100644 --- a/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx +++ b/ucb/source/ucp/webdav/SerfPutReqProcImpl.cxx @@ -29,10 +29,12 @@ namespace http_dav_ucp SerfPutReqProcImpl::SerfPutReqProcImpl( const char* inPath, const DAVRequestHeaders& inRequestHeaders, const char* inData, - apr_size_t inDataLen ) + apr_size_t inDataLen, + const OUString& sToken ) : SerfRequestProcessorImpl( inPath, inRequestHeaders ) , mpData( inData ) , mnDataLen( inDataLen ) + , msToken( sToken ) { } @@ -59,6 +61,16 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in serf_request_get_alloc( inSerfRequest ) ); handleChunkedEncoding(req_bkt, mnDataLen); + // set request header fields + serf_bucket_t* hdrs_bkt = serf_bucket_request_get_headers( req_bkt ); + // general header fields provided by caller + 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; } diff --git a/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx b/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx index 64474d727358..6367e11f35c2 100644 --- a/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx +++ b/ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx @@ -31,7 +31,8 @@ public: SerfPutReqProcImpl( const char* inPath, const DAVRequestHeaders& inRequestHeaders, const char* inData, - apr_size_t inDataLen ); + apr_size_t inDataLen, + const OUString& sToken ); virtual ~SerfPutReqProcImpl(); @@ -49,7 +50,7 @@ protected: private: const char* mpData; apr_size_t mnDataLen; - + OUString msToken; }; } // namespace http_dav_ucp diff --git a/ucb/source/ucp/webdav/SerfRequestProcessor.cxx b/ucb/source/ucp/webdav/SerfRequestProcessor.cxx index ddeecca45765..c0bda26f683c 100644 --- a/ucb/source/ucp/webdav/SerfRequestProcessor.cxx +++ b/ucb/source/ucp/webdav/SerfRequestProcessor.cxx @@ -203,10 +203,16 @@ bool SerfRequestProcessor::processPut( const char* inData, apr_size_t inDataLen, 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, mrSerfSession.getRequestEnvironment().m_aRequestHeaders, inData, - inDataLen ); + inDataLen, + sToken ); outSerfStatus = runProcessor(); return outSerfStatus == APR_SUCCESS; |