Kaydet (Commit) 64f49389 authored tarafından Oliver-Rainer Wittmann's avatar Oliver-Rainer Wittmann

119036 - adapt serf integration

-- use transfer-encoding 'chunked' on HTTPS
-- switch transfer-encoding between 'chunked' and none on 413 HTTP status code
-- refactoring
-- improve user experience of certification dialog - only shown once
üst 9484953e
......@@ -1158,7 +1158,8 @@ sal_Bool DAVResourceAccess::handleException( DAVException & e, int errorCount )
// if we have a bad connection try again. Up to three times.
case DAVException::DAV_HTTP_ERROR:
// retry up to three times, if not a client-side error.
if ( ( e.getStatus() < 400 || e.getStatus() >= 500 ) &&
if ( ( e.getStatus() < 400 || e.getStatus() >= 500 ||
e.getStatus() == 413 ) &&
errorCount < 3 )
{
return sal_True;
......
......@@ -71,38 +71,15 @@ serf_bucket_t * SerfCopyReqProcImpl::createSerfRequestBucket( serf_request_t * i
return req_bkt;
}
bool SerfCopyReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfCopyReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfCopyReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -39,11 +39,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const char* mDestPathStr;
......
......@@ -56,38 +56,15 @@ serf_bucket_t * SerfDeleteReqProcImpl::createSerfRequestBucket( serf_request_t *
return req_bkt;
}
bool SerfDeleteReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfDeleteReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfDeleteReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -37,11 +37,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
};
......
......@@ -95,6 +95,20 @@ serf_bucket_t * SerfGetReqProcImpl::createSerfRequestBucket( serf_request_t * in
return req_bkt;
}
void SerfGetReqProcImpl::processChunkOfResponseData( const char* data,
apr_size_t len )
{
if ( xInputStream.is() )
{
xInputStream->AddToStream( data, len );
}
else if ( xOutputStream.is() )
{
const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
xOutputStream->writeBytes( aDataSeq );
}
}
namespace
{
apr_status_t Serf_ProcessResponseHeader( void* inUserData,
......@@ -109,62 +123,19 @@ namespace
}
} // end of anonymous namespace
bool SerfGetReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfGetReqProcImpl::handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
if ( len > 0 )
{
if ( xInputStream.is() )
{
xInputStream->AddToStream( data, len );
}
else if ( xOutputStream.is() )
{
const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
xOutputStream->writeBytes( aDataSeq );
}
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
// read response header, if requested
if ( mpHeaderNames != 0 && mpResource != 0 )
{
serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
if ( SerfHeaderBucket != 0 )
{
serf_bucket_headers_do( SerfHeaderBucket,
Serf_ProcessResponseHeader,
this );
}
}
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
// read response header, if requested
if ( mpHeaderNames != 0 && mpResource != 0 )
{
serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
if ( SerfHeaderBucket != 0 )
{
return false;
serf_bucket_headers_do( SerfHeaderBucket,
Serf_ProcessResponseHeader,
this );
}
}
/* NOTREACHED */
return true;
}
void SerfGetReqProcImpl::processSingleResponseHeader( const char* inHeaderName,
......
......@@ -58,14 +58,16 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processSingleResponseHeader( const char* inHeaderName,
const char* inHeaderValue );
protected:
virtual
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
com::sun::star::uno::Reference< SerfInputStream > xInputStream;
com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > xOutputStream;
......
......@@ -60,6 +60,12 @@ serf_bucket_t * SerfHeadReqProcImpl::createSerfRequestBucket( serf_request_t * i
return req_bkt;
}
void SerfHeadReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
// nothing to do
}
namespace
{
apr_status_t Serf_ProcessResponseHeader( void* inUserData,
......@@ -74,51 +80,19 @@ namespace
}
} // end of anonymous namespace
bool SerfHeadReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfHeadReqProcImpl::handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket )
{
const char* data;
apr_size_t len;
serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
while ( SerfHeaderBucket )
// read response header, if requested
if ( mpHeaderNames != 0 && mpResource != 0 )
{
outStatus = serf_bucket_read(SerfHeaderBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
if ( SerfHeaderBucket != 0 )
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
// read response header, if requested
if ( mpHeaderNames != 0 && mpResource != 0 )
{
serf_bucket_t* SerfHeaderBucket = serf_bucket_response_get_headers( inSerfResponseBucket );
if ( SerfHeaderBucket != 0 )
{
serf_bucket_headers_do( SerfHeaderBucket,
Serf_ProcessResponseHeader,
this );
}
}
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
serf_bucket_headers_do( SerfHeaderBucket,
Serf_ProcessResponseHeader,
this );
}
}
return true;
}
void SerfHeadReqProcImpl::processSingleResponseHeader( const char* inHeaderName,
......
......@@ -46,14 +46,16 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processSingleResponseHeader( const char* inHeaderName,
const char* inHeaderValue );
protected:
virtual
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const std::vector< ::rtl::OUString > * mpHeaderNames;
DAVResource* mpResource;
......
......@@ -56,38 +56,15 @@ serf_bucket_t * SerfMkColReqProcImpl::createSerfRequestBucket( serf_request_t *
return req_bkt;
}
bool SerfMkColReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfMkColReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfMkColReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -37,12 +37,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
};
} // namespace http_dav_ucp
......
......@@ -71,38 +71,15 @@ serf_bucket_t * SerfMoveReqProcImpl::createSerfRequestBucket( serf_request_t * i
return req_bkt;
}
bool SerfMoveReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfMoveReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfMoveReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -39,11 +39,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const char* mDestPathStr;
......
......@@ -76,6 +76,10 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i
if ( mpPostData != 0 && mnPostDataLen > 0 )
{
body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpPostData, mnPostDataLen, pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
}
// create serf request
......@@ -94,6 +98,10 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i
// request specific header fields
if ( body_bkt != 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_setn( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
rtl::OUStringToOString( rtl::OUString::valueOf( (sal_Int32)mnPostDataLen ), RTL_TEXTENCODING_UTF8 ) );
}
......@@ -109,51 +117,23 @@ serf_bucket_t * SerfPostReqProcImpl::createSerfRequestBucket( serf_request_t * i
return req_bkt;
}
bool SerfPostReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfPostReqProcImpl::processChunkOfResponseData( const char* data,
apr_size_t len )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
if ( len > 0 )
{
if ( xInputStream.is() )
{
xInputStream->AddToStream( data, len );
}
else if ( xOutputStream.is() )
{
const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
xOutputStream->writeBytes( aDataSeq );
}
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
if ( xInputStream.is() )
{
xInputStream->AddToStream( data, len );
}
else if ( xOutputStream.is() )
{
const uno::Sequence< sal_Int8 > aDataSeq( (sal_Int8 *)data, len );
xOutputStream->writeBytes( aDataSeq );
}
}
/* NOTREACHED */
return true;
void SerfPostReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -52,11 +52,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const char* mpPostData;
......
......@@ -136,6 +136,10 @@ serf_bucket_t * SerfPropFindReqProcImpl::createSerfRequestBucket( serf_request_t
rtl::OUString::createFromAscii( PROPFIND_TRAILER );
body_bkt = SERF_BUCKET_SIMPLE_STRING( rtl::OUStringToOString( aBodyText, RTL_TEXTENCODING_UTF8 ),
pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
}
// create serf request
......@@ -156,6 +160,10 @@ serf_bucket_t * SerfPropFindReqProcImpl::createSerfRequestBucket( serf_request_t
serf_bucket_headers_setn( hdrs_bkt, "Depth", mDepthStr );
if ( body_bkt != 0 && aBodyText.getLength() > 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_setn( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_setn( hdrs_bkt, "Content-Type", "application/xml" );
serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
rtl::OUStringToOString( rtl::OUString::valueOf( aBodyText.getLength() ), RTL_TEXTENCODING_UTF8 ) );
......@@ -164,54 +172,27 @@ serf_bucket_t * SerfPropFindReqProcImpl::createSerfRequestBucket( serf_request_t
return req_bkt;
}
bool SerfPropFindReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfPropFindReqProcImpl::processChunkOfResponseData( const char* data,
apr_size_t len )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 2048, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
if ( len > 0 )
{
xInputStream->AddToStream( data, len );
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
if ( mbOnlyPropertyNames )
{
const std::vector< DAVResourceInfo > rResInfo( parseWebDAVPropNameResponse( xInputStream.get() ) );
*mpResInfo = rResInfo;
}
else
{
const std::vector< DAVResource > rResources( parseWebDAVPropFindResponse( xInputStream.get() ) );
*mpResources = rResources;
}
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
if ( xInputStream.is() )
{
xInputStream->AddToStream( data, len );
}
}
/* NOTREACHED */
return true;
void SerfPropFindReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
if ( mbOnlyPropertyNames )
{
const std::vector< DAVResourceInfo > rResInfo( parseWebDAVPropNameResponse( xInputStream.get() ) );
*mpResInfo = rResInfo;
}
else
{
const std::vector< DAVResource > rResources( parseWebDAVPropFindResponse( xInputStream.get() ) );
*mpResources = rResources;
}
}
} // namespace http_dav_ucp
......@@ -51,11 +51,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
void init( const Depth inDepth );
......
......@@ -134,6 +134,10 @@ serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_
body_bkt = SERF_BUCKET_SIMPLE_STRING( rtl::OUStringToOString( aBodyText, RTL_TEXTENCODING_UTF8 ),
pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
}
}
......@@ -153,6 +157,10 @@ serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_
// request specific header fields
if ( body_bkt != 0 && aBodyText.getLength() > 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_setn( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_setn( hdrs_bkt, "Content-Type", "application/xml" );
serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
rtl::OUStringToOString( rtl::OUString::valueOf( aBodyText.getLength() ), RTL_TEXTENCODING_UTF8 ) );
......@@ -161,38 +169,15 @@ serf_bucket_t * SerfPropPatchReqProcImpl::createSerfRequestBucket( serf_request_
return req_bkt;
}
bool SerfPropPatchReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfPropPatchReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 2048, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfPropPatchReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -41,11 +41,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const std::vector< ProppatchValue > * mpProperties;
......
......@@ -53,6 +53,10 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
if ( mpData != 0 && mnDataLen > 0 )
{
body_bkt = SERF_BUCKET_SIMPLE_STRING_LEN( mpData, mnDataLen, pSerfBucketAlloc );
if ( useChunkedEncoding() )
{
body_bkt = serf_bucket_chunk_create( body_bkt, pSerfBucketAlloc );
}
}
// create serf request
......@@ -71,6 +75,10 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
// request specific header fields
if ( body_bkt != 0 )
{
if ( useChunkedEncoding() )
{
serf_bucket_headers_setn( hdrs_bkt, "Transfer-Encoding", "chunked");
}
serf_bucket_headers_setn( hdrs_bkt, "Content-Length",
rtl::OUStringToOString( rtl::OUString::valueOf( (sal_Int32)mnDataLen ), RTL_TEXTENCODING_UTF8 ) );
}
......@@ -79,38 +87,15 @@ serf_bucket_t * SerfPutReqProcImpl::createSerfRequestBucket( serf_request_t * in
return req_bkt;
}
bool SerfPutReqProcImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
void SerfPutReqProcImpl::processChunkOfResponseData( const char* /*data*/,
apr_size_t /*len*/ )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
// nothing to do;
}
/* NOTREACHED */
return true;
void SerfPutReqProcImpl::handleEndOfResponseData( serf_bucket_t * /*inSerfResponseBucket*/ )
{
// nothing to do;
}
} // namespace http_dav_ucp
......@@ -40,11 +40,12 @@ public:
virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest );
protected:
virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus );
void processChunkOfResponseData( const char* data, apr_size_t len );
virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket );
private:
const char* mpData;
......
......@@ -34,10 +34,14 @@ namespace http_dav_ucp
{
SerfRequestProcessor::SerfRequestProcessor( SerfSession& rSerfSession,
const rtl::OUString & inPath )
const rtl::OUString & inPath,
const bool bUseChunkedEncoding )
: mrSerfSession( rSerfSession )
, mPathStr( 0 )
, mbUseChunkedEncoding( bUseChunkedEncoding )
, mDestPathStr( 0 )
, mContentType( 0 )
, mReferer( 0 )
, mpProcImpl( 0 )
, mbProcessingDone( false )
, mpDAVException()
......@@ -226,7 +230,7 @@ bool SerfRequestProcessor::processPost( const char* inData,
mContentType = apr_pstrdup( mrSerfSession.getAprPool(),
rtl::OUStringToOString( inContentType, RTL_TEXTENCODING_UTF8 ) );
mReferer = apr_pstrdup( mrSerfSession.getAprPool(),
rtl::OUStringToOString( inReferer, RTL_TEXTENCODING_UTF8 ) );
rtl::OUStringToOString( inReferer, RTL_TEXTENCODING_UTF8 ) );
mpProcImpl = createPostReqProcImpl( mPathStr,
inData,
inDataLen,
......@@ -290,6 +294,12 @@ apr_status_t SerfRequestProcessor::runProcessor()
{
prepareProcessor();
// activate chunked encoding, if requested
if ( mbUseChunkedEncoding )
{
mpProcImpl->activateChunkedEncoding();
}
// create serf request
serf_connection_request_create( mrSerfSession.getSerfConnection(),
Serf_SetupRequest,
......
......@@ -45,7 +45,8 @@ class SerfRequestProcessor
{
public:
SerfRequestProcessor( SerfSession& rSerfSession,
const rtl::OUString & inPath );
const rtl::OUString & inPath,
const bool bUseChunkedEncoding );
~SerfRequestProcessor();
// PROPFIND - allprop & named
......@@ -156,6 +157,7 @@ public:
SerfSession& mrSerfSession;
const char* mPathStr;
const bool mbUseChunkedEncoding;
const char* mDestPathStr;
const char* mContentType;
const char* mReferer;
......
......@@ -26,6 +26,7 @@ namespace http_dav_ucp
SerfRequestProcessorImpl::SerfRequestProcessorImpl( const char* inPath )
: mPathStr( inPath )
, mbUseChunkedEncoding( false )
{
}
......@@ -38,5 +39,55 @@ const char* SerfRequestProcessorImpl::getPathStr() const
return mPathStr;
}
void SerfRequestProcessorImpl::activateChunkedEncoding()
{
mbUseChunkedEncoding = true;
}
const bool SerfRequestProcessorImpl::useChunkedEncoding() const
{
return mbUseChunkedEncoding;
}
bool SerfRequestProcessorImpl::processSerfResponseBucket( serf_request_t * /*inSerfRequest*/,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * /*inAprPool*/,
apr_status_t & outStatus )
{
const char* data;
apr_size_t len;
while (1) {
outStatus = serf_bucket_read(inSerfResponseBucket, 8096, &data, &len);
if (SERF_BUCKET_READ_ERROR(outStatus))
{
return true;
}
if ( len > 0 )
{
processChunkOfResponseData( data, len );
}
/* are we done yet? */
if (APR_STATUS_IS_EOF(outStatus))
{
handleEndOfResponseData( inSerfResponseBucket );
outStatus = APR_EOF;
return true;
}
/* have we drained the response so far? */
if ( APR_STATUS_IS_EAGAIN( outStatus ) )
{
return false;
}
}
/* NOTREACHED */
return true;
}
} // namespace http_dav_ucp
......@@ -39,18 +39,26 @@ public:
/*pure*/ virtual
serf_bucket_t * createSerfRequestBucket( serf_request_t * inSerfRequest ) = 0;
/*pure*/ virtual
bool processSerfResponseBucket( serf_request_t * inSerfRequest,
serf_bucket_t * inSerfResponseBucket,
apr_pool_t * inAprPool,
apr_status_t & outStatus ) = 0;
apr_status_t & outStatus );
void activateChunkedEncoding();
protected:
/*pure*/ virtual
void processChunkOfResponseData( const char* data, apr_size_t len ) = 0;
/*pure*/ virtual
void handleEndOfResponseData( serf_bucket_t * inSerfResponseBucket ) = 0;
const char* getPathStr() const;
const bool useChunkedEncoding() const;
private:
const char* mPathStr;
bool mbUseChunkedEncoding;
};
} // namespace http_dav_ucp
......
......@@ -25,9 +25,10 @@
#define INCLUDED_SERFSESSION_HXX
#include <vector>
#include <boost/shared_ptr.hpp>
#include <osl/mutex.hxx>
#include "DAVSession.hxx"
#include "SerfTypes.hxx"
#include <DAVSession.hxx>
#include <SerfTypes.hxx>
//#include "SerfLockStore.hxx"
#include <SerfUri.hxx>
#include <com/sun/star/lang/XMultiServiceFactory.hpp>
......@@ -58,18 +59,20 @@ private:
serf_context_t* m_pSerfContext;
serf_bucket_alloc_t* m_pSerfBucket_Alloc;
bool m_bIsHeadRequestInProgress;
bool m_bUseChunkedEncoding;
sal_Int16 m_bNoOfTransferEncodingSwitches;
const ucbhelper::InternetProxyDecider & m_rProxyDecider;
DAVRequestEnvironment m_aEnv;
static bool m_bGlobalsInited;
static osl::Mutex m_aGlobalMutex;
// static SerfLockStore m_aSerfLockStore;
char* getHostinfo();
bool isSSLNeeded();
SerfRequestProcessor* createReqProc( const rtl::OUString & inPath );
protected:
virtual ~SerfSession();
......@@ -264,9 +267,7 @@ private:
void Init( const DAVRequestEnvironment & rEnv )
throw ( DAVException );
void HandleError( SerfRequestProcessor& rReqProc,
const rtl::OUString & inPath,
const DAVRequestEnvironment & rEnv )
void HandleError( boost::shared_ptr<SerfRequestProcessor> rReqProc )
throw ( DAVException );
const ucbhelper::InternetProxyServer & getProxySettings() const;
......
......@@ -325,7 +325,7 @@ handleCertificateValidationRequest_(
SSLWARN_TYPE_DOMAINMISMATCH,
rRequest.HostName );
}
else
if ( (((failures & security::CertificateValidity::TIME_INVALID)
== security::CertificateValidity::TIME_INVALID) ||
((failures & security::CertificateValidity::NOT_TIME_NESTED)
......@@ -338,7 +338,7 @@ handleCertificateValidationRequest_(
SSLWARN_TYPE_EXPIRED,
rRequest.HostName );
}
else
if ( (((failures & security::CertificateValidity::REVOKED)
== security::CertificateValidity::REVOKED) ||
((failures & security::CertificateValidity::SIGNATURE_INVALID)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment