summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatúš Kukan <matus.kukan@collabora.com>2014-04-04 10:30:38 +0200
committerMatúš Kukan <matus.kukan@collabora.com>2014-04-04 11:34:46 +0200
commitf20967d686d1be5171f32c6f5e64a554b7adddb7 (patch)
tree505519a6869b487649164f94ddff727b356e844e
parent68bcfe3847a6bc636921d7f85d9fc41f692152ea (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.cxx14
-rw-r--r--ucb/source/ucp/webdav/SerfPutReqProcImpl.hxx5
-rw-r--r--ucb/source/ucp/webdav/SerfRequestProcessor.cxx8
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;