19646dec5SDamjan Jovanovic /************************************************************** 29646dec5SDamjan Jovanovic * 39646dec5SDamjan Jovanovic * Licensed to the Apache Software Foundation (ASF) under one 49646dec5SDamjan Jovanovic * or more contributor license agreements. See the NOTICE file 59646dec5SDamjan Jovanovic * distributed with this work for additional information 69646dec5SDamjan Jovanovic * regarding copyright ownership. The ASF licenses this file 79646dec5SDamjan Jovanovic * to you under the Apache License, Version 2.0 (the 89646dec5SDamjan Jovanovic * "License"); you may not use this file except in compliance 99646dec5SDamjan Jovanovic * with the License. You may obtain a copy of the License at 109646dec5SDamjan Jovanovic * 119646dec5SDamjan Jovanovic * http://www.apache.org/licenses/LICENSE-2.0 129646dec5SDamjan Jovanovic * 139646dec5SDamjan Jovanovic * Unless required by applicable law or agreed to in writing, 149646dec5SDamjan Jovanovic * software distributed under the License is distributed on an 159646dec5SDamjan Jovanovic * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 169646dec5SDamjan Jovanovic * KIND, either express or implied. See the License for the 179646dec5SDamjan Jovanovic * specific language governing permissions and limitations 189646dec5SDamjan Jovanovic * under the License. 199646dec5SDamjan Jovanovic * 209646dec5SDamjan Jovanovic *************************************************************/ 219646dec5SDamjan Jovanovic 229646dec5SDamjan Jovanovic 239646dec5SDamjan Jovanovic 249646dec5SDamjan Jovanovic #ifndef INCLUDED_CURLSESSION_HXX 259646dec5SDamjan Jovanovic #define INCLUDED_CURLSESSION_HXX 269646dec5SDamjan Jovanovic 279646dec5SDamjan Jovanovic #include <vector> 289646dec5SDamjan Jovanovic #include <boost/shared_ptr.hpp> 299646dec5SDamjan Jovanovic #include <osl/mutex.hxx> 309646dec5SDamjan Jovanovic #include <comphelper/componentcontext.hxx> 319646dec5SDamjan Jovanovic #include <comphelper/logging.hxx> 329646dec5SDamjan Jovanovic #include "DAVResource.hxx" 339646dec5SDamjan Jovanovic #include "DAVSession.hxx" 349646dec5SDamjan Jovanovic #include "CurlTypes.hxx" 359646dec5SDamjan Jovanovic #include "CurlRequest.hxx" 369646dec5SDamjan Jovanovic #include "CurlLockStore.hxx" 379646dec5SDamjan Jovanovic #include "CurlUri.hxx" 389646dec5SDamjan Jovanovic #include "CurlInputStream.hxx" 399646dec5SDamjan Jovanovic #include <com/sun/star/lang/XMultiServiceFactory.hpp> 40*0ec0f743SDamjan Jovanovic #include <com/sun/star/security/CertificateContainer.hpp> 41*0ec0f743SDamjan Jovanovic #include <com/sun/star/security/XCertificateContainer.hpp> 42*0ec0f743SDamjan Jovanovic #include <com/sun/star/xml/crypto/XSecurityEnvironment.hpp> 43*0ec0f743SDamjan Jovanovic #include <com/sun/star/xml/crypto/XXMLSecurityContext.hpp> 449646dec5SDamjan Jovanovic #include <curl/curl.h> 459646dec5SDamjan Jovanovic #include <openssl/ssl.h> 469646dec5SDamjan Jovanovic 479646dec5SDamjan Jovanovic namespace ucbhelper { class ProxyDecider; } 489646dec5SDamjan Jovanovic 499646dec5SDamjan Jovanovic namespace http_dav_ucp 509646dec5SDamjan Jovanovic { 519646dec5SDamjan Jovanovic 529646dec5SDamjan Jovanovic // ------------------------------------------------------------------- 539646dec5SDamjan Jovanovic // CurlSession 549646dec5SDamjan Jovanovic // A DAVSession implementation using the Curl library 559646dec5SDamjan Jovanovic // ------------------------------------------------------------------- 569646dec5SDamjan Jovanovic 579646dec5SDamjan Jovanovic class CurlSession : public DAVSession 589646dec5SDamjan Jovanovic { 599646dec5SDamjan Jovanovic private: 609646dec5SDamjan Jovanovic osl::Mutex m_aMutex; 619646dec5SDamjan Jovanovic ::comphelper::ComponentContext m_aContext; 629646dec5SDamjan Jovanovic ::comphelper::EventLogger m_aLogger; 639646dec5SDamjan Jovanovic 649646dec5SDamjan Jovanovic CurlUri m_aUri; 659646dec5SDamjan Jovanovic 669646dec5SDamjan Jovanovic rtl::OUString m_aProxyName; 679646dec5SDamjan Jovanovic sal_Int32 m_nProxyPort; 689646dec5SDamjan Jovanovic // The server, according RFC7231 699646dec5SDamjan Jovanovic // http://tools.ietf.org/html/rfc7231#section-7.4.2 709646dec5SDamjan Jovanovic rtl::OString m_aServerHeaderField; 719646dec5SDamjan Jovanovic 729646dec5SDamjan Jovanovic CURL* m_pCurl; 739646dec5SDamjan Jovanovic bool m_bUseChunkedEncoding; 749646dec5SDamjan Jovanovic bool m_bTransferEncodingSwitched; 759646dec5SDamjan Jovanovic 769646dec5SDamjan Jovanovic const ucbhelper::InternetProxyDecider & m_rProxyDecider; 779646dec5SDamjan Jovanovic 789646dec5SDamjan Jovanovic DAVRequestEnvironment m_aEnv; 799646dec5SDamjan Jovanovic 809646dec5SDamjan Jovanovic static CurlLockStore m_aCurlLockStore; 819646dec5SDamjan Jovanovic 82*0ec0f743SDamjan Jovanovic ::com::sun::star::uno::Reference< ::com::sun::star::security::XCertificateContainer > m_xCertificateContainer; 83*0ec0f743SDamjan Jovanovic ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XXMLSecurityContext > m_xSecurityContext; 84*0ec0f743SDamjan Jovanovic ::com::sun::star::uno::Reference< ::com::sun::star::xml::crypto::XSecurityEnvironment > m_xSecurityEnv; 85*0ec0f743SDamjan Jovanovic 869646dec5SDamjan Jovanovic bool isSSLNeeded(); 879646dec5SDamjan Jovanovic 889646dec5SDamjan Jovanovic 899646dec5SDamjan Jovanovic rtl::OUString composeCurrentUri( const rtl::OUString & inPath ); 909646dec5SDamjan Jovanovic void addEnvironmentRequestHeaders( CurlRequest &curlRequest, 919646dec5SDamjan Jovanovic const DAVRequestEnvironment &env ) 929646dec5SDamjan Jovanovic throw ( DAVException ); 939646dec5SDamjan Jovanovic void processResponse( CurlRequest &curlRequest, 949646dec5SDamjan Jovanovic CURLcode curlCode ) 959646dec5SDamjan Jovanovic throw ( DAVException ); 969646dec5SDamjan Jovanovic 979646dec5SDamjan Jovanovic static CURLcode Curl_SSLContextCallback( CURL *curl, 989646dec5SDamjan Jovanovic void *ssl_ctx, 999646dec5SDamjan Jovanovic void *userptr ); 100*0ec0f743SDamjan Jovanovic static int OPENSSL_VerifyCertificate( X509_STORE_CTX *x509_ctx, void *arg ); 101*0ec0f743SDamjan Jovanovic int verifyServerX509Certificate( X509_STORE_CTX *x509StoreContext ); 1029646dec5SDamjan Jovanovic int verifyCertificateChain ( 1039646dec5SDamjan Jovanovic std::vector< uno::Sequence< sal_Int8 > > &asn1DerCertificates ); 1049646dec5SDamjan Jovanovic 1059646dec5SDamjan Jovanovic static int Curl_DebugCallback( CURL *, 1069646dec5SDamjan Jovanovic curl_infotype type, 1079646dec5SDamjan Jovanovic unsigned char *data, 1089646dec5SDamjan Jovanovic size_t size, 1099646dec5SDamjan Jovanovic void* userdata ); 1109646dec5SDamjan Jovanovic int curlDebugOutput( curl_infotype type, char *data, int size ); 1119646dec5SDamjan Jovanovic 1129646dec5SDamjan Jovanovic static bool Curl_ProvideCredentials( long statusCode, 1139646dec5SDamjan Jovanovic void *userdata ) throw (DAVException); 1149646dec5SDamjan Jovanovic bool provideCredentials( const DAVRequestEnvironment &env, 1159646dec5SDamjan Jovanovic CurlRequest &request, 1169646dec5SDamjan Jovanovic long statusCode ) throw (DAVException); 1179646dec5SDamjan Jovanovic 1189646dec5SDamjan Jovanovic protected: 1199646dec5SDamjan Jovanovic virtual ~CurlSession(); 1209646dec5SDamjan Jovanovic 1219646dec5SDamjan Jovanovic public: 1229646dec5SDamjan Jovanovic CurlSession( const rtl::Reference< DAVSessionFactory > & rSessionFactory, 1239646dec5SDamjan Jovanovic const rtl::OUString& inUri, 1249646dec5SDamjan Jovanovic const ucbhelper::InternetProxyDecider & rProxyDecider ) 1259646dec5SDamjan Jovanovic throw ( DAVException ); 1269646dec5SDamjan Jovanovic 1279646dec5SDamjan Jovanovic // DAVSession methods 1289646dec5SDamjan Jovanovic virtual sal_Bool CanUse( const ::rtl::OUString & inUri ); 1299646dec5SDamjan Jovanovic 1309646dec5SDamjan Jovanovic virtual sal_Bool UsesProxy(); 1319646dec5SDamjan Jovanovic getRequestEnvironment() const1329646dec5SDamjan Jovanovic const DAVRequestEnvironment & getRequestEnvironment() const 1339646dec5SDamjan Jovanovic { return m_aEnv; } 1349646dec5SDamjan Jovanovic 1359646dec5SDamjan Jovanovic // allprop & named 1369646dec5SDamjan Jovanovic virtual void 1379646dec5SDamjan Jovanovic PROPFIND( const ::rtl::OUString & inPath, 1389646dec5SDamjan Jovanovic const Depth inDepth, 1399646dec5SDamjan Jovanovic const std::vector< ::rtl::OUString > & inPropNames, 1409646dec5SDamjan Jovanovic std::vector< DAVResource > & ioResources, 1419646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1429646dec5SDamjan Jovanovic throw ( DAVException ); 1439646dec5SDamjan Jovanovic 1449646dec5SDamjan Jovanovic // propnames 1459646dec5SDamjan Jovanovic virtual void 1469646dec5SDamjan Jovanovic PROPFIND( const ::rtl::OUString & inPath, 1479646dec5SDamjan Jovanovic const Depth inDepth, 1489646dec5SDamjan Jovanovic std::vector< DAVResourceInfo >& ioResInfo, 1499646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1509646dec5SDamjan Jovanovic throw ( DAVException ); 1519646dec5SDamjan Jovanovic 1529646dec5SDamjan Jovanovic virtual void 1539646dec5SDamjan Jovanovic PROPPATCH( const ::rtl::OUString & inPath, 1549646dec5SDamjan Jovanovic const std::vector< ProppatchValue > & inValues, 1559646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1569646dec5SDamjan Jovanovic throw ( DAVException ); 1579646dec5SDamjan Jovanovic 1589646dec5SDamjan Jovanovic virtual void 1599646dec5SDamjan Jovanovic HEAD( const ::rtl::OUString & inPath, 1609646dec5SDamjan Jovanovic const std::vector< ::rtl::OUString > & inHeaderNames, 1619646dec5SDamjan Jovanovic DAVResource & ioResource, 1629646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1639646dec5SDamjan Jovanovic throw ( DAVException ); 1649646dec5SDamjan Jovanovic 1659646dec5SDamjan Jovanovic virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 1669646dec5SDamjan Jovanovic GET( const ::rtl::OUString & inPath, 1679646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1689646dec5SDamjan Jovanovic throw ( DAVException ); 1699646dec5SDamjan Jovanovic 1709646dec5SDamjan Jovanovic virtual void 1719646dec5SDamjan Jovanovic GET( const ::rtl::OUString & inPath, 1729646dec5SDamjan Jovanovic com::sun::star::uno::Reference< 1739646dec5SDamjan Jovanovic com::sun::star::io::XOutputStream > & ioOutputStream, 1749646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1759646dec5SDamjan Jovanovic throw ( DAVException ); 1769646dec5SDamjan Jovanovic 1779646dec5SDamjan Jovanovic virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 1789646dec5SDamjan Jovanovic GET( const ::rtl::OUString & inPath, 1799646dec5SDamjan Jovanovic const std::vector< ::rtl::OUString > & inHeaderNames, 1809646dec5SDamjan Jovanovic DAVResource & ioResource, 1819646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1829646dec5SDamjan Jovanovic throw ( DAVException ); 1839646dec5SDamjan Jovanovic 1849646dec5SDamjan Jovanovic virtual void 1859646dec5SDamjan Jovanovic GET( const ::rtl::OUString & inPath, 1869646dec5SDamjan Jovanovic com::sun::star::uno::Reference< 1879646dec5SDamjan Jovanovic com::sun::star::io::XOutputStream > & ioOutputStream, 1889646dec5SDamjan Jovanovic const std::vector< ::rtl::OUString > & inHeaderNames, 1899646dec5SDamjan Jovanovic DAVResource & ioResource, 1909646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1919646dec5SDamjan Jovanovic throw ( DAVException ); 1929646dec5SDamjan Jovanovic 1939646dec5SDamjan Jovanovic virtual void 1949646dec5SDamjan Jovanovic PUT( const ::rtl::OUString & inPath, 1959646dec5SDamjan Jovanovic const com::sun::star::uno::Reference< 1969646dec5SDamjan Jovanovic com::sun::star::io::XInputStream > & inInputStream, 1979646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 1989646dec5SDamjan Jovanovic throw ( DAVException ); 1999646dec5SDamjan Jovanovic 2009646dec5SDamjan Jovanovic virtual com::sun::star::uno::Reference< com::sun::star::io::XInputStream > 2019646dec5SDamjan Jovanovic POST( const rtl::OUString & inPath, 2029646dec5SDamjan Jovanovic const rtl::OUString & rContentType, 2039646dec5SDamjan Jovanovic const rtl::OUString & rReferer, 2049646dec5SDamjan Jovanovic const com::sun::star::uno::Reference< 2059646dec5SDamjan Jovanovic com::sun::star::io::XInputStream > & inInputStream, 2069646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2079646dec5SDamjan Jovanovic throw ( DAVException ); 2089646dec5SDamjan Jovanovic 2099646dec5SDamjan Jovanovic virtual void 2109646dec5SDamjan Jovanovic POST( const rtl::OUString & inPath, 2119646dec5SDamjan Jovanovic const rtl::OUString & rContentType, 2129646dec5SDamjan Jovanovic const rtl::OUString & rReferer, 2139646dec5SDamjan Jovanovic const com::sun::star::uno::Reference< 2149646dec5SDamjan Jovanovic com::sun::star::io::XInputStream > & inInputStream, 2159646dec5SDamjan Jovanovic com::sun::star::uno::Reference< 2169646dec5SDamjan Jovanovic com::sun::star::io::XOutputStream > & oOutputStream, 2179646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2189646dec5SDamjan Jovanovic throw ( DAVException ); 2199646dec5SDamjan Jovanovic 2209646dec5SDamjan Jovanovic virtual void 2219646dec5SDamjan Jovanovic MKCOL( const ::rtl::OUString & inPath, 2229646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2239646dec5SDamjan Jovanovic throw ( DAVException ); 2249646dec5SDamjan Jovanovic 2259646dec5SDamjan Jovanovic virtual void 2269646dec5SDamjan Jovanovic COPY( const ::rtl::OUString & inSourceURL, 2279646dec5SDamjan Jovanovic const ::rtl::OUString & inDestinationURL, 2289646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv, 2299646dec5SDamjan Jovanovic sal_Bool inOverWrite ) 2309646dec5SDamjan Jovanovic throw ( DAVException ); 2319646dec5SDamjan Jovanovic 2329646dec5SDamjan Jovanovic virtual void 2339646dec5SDamjan Jovanovic MOVE( const ::rtl::OUString & inSourceURL, 2349646dec5SDamjan Jovanovic const ::rtl::OUString & inDestinationURL, 2359646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv, 2369646dec5SDamjan Jovanovic sal_Bool inOverWrite ) 2379646dec5SDamjan Jovanovic throw ( DAVException ); 2389646dec5SDamjan Jovanovic 2399646dec5SDamjan Jovanovic virtual void DESTROY( const ::rtl::OUString & inPath, 2409646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2419646dec5SDamjan Jovanovic throw ( DAVException ); 2429646dec5SDamjan Jovanovic 2439646dec5SDamjan Jovanovic // set new lock. 2449646dec5SDamjan Jovanovic virtual void LOCK( const ::rtl::OUString & inURL, 2459646dec5SDamjan Jovanovic com::sun::star::ucb::Lock & inLock, 2469646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2479646dec5SDamjan Jovanovic throw ( DAVException ); 2489646dec5SDamjan Jovanovic 2499646dec5SDamjan Jovanovic // refresh existing lock. 2509646dec5SDamjan Jovanovic virtual sal_Int64 LOCK( const ::rtl::OUString & inURL, 2519646dec5SDamjan Jovanovic sal_Int64 nTimeout, 2529646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2539646dec5SDamjan Jovanovic throw ( DAVException ); 2549646dec5SDamjan Jovanovic 2559646dec5SDamjan Jovanovic virtual void UNLOCK( const ::rtl::OUString & inURL, 2569646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ) 2579646dec5SDamjan Jovanovic throw ( DAVException ); 2589646dec5SDamjan Jovanovic 2599646dec5SDamjan Jovanovic // helpers 2609646dec5SDamjan Jovanovic virtual void abort() 2619646dec5SDamjan Jovanovic throw ( DAVException ); 2629646dec5SDamjan Jovanovic getHostName() const2639646dec5SDamjan Jovanovic const rtl::OUString & getHostName() const { return m_aUri.GetHost(); } getPort() const2649646dec5SDamjan Jovanovic int getPort() const { return m_aUri.GetPort(); } 2659646dec5SDamjan Jovanovic getMSF()2669646dec5SDamjan Jovanovic const ::uno::Reference< ::lang::XMultiServiceFactory > getMSF() 2679646dec5SDamjan Jovanovic { return m_xFactory->getServiceFactory(); } 2689646dec5SDamjan Jovanovic 2699646dec5SDamjan Jovanovic sal_Bool isDomainMatch( rtl::OUString certHostName ); 2709646dec5SDamjan Jovanovic getServerHeaderField()2719646dec5SDamjan Jovanovic const rtl::OString & getServerHeaderField() { return m_aServerHeaderField; }; 2729646dec5SDamjan Jovanovic 2739646dec5SDamjan Jovanovic private: 2749646dec5SDamjan Jovanovic friend class CurlLockStore; 2759646dec5SDamjan Jovanovic 2769646dec5SDamjan Jovanovic void Init( void ) 2779646dec5SDamjan Jovanovic throw ( DAVException ); 2789646dec5SDamjan Jovanovic 2799646dec5SDamjan Jovanovic void Init( const DAVRequestEnvironment & rEnv ) 2809646dec5SDamjan Jovanovic throw ( DAVException ); 2819646dec5SDamjan Jovanovic 2829646dec5SDamjan Jovanovic const ucbhelper::InternetProxyServer & getProxySettings() const; 2839646dec5SDamjan Jovanovic 2849646dec5SDamjan Jovanovic void propfind( CurlRequest &curlRequest, 2859646dec5SDamjan Jovanovic const rtl::OUString &inPath, 2869646dec5SDamjan Jovanovic const Depth inDepth, 2879646dec5SDamjan Jovanovic const std::vector< ::rtl::OUString > * propNames, 2889646dec5SDamjan Jovanovic const bool onlyPropertyNames, 2899646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ); 2909646dec5SDamjan Jovanovic 2919646dec5SDamjan Jovanovic bool removeExpiredLocktoken( const rtl::OUString & inURL, 2929646dec5SDamjan Jovanovic const DAVRequestEnvironment & rEnv ); 2939646dec5SDamjan Jovanovic 2949646dec5SDamjan Jovanovic // refresh lock, called by CurlLockStore::refreshLocks 2959646dec5SDamjan Jovanovic bool LOCK( CurlLock * pLock, 2969646dec5SDamjan Jovanovic sal_Int32 & rlastChanceToSendRefreshRequest ); 2979646dec5SDamjan Jovanovic 2989646dec5SDamjan Jovanovic // unlock, called by CurlLockStore::~CurlLockStore 2999646dec5SDamjan Jovanovic bool UNLOCK( CurlLock * pLock ); 3009646dec5SDamjan Jovanovic 3019646dec5SDamjan Jovanovic /* 3029646dec5SDamjan Jovanovic // low level GET implementation, used by public GET implementations 3039646dec5SDamjan Jovanovic static int GET( CurlConnection * sess, 3049646dec5SDamjan Jovanovic const char * uri, 3059646dec5SDamjan Jovanovic //ne_block_reader reader, 3069646dec5SDamjan Jovanovic bool getheaders, 3079646dec5SDamjan Jovanovic void * userdata ); 3089646dec5SDamjan Jovanovic 3099646dec5SDamjan Jovanovic // Buffer-based PUT implementation. Serf only has file descriptor- 3109646dec5SDamjan Jovanovic // based API. 3119646dec5SDamjan Jovanovic static int PUT( CurlConnection * sess, 3129646dec5SDamjan Jovanovic const char * uri, 3139646dec5SDamjan Jovanovic const char * buffer, 3149646dec5SDamjan Jovanovic size_t size ); 3159646dec5SDamjan Jovanovic 3169646dec5SDamjan Jovanovic // Buffer-based POST implementation. Serf only has file descriptor- 3179646dec5SDamjan Jovanovic // based API. 3189646dec5SDamjan Jovanovic int POST( CurlConnection * sess, 3199646dec5SDamjan Jovanovic const char * uri, 3209646dec5SDamjan Jovanovic const char * buffer, 3219646dec5SDamjan Jovanovic //ne_block_reader reader, 3229646dec5SDamjan Jovanovic void * userdata, 3239646dec5SDamjan Jovanovic const rtl::OUString & rContentType, 3249646dec5SDamjan Jovanovic const rtl::OUString & rReferer ); 3259646dec5SDamjan Jovanovic */ 3269646dec5SDamjan Jovanovic 3279646dec5SDamjan Jovanovic // Helper: XInputStream -> Sequence< sal_Int8 > 3289646dec5SDamjan Jovanovic static bool getDataFromInputStream( 3299646dec5SDamjan Jovanovic const com::sun::star::uno::Reference< 3309646dec5SDamjan Jovanovic com::sun::star::io::XInputStream > & xStream, 3319646dec5SDamjan Jovanovic com::sun::star::uno::Sequence< sal_Int8 > & rData, 3329646dec5SDamjan Jovanovic bool bAppendTrailingZeroByte ); 3339646dec5SDamjan Jovanovic 3349646dec5SDamjan Jovanovic /* 3359646dec5SDamjan Jovanovic rtl::OUString makeAbsoluteURL( rtl::OUString const & rURL ) const; 3369646dec5SDamjan Jovanovic */ 3379646dec5SDamjan Jovanovic }; 3389646dec5SDamjan Jovanovic 3399646dec5SDamjan Jovanovic } // namespace http_dav_ucp 3409646dec5SDamjan Jovanovic 3419646dec5SDamjan Jovanovic #endif // INCLUDED_CURLSESSION_HXX 342