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