serf.h | serf.h | |||
---|---|---|---|---|
skipping to change at line 30 | skipping to change at line 30 | |||
* @file serf.h | * @file serf.h | |||
* @brief Main serf header file | * @brief Main serf header file | |||
*/ | */ | |||
#include <apr.h> | #include <apr.h> | |||
#include <apr_errno.h> | #include <apr_errno.h> | |||
#include <apr_allocator.h> | #include <apr_allocator.h> | |||
#include <apr_pools.h> | #include <apr_pools.h> | |||
#include <apr_network_io.h> | #include <apr_network_io.h> | |||
#include <apr_time.h> | #include <apr_time.h> | |||
#include <apr_poll.h> | ||||
#include <apr_uri.h> | ||||
#include "serf_declare.h" | #include "serf_declare.h" | |||
#ifdef __cplusplus | #ifdef __cplusplus | |||
extern "C" { | extern "C" { | |||
#endif | #endif | |||
/* Forward declare some structures */ | /* Forward declare some structures */ | |||
typedef struct serf_context_t serf_context_t; | typedef struct serf_context_t serf_context_t; | |||
skipping to change at line 79 | skipping to change at line 81 | |||
/** | /** | |||
* Create a new context for serf operations. | * Create a new context for serf operations. | |||
* | * | |||
* A serf context defines a control loop which processes multiple | * A serf context defines a control loop which processes multiple | |||
* connections simultaneously. | * connections simultaneously. | |||
* | * | |||
* The context will be allocated within @a pool. | * The context will be allocated within @a pool. | |||
*/ | */ | |||
SERF_DECLARE(serf_context_t *) serf_context_create(apr_pool_t *pool); | SERF_DECLARE(serf_context_t *) serf_context_create(apr_pool_t *pool); | |||
/** | ||||
* Callback function. Add a socket to the externally managed poll set. | ||||
* | ||||
* Both @a pfd and @a serf_baton should be used when calling serf_event_tri | ||||
gger | ||||
* later. | ||||
*/ | ||||
typedef apr_status_t (*serf_socket_add_t)(void *user_baton, | ||||
apr_pollfd_t *pfd, | ||||
void *serf_baton); | ||||
/** | ||||
* Callback function. Remove the socket, identified by both @a pfd and | ||||
* @a serf_baton from the externally managed poll set. | ||||
*/ | ||||
typedef apr_status_t (*serf_socket_remove_t)(void *user_baton, | ||||
apr_pollfd_t *pfd, | ||||
void *serf_baton); | ||||
/* Create a new context for serf operations. | ||||
* | ||||
* Use this function to make serf not use its internal control loop, but | ||||
* instead rely on an external event loop. Serf will use the @a addf and @a | ||||
rmf | ||||
* callbacks to notify of any event on a connection. The @a user_baton will | ||||
be | ||||
* passed through the addf and rmf callbacks. | ||||
* | ||||
* The context will be allocated within @a pool. | ||||
*/ | ||||
SERF_DECLARE(serf_context_t *) serf_context_create_ex(void *user_baton, | ||||
serf_socket_add_t add | ||||
f, | ||||
serf_socket_remove_t | ||||
rmf, | ||||
apr_pool_t *pool); | ||||
/** | ||||
* Make serf process events on a connection, identified by both @a pfd and | ||||
* @a serf_baton. | ||||
* | ||||
* Any outbound data is delivered, and incoming data is made available to | ||||
* the associated response handlers and their buckets. | ||||
* | ||||
* If any data is processed (incoming or outgoing), then this function will | ||||
* return with APR_SUCCESS. | ||||
*/ | ||||
SERF_DECLARE(apr_status_t) serf_event_trigger(serf_context_t *s, | ||||
void *serf_baton, | ||||
const apr_pollfd_t *pfd); | ||||
/** @see serf_context_run should not block at all. */ | /** @see serf_context_run should not block at all. */ | |||
#define SERF_DURATION_NOBLOCK 0 | #define SERF_DURATION_NOBLOCK 0 | |||
/** @see serf_context_run should run for (nearly) "forever". */ | /** @see serf_context_run should run for (nearly) "forever". */ | |||
#define SERF_DURATION_FOREVER 2000000000 /* approx 1^31 */ | #define SERF_DURATION_FOREVER 2000000000 /* approx 1^31 */ | |||
/** | /** | |||
* Run the main networking control loop. | * Run the main networking control loop. | |||
* | * | |||
* The set of connections defined by the serf context @a ctx are processed. | * The set of connections defined by the serf context @a ctx are processed. | |||
* Any outbound data is delivered, and incoming data is made available to | * Any outbound data is delivered, and incoming data is made available to | |||
skipping to change at line 105 | skipping to change at line 152 | |||
* | * | |||
* If no activity occurs within the specified timeout duration, then | * If no activity occurs within the specified timeout duration, then | |||
* APR_TIMEUP is returned. | * APR_TIMEUP is returned. | |||
* | * | |||
* All temporary allocations will be made in @a pool. | * All temporary allocations will be made in @a pool. | |||
*/ | */ | |||
SERF_DECLARE(apr_status_t) serf_context_run(serf_context_t *ctx, | SERF_DECLARE(apr_status_t) serf_context_run(serf_context_t *ctx, | |||
apr_short_interval_time_t durat ion, | apr_short_interval_time_t durat ion, | |||
apr_pool_t *pool); | apr_pool_t *pool); | |||
SERF_DECLARE(apr_status_t) serf_context_prerun(serf_context_t *ctx); | ||||
/** | ||||
* Callback function for progress information. @a progress indicates cumula | ||||
tive | ||||
* number of bytes read or written, for the whole context. | ||||
*/ | ||||
typedef void (*serf_progress_t)(void *progress_baton, | ||||
apr_off_t read, | ||||
apr_off_t write); | ||||
/** | ||||
* Sets the progress callback function. @a progress_func will be called eve | ||||
ry | ||||
* time bytes are read of or written on a socket. | ||||
*/ | ||||
SERF_DECLARE(void) serf_context_set_progress_cb( | ||||
serf_context_t *ctx, | ||||
const serf_progress_t progress_func, | ||||
void *progress_baton); | ||||
/** @} */ | /** @} */ | |||
/** | /** | |||
* @defgroup serf connections and requests | * @defgroup serf connections and requests | |||
* @ingroup serf | * @ingroup serf | |||
* @{ | * @{ | |||
*/ | */ | |||
/** | /** | |||
* When a connection is established, the application needs to wrap some | * When a connection is established, the application needs to wrap some | |||
skipping to change at line 256 | skipping to change at line 322 | |||
SERF_DECLARE(serf_connection_t *) serf_connection_create( | SERF_DECLARE(serf_connection_t *) serf_connection_create( | |||
serf_context_t *ctx, | serf_context_t *ctx, | |||
apr_sockaddr_t *address, | apr_sockaddr_t *address, | |||
serf_connection_setup_t setup, | serf_connection_setup_t setup, | |||
void *setup_baton, | void *setup_baton, | |||
serf_connection_closed_t closed, | serf_connection_closed_t closed, | |||
void *closed_baton, | void *closed_baton, | |||
apr_pool_t *pool); | apr_pool_t *pool); | |||
/** | /** | |||
* Create a new connection associated with the @a ctx serf context. | ||||
* | ||||
* A connection will be created to (eventually) connect to the address | ||||
* specified by @a address. The address must live at least as long as | ||||
* @a pool (thus, as long as the connection object). | ||||
* | ||||
* The host address will be looked up based on the hostname in @a host_info | ||||
. | ||||
* | ||||
* The connection object will be allocated within @a pool. Clearing or | ||||
* destroying this pool will close the connection, and terminate any | ||||
* outstanding requests or responses. | ||||
* | ||||
* When the connection is closed (upon request or because of an error), | ||||
* then the @a closed callback is invoked, and @a closed_baton is passed. | ||||
* | ||||
* ### doc on setup(_baton). tweak below comment re: acceptor. | ||||
* NULL may be passed for @a acceptor and @a closed; default implementation | ||||
s | ||||
* will be used. | ||||
* | ||||
* Note: the connection is not made immediately. It will be opened on | ||||
* the next call to @see serf_context_run. | ||||
*/ | ||||
SERF_DECLARE(apr_status_t) serf_connection_create2( | ||||
serf_connection_t **conn, | ||||
serf_context_t *ctx, | ||||
apr_uri_t host_info, | ||||
serf_connection_setup_t setup, | ||||
void *setup_baton, | ||||
serf_connection_closed_t closed, | ||||
void *closed_baton, | ||||
apr_pool_t *pool); | ||||
/** | ||||
* Reset the connection, but re-open the socket again. | * Reset the connection, but re-open the socket again. | |||
*/ | */ | |||
SERF_DECLARE(apr_status_t) serf_connection_reset( | SERF_DECLARE(apr_status_t) serf_connection_reset( | |||
serf_connection_t *conn); | serf_connection_t *conn); | |||
/** | /** | |||
* Close the connection associated with @a conn and cancel all pending requ ests. | * Close the connection associated with @a conn and cancel all pending requ ests. | |||
* | * | |||
* The closed callback passed to serf_connection_create() will be invoked | * The closed callback passed to serf_connection_create() will be invoked | |||
* with APR_SUCCESS. | * with APR_SUCCESS. | |||
*/ | */ | |||
SERF_DECLARE(apr_status_t) serf_connection_close( | SERF_DECLARE(apr_status_t) serf_connection_close( | |||
serf_connection_t *conn); | serf_connection_t *conn); | |||
/** | /** | |||
* Sets the maximum number of outstanding requests @a max_requests on the | ||||
* connection @a conn. Setting max_requests to 0 means unlimited (the defau | ||||
lt). | ||||
* Ex.: setting max_requests to 1 means a request is sent when a response o | ||||
n the | ||||
* previous request was received and handled. | ||||
*/ | ||||
SERF_DECLARE(void) | ||||
serf_connection_set_max_outstanding_requests(serf_connection_t *conn, | ||||
unsigned int max_requests); | ||||
/** | ||||
* Setup the @a request for delivery on its connection. | * Setup the @a request for delivery on its connection. | |||
* | * | |||
* Right before this is invoked, @a pool will be built within the | * Right before this is invoked, @a pool will be built within the | |||
* connection's pool for the request to use. The associated response will | * connection's pool for the request to use. The associated response will | |||
* be allocated within that subpool. An associated bucket allocator will | * be allocated within that subpool. An associated bucket allocator will | |||
* be built. These items may be fetched from the request object through | * be built. These items may be fetched from the request object through | |||
* @see serf_request_get_pool or @see serf_request_get_alloc. | * @see serf_request_get_pool or @see serf_request_get_alloc. | |||
* | * | |||
* The content of the request is specified by the @a req_bkt bucket. When | * The content of the request is specified by the @a req_bkt bucket. When | |||
* a response arrives, the @a acceptor callback will be invoked (along with | * a response arrives, the @a acceptor callback will be invoked (along with | |||
skipping to change at line 315 | skipping to change at line 424 | |||
* | * | |||
* Invoking any calls other than @see serf_request_cancel before the setup | * Invoking any calls other than @see serf_request_cancel before the setup | |||
* callback executes is not supported. | * callback executes is not supported. | |||
*/ | */ | |||
SERF_DECLARE(serf_request_t *) serf_connection_request_create( | SERF_DECLARE(serf_request_t *) serf_connection_request_create( | |||
serf_connection_t *conn, | serf_connection_t *conn, | |||
serf_request_setup_t setup, | serf_request_setup_t setup, | |||
void *setup_baton); | void *setup_baton); | |||
/** | /** | |||
* Construct a request object for the @a conn connection, add it in the | ||||
* list as the next to-be-written request before all unwritten requests. | ||||
* | ||||
* When it is time to deliver the request, the @a setup callback will | ||||
* be invoked with the @a setup_baton passed into it to complete the | ||||
* construction of the request object. | ||||
* | ||||
* If the request has not (yet) been delivered, then it may be canceled | ||||
* with @see serf_request_cancel. | ||||
* | ||||
* Invoking any calls other than @see serf_request_cancel before the setup | ||||
* callback executes is not supported. | ||||
*/ | ||||
SERF_DECLARE(serf_request_t *) serf_connection_priority_request_create( | ||||
serf_connection_t *conn, | ||||
serf_request_setup_t setup, | ||||
void *setup_baton); | ||||
/** | ||||
* Cancel the request specified by the @a request object. | * Cancel the request specified by the @a request object. | |||
* | * | |||
* If the request has been scheduled for delivery, then its response | * If the request has been scheduled for delivery, then its response | |||
* handler will be run, passing NULL for the response bucket. | * handler will be run, passing NULL for the response bucket. | |||
* | * | |||
* If the request has already been (partially or fully) delivered, then | * If the request has already been (partially or fully) delivered, then | |||
* APR_EBUSY is returned and the request is *NOT* canceled. To properly | * APR_EBUSY is returned and the request is *NOT* canceled. To properly | |||
* cancel the request, the connection must be closed (by clearing or | * cancel the request, the connection must be closed (by clearing or | |||
* destroying its associated pool). | * destroying its associated pool). | |||
*/ | */ | |||
skipping to change at line 360 | skipping to change at line 488 | |||
* Update the @a handler and @a handler_baton for this @a request. | * Update the @a handler and @a handler_baton for this @a request. | |||
* | * | |||
* This can be called after the request has started processing - | * This can be called after the request has started processing - | |||
* subsequent data will be delivered to this new handler. | * subsequent data will be delivered to this new handler. | |||
*/ | */ | |||
SERF_DECLARE(void) serf_request_set_handler( | SERF_DECLARE(void) serf_request_set_handler( | |||
serf_request_t *request, | serf_request_t *request, | |||
const serf_response_handler_t handler, | const serf_response_handler_t handler, | |||
const void **handler_baton); | const void **handler_baton); | |||
/** | ||||
* Configure proxy server settings, to be used by all connections associate | ||||
d | ||||
* with the @a ctx serf context. | ||||
* | ||||
* The next connection will be created to connect to the proxy server | ||||
* specified by @a address. The address must live at least as long as the | ||||
* serf context. | ||||
*/ | ||||
SERF_DECLARE(void) serf_config_proxy( | ||||
serf_context_t *ctx, | ||||
apr_sockaddr_t *address); | ||||
/* ### maybe some connection control functions for flood? */ | /* ### maybe some connection control functions for flood? */ | |||
/*** Special bucket creation functions ***/ | ||||
/** | ||||
* Create a bucket of type 'socket bucket'. | ||||
* This is basically a wrapper around @a serf_bucket_socket_create, which | ||||
* initializes the bucket using connection and/or context specific settings | ||||
. | ||||
*/ | ||||
SERF_DECLARE(serf_bucket_t *) serf_context_bucket_socket_create( | ||||
serf_context_t *ctx, | ||||
apr_socket_t *skt, | ||||
serf_bucket_alloc_t *allocator); | ||||
/** | ||||
* Create a bucket of type 'request bucket'. | ||||
* This is basically a wrapper around @a serf_bucket_request_create, which | ||||
* initializes the bucket using request, connection and/or context specific | ||||
* settings. | ||||
* | ||||
* If the host_url and/or user_agent options are set on the connection, | ||||
* headers 'Host' and/or 'User-Agent' will be set on the request message. | ||||
*/ | ||||
SERF_DECLARE(serf_bucket_t *) serf_request_bucket_request_create( | ||||
serf_request_t *request, | ||||
const char *method, | ||||
const char *uri, | ||||
serf_bucket_t *body, | ||||
serf_bucket_alloc_t *allocator); | ||||
/** @} */ | /** @} */ | |||
/** | /** | |||
* @defgroup serf buckets | * @defgroup serf buckets | |||
* @ingroup serf | * @ingroup serf | |||
* @{ | * @{ | |||
*/ | */ | |||
/** Pass as REQUESTED to the read function of a bucket to read, consume, | /** Pass as REQUESTED to the read function of a bucket to read, consume, | |||
* and return all available data. | * and return all available data. | |||
skipping to change at line 710 | skipping to change at line 878 | |||
SERF_DECLARE(apr_status_t) serf_debug__record_read( | SERF_DECLARE(apr_status_t) serf_debug__record_read( | |||
const serf_bucket_t *bucket, | const serf_bucket_t *bucket, | |||
apr_status_t status); | apr_status_t status); | |||
SERF_DECLARE(void) serf_debug__entered_loop(serf_bucket_alloc_t *allocator) ; | SERF_DECLARE(void) serf_debug__entered_loop(serf_bucket_alloc_t *allocator) ; | |||
SERF_DECLARE(void) serf_debug__closed_conn(serf_bucket_alloc_t *allocator); | SERF_DECLARE(void) serf_debug__closed_conn(serf_bucket_alloc_t *allocator); | |||
SERF_DECLARE(void) serf_debug__bucket_destroy(const serf_bucket_t *bucket); | SERF_DECLARE(void) serf_debug__bucket_destroy(const serf_bucket_t *bucket); | |||
SERF_DECLARE(void) serf_debug__bucket_alloc_check(serf_bucket_alloc_t *allo cator); | SERF_DECLARE(void) serf_debug__bucket_alloc_check(serf_bucket_alloc_t *allo cator); | |||
/* Version info */ | /* Version info */ | |||
#define SERF_MAJOR_VERSION 0 | #define SERF_MAJOR_VERSION 0 | |||
#define SERF_MINOR_VERSION 1 | #define SERF_MINOR_VERSION 2 | |||
#define SERF_PATCH_VERSION 2 | #define SERF_PATCH_VERSION 0 | |||
/* Version number string */ | ||||
#define SERF_VERSION_STRING APR_STRINGIFY(SERF_MAJOR_VERSION) "." \ | ||||
APR_STRINGIFY(SERF_MINOR_VERSION) "." \ | ||||
APR_STRINGIFY(SERF_PATCH_VERSION) | ||||
/** | /** | |||
* Check at compile time if the Serf version is at least a certain | * Check at compile time if the Serf version is at least a certain | |||
* level. | * level. | |||
* @param major The major version component of the version checked | * @param major The major version component of the version checked | |||
* for (e.g., the "1" of "1.3.0"). | * for (e.g., the "1" of "1.3.0"). | |||
* @param minor The minor version component of the version checked | * @param minor The minor version component of the version checked | |||
* for (e.g., the "3" of "1.3.0"). | * for (e.g., the "3" of "1.3.0"). | |||
* @param patch The patch level component of the version checked | * @param patch The patch level component of the version checked | |||
* for (e.g., the "0" of "1.3.0"). | * for (e.g., the "0" of "1.3.0"). | |||
End of changes. 9 change blocks. | ||||
2 lines changed or deleted | 188 lines changed or added | |||
serf_bucket_types.h | serf_bucket_types.h | |||
---|---|---|---|---|
skipping to change at line 20 | skipping to change at line 20 | |||
* distributed under the License is distributed on an "AS IS" BASIS, | * distributed under the License is distributed on an "AS IS" BASIS, | |||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||
* See the License for the specific language governing permissions and | * See the License for the specific language governing permissions and | |||
* limitations under the License. | * limitations under the License. | |||
*/ | */ | |||
#ifndef SERF_BUCKET_TYPES_H | #ifndef SERF_BUCKET_TYPES_H | |||
#define SERF_BUCKET_TYPES_H | #define SERF_BUCKET_TYPES_H | |||
#include <apr_mmap.h> | #include <apr_mmap.h> | |||
#include <apr_hash.h> | ||||
/* this header and serf.h refer to each other, so take a little extra care */ | /* this header and serf.h refer to each other, so take a little extra care */ | |||
#ifndef SERF_H | #ifndef SERF_H | |||
#include "serf.h" | #include "serf.h" | |||
#endif | #endif | |||
#include "serf_declare.h" | #include "serf_declare.h" | |||
/** | /** | |||
* @file serf_bucket_types.h | * @file serf_bucket_types.h | |||
skipping to change at line 57 | skipping to change at line 58 | |||
serf_bucket_alloc_t *allocator); | serf_bucket_alloc_t *allocator); | |||
SERF_DECLARE(serf_bucket_t *) serf_bucket_request_get_headers( | SERF_DECLARE(serf_bucket_t *) serf_bucket_request_get_headers( | |||
serf_bucket_t *request); | serf_bucket_t *request); | |||
SERF_DECLARE(void) serf_bucket_request_become(serf_bucket_t *bucket, | SERF_DECLARE(void) serf_bucket_request_become(serf_bucket_t *bucket, | |||
const char *method, | const char *method, | |||
const char *uri, | const char *uri, | |||
serf_bucket_t *body); | serf_bucket_t *body); | |||
/** | ||||
* Sets the root url of the remote host. If this request contains a relativ | ||||
e | ||||
* url, it will be prefixed with the root url to form an absolute url. | ||||
* @a bucket is the request bucket. @a root_url is the absolute url of the | ||||
* root of the remote host, without the closing '/'. | ||||
*/ | ||||
SERF_DECLARE(void) serf_bucket_request_set_root(serf_bucket_t *bucket, | ||||
const char *root_url); | ||||
/* ==================================================================== */ | /* ==================================================================== */ | |||
SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_response ; | SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_response ; | |||
#define SERF_BUCKET_IS_RESPONSE(b) SERF_BUCKET_CHECK((b), response) | #define SERF_BUCKET_IS_RESPONSE(b) SERF_BUCKET_CHECK((b), response) | |||
SERF_DECLARE(serf_bucket_t *) serf_bucket_response_create( | SERF_DECLARE(serf_bucket_t *) serf_bucket_response_create( | |||
serf_bucket_t *stream, | serf_bucket_t *stream, | |||
serf_bucket_alloc_t *allocator); | serf_bucket_alloc_t *allocator); | |||
#define SERF_HTTP_VERSION(major, minor) ((major) * 1000 + (minor)) | #define SERF_HTTP_VERSION(major, minor) ((major) * 1000 + (minor)) | |||
skipping to change at line 159 | skipping to change at line 169 | |||
/* ==================================================================== */ | /* ==================================================================== */ | |||
SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_socket; | SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_socket; | |||
#define SERF_BUCKET_IS_SOCKET(b) SERF_BUCKET_CHECK((b), socket) | #define SERF_BUCKET_IS_SOCKET(b) SERF_BUCKET_CHECK((b), socket) | |||
SERF_DECLARE(serf_bucket_t *) serf_bucket_socket_create( | SERF_DECLARE(serf_bucket_t *) serf_bucket_socket_create( | |||
apr_socket_t *skt, | apr_socket_t *skt, | |||
serf_bucket_alloc_t *allocator); | serf_bucket_alloc_t *allocator); | |||
/** | ||||
* Call @a progress_func every time bytes are read from the socket, pass | ||||
* the number of bytes read. | ||||
* | ||||
* When using serf's bytes read & written progress indicator, pass | ||||
* @a serf_context_progress_delta for progress_func and the serf_context fo | ||||
r | ||||
* progress_baton. | ||||
*/ | ||||
SERF_DECLARE(void) serf_bucket_socket_set_read_progress_cb( | ||||
serf_bucket_t *bucket, | ||||
const serf_progress_t progress_func, | ||||
void *progress_baton); | ||||
/* ==================================================================== */ | /* ==================================================================== */ | |||
SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_simple; | SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_simple; | |||
#define SERF_BUCKET_IS_SIMPLE(b) SERF_BUCKET_CHECK((b), simple) | #define SERF_BUCKET_IS_SIMPLE(b) SERF_BUCKET_CHECK((b), simple) | |||
typedef void (*serf_simple_freefunc_t)(void *baton, const char *data); | typedef void (*serf_simple_freefunc_t)(void *baton, const char *data); | |||
SERF_DECLARE(serf_bucket_t *) serf_bucket_simple_create( | SERF_DECLARE(serf_bucket_t *) serf_bucket_simple_create( | |||
const char *data, apr_size_t len, | const char *data, apr_size_t len, | |||
serf_simple_freefunc_t freefunc, | serf_simple_freefunc_t freefunc, | |||
skipping to change at line 235 | skipping to change at line 258 | |||
serf_bucket_t *headers_bucket, | serf_bucket_t *headers_bucket, | |||
const char *header, | const char *header, | |||
const char *value); | const char *value); | |||
/** | /** | |||
* Set, no copies. | * Set, no copies. | |||
* | * | |||
* Set the specified @a header and @a value into the bucket, without | * Set the specified @a header and @a value into the bucket, without | |||
* copying either attribute. Both attributes should remain in scope at | * copying either attribute. Both attributes should remain in scope at | |||
* least as long as the bucket. | * least as long as the bucket. | |||
* | ||||
* @note In the case where a header already exists this will result | ||||
* in a reallocation and copy, @see serf_bucket_headers_setn. | ||||
*/ | */ | |||
SERF_DECLARE(void) serf_bucket_headers_setn( | SERF_DECLARE(void) serf_bucket_headers_setn( | |||
serf_bucket_t *headers_bucket, | serf_bucket_t *headers_bucket, | |||
const char *header, | const char *header, | |||
const char *value); | const char *value); | |||
/** | /** | |||
* Set, extended: fine grained copy control of header and value. | * Set, extended: fine grained copy control of header and value. | |||
* | * | |||
* Set the specified @a header, with length @a header_size with the | * Set the specified @a header, with length @a header_size with the | |||
* @a value, and length @a value_size, into the bucket. The header will | * @a value, and length @a value_size, into the bucket. The header will | |||
* be copied if @a header_copy is set, and the value is copied if | * be copied if @a header_copy is set, and the value is copied if | |||
* @a value_copy is set. If the values are not copied, then they should | * @a value_copy is set. If the values are not copied, then they should | |||
* remain in scope at least as long as the bucket. | * remain in scope at least as long as the bucket. | |||
* | ||||
* If @a headers_bucket already contains a header with the same name | ||||
* as @a header, then append @a value to the existing value, | ||||
* separating with a comma (as per RFC 2616, section 4.2). In this | ||||
* case, the new value must be allocated and the header re-used, so | ||||
* behave as if @a value_copy were true and @a header_copy false. | ||||
*/ | */ | |||
SERF_DECLARE(void) serf_bucket_headers_setx( | SERF_DECLARE(void) serf_bucket_headers_setx( | |||
serf_bucket_t *headers_bucket, | serf_bucket_t *headers_bucket, | |||
const char *header, apr_size_t header_size, int header_copy, | const char *header, apr_size_t header_size, int header_copy, | |||
const char *value, apr_size_t value_size, int value_copy); | const char *value, apr_size_t value_size, int value_copy); | |||
SERF_DECLARE(const char *) serf_bucket_headers_get( | SERF_DECLARE(const char *) serf_bucket_headers_get( | |||
serf_bucket_t *headers_bucket, | serf_bucket_t *headers_bucket, | |||
const char *header); | const char *header); | |||
skipping to change at line 321 | skipping to change at line 353 | |||
SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_limit; | SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_limit; | |||
#define SERF_BUCKET_IS_LIMIT(b) SERF_BUCKET_CHECK((b), limit) | #define SERF_BUCKET_IS_LIMIT(b) SERF_BUCKET_CHECK((b), limit) | |||
SERF_DECLARE(serf_bucket_t *) serf_bucket_limit_create( | SERF_DECLARE(serf_bucket_t *) serf_bucket_limit_create( | |||
serf_bucket_t *stream, | serf_bucket_t *stream, | |||
apr_size_t limit, | apr_size_t limit, | |||
serf_bucket_alloc_t *allocator); | serf_bucket_alloc_t *allocator); | |||
/* ==================================================================== */ | /* ==================================================================== */ | |||
#define SERF_SSL_CERT_NOTYETVALID 1 | ||||
#define SERF_SSL_CERT_EXPIRED 2 | ||||
#define SERF_SSL_CERT_UNKNOWNCA 4 | ||||
#define SERF_SSL_CERT_SELF_SIGNED 8 | ||||
#define SERF_SSL_CERT_UNKNOWN_FAILURE 16 | ||||
SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_ssl_encr ypt; | SERF_DECLARE_DATA extern const serf_bucket_type_t serf_bucket_type_ssl_encr ypt; | |||
#define SERF_BUCKET_IS_SSL_ENCRYPT(b) SERF_BUCKET_CHECK((b), ssl_encrypt) | #define SERF_BUCKET_IS_SSL_ENCRYPT(b) SERF_BUCKET_CHECK((b), ssl_encrypt) | |||
typedef struct serf_ssl_context_t serf_ssl_context_t; | typedef struct serf_ssl_context_t serf_ssl_context_t; | |||
typedef struct serf_ssl_certificate_t serf_ssl_certificate_t; | ||||
typedef apr_status_t (*serf_ssl_need_client_cert_t)(void *data, | typedef apr_status_t (*serf_ssl_need_client_cert_t)(void *data, | |||
const char **cert_path) ; | const char **cert_path) ; | |||
typedef apr_status_t (*serf_ssl_need_cert_password_t)(void *data, | typedef apr_status_t (*serf_ssl_need_cert_password_t)(void *data, | |||
const char *cert_path , | const char *cert_path , | |||
const char **password ); | const char **password ); | |||
typedef apr_status_t | ||||
(*serf_ssl_need_server_cert_t)(void *data, | ||||
int failures, | ||||
const serf_ssl_certificate_t *cert); | ||||
SERF_DECLARE(void) | SERF_DECLARE(void) | |||
serf_ssl_client_cert_provider_set(serf_ssl_context_t *context, | serf_ssl_client_cert_provider_set(serf_ssl_context_t *context, | |||
serf_ssl_need_client_cert_t callback, | serf_ssl_need_client_cert_t callback, | |||
void *data, | void *data, | |||
void *cache_pool); | void *cache_pool); | |||
SERF_DECLARE(void) | SERF_DECLARE(void) | |||
serf_ssl_client_cert_password_set(serf_ssl_context_t *context, | serf_ssl_client_cert_password_set(serf_ssl_context_t *context, | |||
serf_ssl_need_cert_password_t callback, | serf_ssl_need_cert_password_t callback, | |||
void *data, | void *data, | |||
void *cache_pool); | void *cache_pool); | |||
/** | ||||
* Set a callback to override the default SSL server certificate validation | ||||
* algorithm. | ||||
*/ | ||||
SERF_DECLARE(void) | ||||
serf_ssl_server_cert_callback_set(serf_ssl_context_t *context, | ||||
serf_ssl_need_server_cert_t callback, | ||||
void *data); | ||||
/** | ||||
* Use the default root CA certificates as included with the OpenSSL librar | ||||
y. | ||||
*/ | ||||
SERF_DECLARE(apr_status_t) | ||||
serf_ssl_use_default_certificates(serf_ssl_context_t *context); | ||||
/** | ||||
* Extract the fields of the issuer in a table with keys (E, CN, OU, O, L, | ||||
* ST and C). The returned table will be allocated in @a pool. | ||||
*/ | ||||
SERF_DECLARE(apr_hash_t *) | ||||
serf_ssl_cert_issuer(const serf_ssl_certificate_t *cert, apr_pool_t *pool); | ||||
/** | ||||
* Extract the fields of the subject in a table with keys (E, CN, OU, O, L, | ||||
* ST and C). The returned table will be allocated in @a pool. | ||||
*/ | ||||
SERF_DECLARE(apr_hash_t *) | ||||
serf_ssl_cert_subject(const serf_ssl_certificate_t *cert, apr_pool_t *pool) | ||||
; | ||||
/** | ||||
* Extract the fields of the certificate in a table with keys (sha1, notBef | ||||
ore, | ||||
* notAfter). The returned table will be allocated in @a pool. | ||||
*/ | ||||
SERF_DECLARE(apr_hash_t *) | ||||
serf_ssl_cert_certificate(const serf_ssl_certificate_t *cert, apr_pool_t *p | ||||
ool); | ||||
/** | ||||
* Load a CA certificate file from a path @a file_path. If the file was loa | ||||
ded | ||||
* and parsed correctly, a certificate @a cert will be created and returned | ||||
. | ||||
* This certificate object will be alloced in @a pool. | ||||
*/ | ||||
SERF_DECLARE(apr_status_t) | ||||
serf_ssl_load_cert_file(serf_ssl_certificate_t **cert, const char *file_pat | ||||
h, | ||||
apr_pool_t *pool); | ||||
/** | ||||
* Adds the certificate @a cert to the list of trusted certificates in | ||||
* @a ssl_ctx that will be used for verification. | ||||
* See also @a serf_ssl_load_cert_file. | ||||
*/ | ||||
SERF_DECLARE(apr_status_t) | ||||
serf_ssl_trust_cert(serf_ssl_context_t *ssl_ctx, serf_ssl_certificate_t *ce | ||||
rt); | ||||
SERF_DECLARE(serf_bucket_t *) serf_bucket_ssl_encrypt_create( | SERF_DECLARE(serf_bucket_t *) serf_bucket_ssl_encrypt_create( | |||
serf_bucket_t *stream, | serf_bucket_t *stream, | |||
serf_ssl_context_t *ssl_context, | serf_ssl_context_t *ssl_context, | |||
serf_bucket_alloc_t *allocator); | serf_bucket_alloc_t *allocator); | |||
SERF_DECLARE(serf_ssl_context_t *) serf_bucket_ssl_encrypt_context_get( | SERF_DECLARE(serf_ssl_context_t *) serf_bucket_ssl_encrypt_context_get( | |||
serf_bucket_t *bucket); | serf_bucket_t *bucket); | |||
/* ==================================================================== */ | /* ==================================================================== */ | |||
End of changes. 9 change blocks. | ||||
0 lines changed or deleted | 105 lines changed or added | |||