blob: 1a325957fea5261e65f49ee6d3fffa65adcb0c04 [file]
/**************************************************************
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*************************************************************/
#ifndef INCLUDED_CURLREQUEST_HXX
#define INCLUDED_CURLREQUEST_HXX
#include <vector>
#include "DAVException.hxx"
#include <com/sun/star/io/XOutputStream.hpp>
#include "CurlInputStream.hxx"
#include "CurlTypes.hxx"
#include "CurlUri.hxx"
#include <curl/curl.h>
namespace http_dav_ucp
{
/* Since Curl persists all settings for the duration of
* the CURL* structure, and we need some of them to only last for
* the duration of a request, use this class to reset the short-lived
* settings at the end of each request using RAII, and to capture
* some results in a convenient format.
*
* Features are opt-in to their non-default values.
*
* External pointers (CURL*, request body, etc.) are only shared with us,
* never copied, temporarily used by us, and never belong to us.
*/
class CurlRequest
{
public:
class Header
{
public:
rtl::OString name;
rtl::OString value;
};
CurlRequest( CURL *curl );
~CurlRequest();
// Request setup methods:
void addHeader( const rtl::OString &name, const rtl::OString &value ) throw (DAVException);
void setRequestBody( const char *body, size_t size );
bool isChunkedEncoding() { return useChunkedEncoding; }
void setChunkedEncoding( bool isChunkedEncoding ) { useChunkedEncoding = isChunkedEncoding; }
void saveResponseBodyTo( const com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > & xOutputStream );
void setProvideCredentialsCallback(
bool (*provideCredsCallback)(long statusCode, void *userdata) throw (DAVException),
void *credsUserdata );
// Requests
CURLcode copy( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode delete_( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode get( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode head( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode lock( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode mkcol( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode move( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode post( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode propfind( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode proppatch( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode put( CurlUri uri, rtl::OUString path ) throw(DAVException);
CURLcode unlock( CurlUri uri, rtl::OUString path ) throw(DAVException);
// Response methods:
int getStatusCode() { return statusCode; }
rtl::OString& getReasonPhrase() { return reasonPhrase; }
// TODO: a multimap would be O(n * log(m)) instead of O(n * m)
std::vector<Header>& getResponseHeaders() { return responseHeaders; }
const Header *findResponseHeader( const rtl::OString &name );
com::sun::star::uno::Reference < CurlInputStream > getResponseBody() { return responseBodyInputStream; }
private:
CurlRequest( const CurlRequest &curlRequest ); // No copy constructor.
void setURI( CurlUri uri, rtl::OUString path ) throw (DAVException);
CURLcode perform() throw (DAVException);
static int Curl_SeekCallback(void *userp, curl_off_t offset, int origin);
static size_t Curl_SendMoreBody( char *buffer, size_t size, size_t nitems, void *userdata );
size_t curlSendMoreBody( char *buffer, size_t len );
static size_t Curl_HeaderReceived( char *buffer, size_t size, size_t nitems, void *userdata );
void curlHeaderReceived( const char *buffer, size_t len );
static size_t Curl_MoreBodyReceived( char *buffer, size_t size, size_t nitems, void *userdata );
void curlMoreBodyReceived( const char *buffer, size_t len );
CURL *curl;
CURLU *curlUrl;
// Request values:
curl_slist *requestHeaders;
const char *requestBody;
size_t requestBodyOffset;
size_t requestBodySize;
bool useChunkedEncoding;
bool (*provideCredentialsCallback)( long statusCode, void *userdata ) throw (DAVException);
void *provideCredentialsUserdata;
// Response values:
rtl::OString reasonPhrase;
int statusCode;
std::vector<Header> responseHeaders;
com::sun::star::uno::Reference < CurlInputStream > responseBodyInputStream;
com::sun::star::uno::Reference< com::sun::star::io::XOutputStream > xOutputStream;
};
} // namespace http_dav_ucp
#endif // INCLUDED_CURLREQUEST_HXX