Blame serf_bucket_types.h

Packit 3adb1e
/* ====================================================================
Packit 3adb1e
 *    Licensed to the Apache Software Foundation (ASF) under one
Packit 3adb1e
 *    or more contributor license agreements.  See the NOTICE file
Packit 3adb1e
 *    distributed with this work for additional information
Packit 3adb1e
 *    regarding copyright ownership.  The ASF licenses this file
Packit 3adb1e
 *    to you under the Apache License, Version 2.0 (the
Packit 3adb1e
 *    "License"); you may not use this file except in compliance
Packit 3adb1e
 *    with the License.  You may obtain a copy of the License at
Packit 3adb1e
 *
Packit 3adb1e
 *      http://www.apache.org/licenses/LICENSE-2.0
Packit 3adb1e
 *
Packit 3adb1e
 *    Unless required by applicable law or agreed to in writing,
Packit 3adb1e
 *    software distributed under the License is distributed on an
Packit 3adb1e
 *    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
Packit 3adb1e
 *    KIND, either express or implied.  See the License for the
Packit 3adb1e
 *    specific language governing permissions and limitations
Packit 3adb1e
 *    under the License.
Packit 3adb1e
 * ====================================================================
Packit 3adb1e
 */
Packit 3adb1e
Packit 3adb1e
#ifndef SERF_BUCKET_TYPES_H
Packit 3adb1e
#define SERF_BUCKET_TYPES_H
Packit 3adb1e
Packit 3adb1e
#include <apr_mmap.h>
Packit 3adb1e
#include <apr_hash.h>
Packit 3adb1e
Packit 3adb1e
/* this header and serf.h refer to each other, so take a little extra care */
Packit 3adb1e
#ifndef SERF_H
Packit 3adb1e
#include "serf.h"
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * @file serf_bucket_types.h
Packit 3adb1e
 * @brief serf-supported bucket types
Packit 3adb1e
 */
Packit 3adb1e
/* ### this whole file needs docco ... */
Packit 3adb1e
Packit 3adb1e
#ifdef __cplusplus
Packit 3adb1e
extern "C" {
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_request;
Packit 3adb1e
#define SERF_BUCKET_IS_REQUEST(b) SERF_BUCKET_CHECK((b), request)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_request_create(
Packit 3adb1e
    const char *method,
Packit 3adb1e
    const char *URI,
Packit 3adb1e
    serf_bucket_t *body,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/* Send a Content-Length header with @a len. The @a body bucket should
Packit 3adb1e
   contain precisely that much data.  */
Packit 3adb1e
void serf_bucket_request_set_CL(
Packit 3adb1e
    serf_bucket_t *bucket,
Packit 3adb1e
    apr_int64_t len);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_request_get_headers(
Packit 3adb1e
    serf_bucket_t *request);
Packit 3adb1e
Packit 3adb1e
void serf_bucket_request_become(
Packit 3adb1e
    serf_bucket_t *bucket,
Packit 3adb1e
    const char *method,
Packit 3adb1e
    const char *uri,
Packit 3adb1e
    serf_bucket_t *body);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Sets the root url of the remote host. If this request contains a relative
Packit 3adb1e
 * url, it will be prefixed with the root url to form an absolute url.
Packit 3adb1e
 * @a bucket is the request bucket. @a root_url is the absolute url of the
Packit 3adb1e
 * root of the remote host, without the closing '/'.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_request_set_root(
Packit 3adb1e
    serf_bucket_t *bucket,
Packit 3adb1e
    const char *root_url);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_response;
Packit 3adb1e
#define SERF_BUCKET_IS_RESPONSE(b) SERF_BUCKET_CHECK((b), response)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_response_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
#define SERF_HTTP_VERSION(major, minor)  ((major) * 1000 + (minor))
Packit 3adb1e
#define SERF_HTTP_11 SERF_HTTP_VERSION(1, 1)
Packit 3adb1e
#define SERF_HTTP_10 SERF_HTTP_VERSION(1, 0)
Packit 3adb1e
#define SERF_HTTP_VERSION_MAJOR(shv) ((int)shv / 1000)
Packit 3adb1e
#define SERF_HTTP_VERSION_MINOR(shv) ((int)shv % 1000)
Packit 3adb1e
Packit 3adb1e
typedef struct {
Packit 3adb1e
    int version;
Packit 3adb1e
    int code;
Packit 3adb1e
    const char *reason;
Packit 3adb1e
} serf_status_line;
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Return the Status-Line information, if available. This function
Packit 3adb1e
 * works like other bucket read functions: it may return APR_EAGAIN or
Packit 3adb1e
 * APR_EOF to signal the state of the bucket for reading. A return
Packit 3adb1e
 * value of APR_SUCCESS will always indicate that status line
Packit 3adb1e
 * information was returned; for other return values the caller must
Packit 3adb1e
 * check the version field in @a sline. A value of 0 means that the
Packit 3adb1e
 * data is not (yet) present.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_bucket_response_status(
Packit 3adb1e
    serf_bucket_t *bkt,
Packit 3adb1e
    serf_status_line *sline);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Wait for the HTTP headers to be processed for a @a response.
Packit 3adb1e
 *
Packit 3adb1e
 * If the headers are available, APR_SUCCESS is returned.
Packit 3adb1e
 * If the headers aren't available, APR_EAGAIN is returned.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_bucket_response_wait_for_headers(
Packit 3adb1e
    serf_bucket_t *response);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Get the headers bucket for @a response.
Packit 3adb1e
 */
Packit 3adb1e
serf_bucket_t *serf_bucket_response_get_headers(
Packit 3adb1e
    serf_bucket_t *response);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Advise the response @a bucket that this was from a HEAD request and
Packit 3adb1e
 * that it should not expect to see a response body.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_response_set_head(
Packit 3adb1e
    serf_bucket_t *bucket);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_response_body;
Packit 3adb1e
#define SERF_BUCKET_IS_RESPONSE_BODY(b) SERF_BUCKET_CHECK((b), response_body)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_response_body_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    apr_uint64_t limit,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_bwtp_frame;
Packit 3adb1e
#define SERF_BUCKET_IS_BWTP_FRAME(b) SERF_BUCKET_CHECK((b), bwtp_frame)
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_bwtp_incoming_frame;
Packit 3adb1e
#define SERF_BUCKET_IS_BWTP_INCOMING_FRAME(b) SERF_BUCKET_CHECK((b), bwtp_incoming_frame)
Packit 3adb1e
Packit 3adb1e
int serf_bucket_bwtp_frame_get_channel(
Packit 3adb1e
    serf_bucket_t *hdr);
Packit 3adb1e
Packit 3adb1e
int serf_bucket_bwtp_frame_get_type(
Packit 3adb1e
    serf_bucket_t *hdr);
Packit 3adb1e
Packit 3adb1e
const char *serf_bucket_bwtp_frame_get_phrase(
Packit 3adb1e
    serf_bucket_t *hdr);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_frame_get_headers(
Packit 3adb1e
    serf_bucket_t *hdr);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_channel_open(
Packit 3adb1e
    int channel,
Packit 3adb1e
    const char *URI,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_channel_close(
Packit 3adb1e
    int channel,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_header_create(
Packit 3adb1e
    int channel,
Packit 3adb1e
    const char *phrase,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_message_create(
Packit 3adb1e
    int channel,
Packit 3adb1e
    serf_bucket_t *body,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_bwtp_incoming_frame_create(
Packit 3adb1e
    serf_bucket_t *bkt,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
apr_status_t serf_bucket_bwtp_incoming_frame_wait_for_headers(
Packit 3adb1e
    serf_bucket_t *bkt);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_aggregate;
Packit 3adb1e
#define SERF_BUCKET_IS_AGGREGATE(b) SERF_BUCKET_CHECK((b), aggregate)
Packit 3adb1e
Packit 3adb1e
typedef apr_status_t (*serf_bucket_aggregate_eof_t)(
Packit 3adb1e
    void *baton,
Packit 3adb1e
    serf_bucket_t *aggregate_bucket);
Packit 3adb1e
Packit 3adb1e
/** serf_bucket_aggregate_cleanup will instantly destroy all buckets in
Packit 3adb1e
    the aggregate bucket that have been read completely. Whereas normally, 
Packit 3adb1e
    these buckets are destroyed on every read operation. */ 
Packit 3adb1e
void serf_bucket_aggregate_cleanup(
Packit 3adb1e
    serf_bucket_t *bucket,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_aggregate_create(
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/* Creates a stream bucket.
Packit 3adb1e
   A stream bucket is like an aggregate bucket, but:
Packit 3adb1e
   - it doesn't destroy its child buckets on cleanup
Packit 3adb1e
   - one can always keep adding child buckets, the handler FN should return
Packit 3adb1e
     APR_EOF when no more buckets will be added.
Packit 3adb1e
Packit 3adb1e
  Note: keep this factory function internal for now. If it turns out this
Packit 3adb1e
  bucket type is useful outside serf, we should make it an actual separate
Packit 3adb1e
  type.
Packit 3adb1e
  */
Packit 3adb1e
serf_bucket_t *serf__bucket_stream_create(
Packit 3adb1e
    serf_bucket_alloc_t *allocator,
Packit 3adb1e
    serf_bucket_aggregate_eof_t fn,
Packit 3adb1e
    void *baton);
Packit 3adb1e
Packit 3adb1e
/** Transform @a bucket in-place into an aggregate bucket. */
Packit 3adb1e
void serf_bucket_aggregate_become(
Packit 3adb1e
    serf_bucket_t *bucket);
Packit 3adb1e
Packit 3adb1e
void serf_bucket_aggregate_prepend(
Packit 3adb1e
    serf_bucket_t *aggregate_bucket,
Packit 3adb1e
    serf_bucket_t *prepend_bucket);
Packit 3adb1e
Packit 3adb1e
void serf_bucket_aggregate_append(
Packit 3adb1e
    serf_bucket_t *aggregate_bucket,
Packit 3adb1e
    serf_bucket_t *append_bucket);
Packit 3adb1e
    
Packit 3adb1e
void serf_bucket_aggregate_hold_open(
Packit 3adb1e
    serf_bucket_t *aggregate_bucket,
Packit 3adb1e
    serf_bucket_aggregate_eof_t fn,
Packit 3adb1e
    void *baton);
Packit 3adb1e
Packit 3adb1e
void serf_bucket_aggregate_prepend_iovec(
Packit 3adb1e
    serf_bucket_t *aggregate_bucket,
Packit 3adb1e
    struct iovec *vecs,
Packit 3adb1e
    int vecs_count);
Packit 3adb1e
Packit 3adb1e
void serf_bucket_aggregate_append_iovec(
Packit 3adb1e
    serf_bucket_t *aggregate_bucket,
Packit 3adb1e
    struct iovec *vecs,
Packit 3adb1e
    int vecs_count);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_file;
Packit 3adb1e
#define SERF_BUCKET_IS_FILE(b) SERF_BUCKET_CHECK((b), file)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_file_create(
Packit 3adb1e
    apr_file_t *file,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_socket;
Packit 3adb1e
#define SERF_BUCKET_IS_SOCKET(b) SERF_BUCKET_CHECK((b), socket)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_socket_create(
Packit 3adb1e
    apr_socket_t *skt,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Call @a progress_func every time bytes are read from the socket, pass
Packit 3adb1e
 * the number of bytes read.
Packit 3adb1e
 *
Packit 3adb1e
 * When using serf's bytes read & written progress indicator, pass 
Packit 3adb1e
 * @a serf_context_progress_delta for progress_func and the serf_context for
Packit 3adb1e
 * progress_baton.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_socket_set_read_progress_cb(
Packit 3adb1e
    serf_bucket_t *bucket,
Packit 3adb1e
    const serf_progress_t progress_func,
Packit 3adb1e
    void *progress_baton);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_simple;
Packit 3adb1e
#define SERF_BUCKET_IS_SIMPLE(b) SERF_BUCKET_CHECK((b), simple)
Packit 3adb1e
Packit 3adb1e
typedef void (*serf_simple_freefunc_t)(
Packit 3adb1e
    void *baton,
Packit 3adb1e
    const char *data);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_simple_create(
Packit 3adb1e
    const char *data,
Packit 3adb1e
    apr_size_t len,
Packit 3adb1e
    serf_simple_freefunc_t freefunc,
Packit 3adb1e
    void *freefunc_baton,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Equivalent to serf_bucket_simple_create, except that the bucket takes
Packit 3adb1e
 * ownership of a private copy of the data.
Packit 3adb1e
 */
Packit 3adb1e
serf_bucket_t *serf_bucket_simple_copy_create(
Packit 3adb1e
    const char *data,
Packit 3adb1e
    apr_size_t len,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Equivalent to serf_bucket_simple_create, except that the bucket assumes
Packit 3adb1e
 * responsibility for freeing the data on this allocator without making
Packit 3adb1e
 * a copy.  It is assumed that data was created by a call from allocator.
Packit 3adb1e
 */
Packit 3adb1e
serf_bucket_t *serf_bucket_simple_own_create(
Packit 3adb1e
    const char *data,
Packit 3adb1e
    apr_size_t len,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
#define SERF_BUCKET_SIMPLE_STRING(s,a) \
Packit 3adb1e
    serf_bucket_simple_create(s, strlen(s), NULL, NULL, a);
Packit 3adb1e
Packit 3adb1e
#define SERF_BUCKET_SIMPLE_STRING_LEN(s,l,a) \
Packit 3adb1e
    serf_bucket_simple_create(s, l, NULL, NULL, a);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* Note: apr_mmap_t is always defined, but if APR doesn't have mmaps, then
Packit 3adb1e
   the caller can never create an apr_mmap_t to pass to this function. */
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_mmap;
Packit 3adb1e
#define SERF_BUCKET_IS_MMAP(b) SERF_BUCKET_CHECK((b), mmap)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_mmap_create(
Packit 3adb1e
    apr_mmap_t *mmap,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_headers;
Packit 3adb1e
#define SERF_BUCKET_IS_HEADERS(b) SERF_BUCKET_CHECK((b), headers)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_headers_create(
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set, default: value copied.
Packit 3adb1e
 *
Packit 3adb1e
 * Set the specified @a header within the bucket, copying the @a value
Packit 3adb1e
 * into space from this bucket's allocator. The header is NOT copied,
Packit 3adb1e
 * so it should remain in scope at least as long as the bucket.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_headers_set(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    const char *header,
Packit 3adb1e
    const char *value);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set, copies: header and value copied.
Packit 3adb1e
 *
Packit 3adb1e
 * Copy the specified @a header and @a value into the bucket, using space
Packit 3adb1e
 * from this bucket's allocator.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_headers_setc(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    const char *header,
Packit 3adb1e
    const char *value);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set, no copies.
Packit 3adb1e
 *
Packit 3adb1e
 * Set the specified @a header and @a value into the bucket, without
Packit 3adb1e
 * copying either attribute. Both attributes should remain in scope at
Packit 3adb1e
 * least as long as the bucket.
Packit 3adb1e
 *
Packit 3adb1e
 * @note In the case where a header already exists this will result
Packit 3adb1e
 *       in a reallocation and copy, @see serf_bucket_headers_setn.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_headers_setn(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    const char *header,
Packit 3adb1e
    const char *value);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set, extended: fine grained copy control of header and value.
Packit 3adb1e
 *
Packit 3adb1e
 * Set the specified @a header, with length @a header_size with the
Packit 3adb1e
 * @a value, and length @a value_size, into the bucket. The header will
Packit 3adb1e
 * be copied if @a header_copy is set, and the value is copied if
Packit 3adb1e
 * @a value_copy is set. If the values are not copied, then they should
Packit 3adb1e
 * remain in scope at least as long as the bucket.
Packit 3adb1e
 *
Packit 3adb1e
 * If @a headers_bucket already contains a header with the same name
Packit 3adb1e
 * as @a header, then append @a value to the existing value,
Packit 3adb1e
 * separating with a comma (as per RFC 2616, section 4.2).  In this
Packit 3adb1e
 * case, the new value must be allocated and the header re-used, so
Packit 3adb1e
 * behave as if @a value_copy were true and @a header_copy false.
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_headers_setx(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    const char *header,
Packit 3adb1e
    apr_size_t header_size,
Packit 3adb1e
    int header_copy,
Packit 3adb1e
    const char *value,
Packit 3adb1e
    apr_size_t value_size,
Packit 3adb1e
    int value_copy);
Packit 3adb1e
Packit 3adb1e
const char *serf_bucket_headers_get(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    const char *header);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * @param baton opaque baton as passed to @see serf_bucket_headers_do
Packit 3adb1e
 * @param key The header key from this iteration through the table
Packit 3adb1e
 * @param value The header value from this iteration through the table
Packit 3adb1e
 */
Packit 3adb1e
typedef int (serf_bucket_headers_do_callback_fn_t)(
Packit 3adb1e
    void *baton,
Packit 3adb1e
    const char *key,
Packit 3adb1e
    const char *value);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Iterates over all headers of the message and invokes the callback 
Packit 3adb1e
 * function with header key and value. Stop iterating when no more
Packit 3adb1e
 * headers are available or when the callback function returned a 
Packit 3adb1e
 * non-0 value.
Packit 3adb1e
 *
Packit 3adb1e
 * @param headers_bucket headers to iterate over
Packit 3adb1e
 * @param func callback routine to invoke for every header in the bucket
Packit 3adb1e
 * @param baton baton to pass on each invocation to func
Packit 3adb1e
 */
Packit 3adb1e
void serf_bucket_headers_do(
Packit 3adb1e
    serf_bucket_t *headers_bucket,
Packit 3adb1e
    serf_bucket_headers_do_callback_fn_t func,
Packit 3adb1e
    void *baton);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_chunk;
Packit 3adb1e
#define SERF_BUCKET_IS_CHUNK(b) SERF_BUCKET_CHECK((b), chunk)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_chunk_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_dechunk;
Packit 3adb1e
#define SERF_BUCKET_IS_DECHUNK(b) SERF_BUCKET_CHECK((b), dechunk)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_dechunk_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_deflate;
Packit 3adb1e
#define SERF_BUCKET_IS_DEFLATE(b) SERF_BUCKET_CHECK((b), deflate)
Packit 3adb1e
Packit 3adb1e
#define SERF_DEFLATE_GZIP 0
Packit 3adb1e
#define SERF_DEFLATE_DEFLATE 1
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_deflate_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_bucket_alloc_t *allocator,
Packit 3adb1e
    int format);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_limit;
Packit 3adb1e
#define SERF_BUCKET_IS_LIMIT(b) SERF_BUCKET_CHECK((b), limit)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_limit_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    apr_uint64_t limit,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
#define SERF_SSL_CERT_NOTYETVALID       1
Packit 3adb1e
#define SERF_SSL_CERT_EXPIRED           2
Packit 3adb1e
#define SERF_SSL_CERT_UNKNOWNCA         4
Packit 3adb1e
#define SERF_SSL_CERT_SELF_SIGNED       8
Packit 3adb1e
#define SERF_SSL_CERT_UNKNOWN_FAILURE  16
Packit 3adb1e
#define SERF_SSL_CERT_REVOKED          32
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_ssl_encrypt;
Packit 3adb1e
#define SERF_BUCKET_IS_SSL_ENCRYPT(b) SERF_BUCKET_CHECK((b), ssl_encrypt)
Packit 3adb1e
Packit 3adb1e
typedef struct serf_ssl_context_t serf_ssl_context_t;
Packit 3adb1e
typedef struct serf_ssl_certificate_t serf_ssl_certificate_t;
Packit 3adb1e
Packit 3adb1e
typedef apr_status_t (*serf_ssl_need_client_cert_t)(
Packit 3adb1e
    void *data,
Packit 3adb1e
    const char **cert_path);
Packit 3adb1e
Packit 3adb1e
typedef apr_status_t (*serf_ssl_need_cert_password_t)(
Packit 3adb1e
    void *data,
Packit 3adb1e
    const char *cert_path,
Packit 3adb1e
    const char **password);
Packit 3adb1e
Packit 3adb1e
typedef apr_status_t (*serf_ssl_need_server_cert_t)(
Packit 3adb1e
    void *data, 
Packit 3adb1e
    int failures,
Packit 3adb1e
    const serf_ssl_certificate_t *cert);
Packit 3adb1e
Packit 3adb1e
typedef apr_status_t (*serf_ssl_server_cert_chain_cb_t)(
Packit 3adb1e
    void *data,
Packit 3adb1e
    int failures,
Packit 3adb1e
    int error_depth,
Packit 3adb1e
    const serf_ssl_certificate_t * const * certs,
Packit 3adb1e
    apr_size_t certs_len);
Packit 3adb1e
Packit 3adb1e
void serf_ssl_client_cert_provider_set(
Packit 3adb1e
    serf_ssl_context_t *context,
Packit 3adb1e
    serf_ssl_need_client_cert_t callback,
Packit 3adb1e
    void *data,
Packit 3adb1e
    void *cache_pool);
Packit 3adb1e
Packit 3adb1e
void serf_ssl_client_cert_password_set(
Packit 3adb1e
    serf_ssl_context_t *context,
Packit 3adb1e
    serf_ssl_need_cert_password_t callback,
Packit 3adb1e
    void *data,
Packit 3adb1e
    void *cache_pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set a callback to override the default SSL server certificate validation 
Packit 3adb1e
 * algorithm.
Packit 3adb1e
 */
Packit 3adb1e
void serf_ssl_server_cert_callback_set(
Packit 3adb1e
    serf_ssl_context_t *context,
Packit 3adb1e
    serf_ssl_need_server_cert_t callback,
Packit 3adb1e
    void *data);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Set callbacks to override the default SSL server certificate validation 
Packit 3adb1e
 * algorithm for the current certificate or the entire certificate chain. 
Packit 3adb1e
 */
Packit 3adb1e
void serf_ssl_server_cert_chain_callback_set(
Packit 3adb1e
    serf_ssl_context_t *context,
Packit 3adb1e
    serf_ssl_need_server_cert_t cert_callback,
Packit 3adb1e
    serf_ssl_server_cert_chain_cb_t cert_chain_callback,
Packit 3adb1e
    void *data);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Use the default root CA certificates as included with the OpenSSL library.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_ssl_use_default_certificates(
Packit 3adb1e
    serf_ssl_context_t *context);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Allow SNI indicators to be sent to the server.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_ssl_set_hostname(
Packit 3adb1e
    serf_ssl_context_t *context, const char *hostname);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Return the depth of the certificate.
Packit 3adb1e
 */
Packit 3adb1e
int serf_ssl_cert_depth(
Packit 3adb1e
    const serf_ssl_certificate_t *cert);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Extract the fields of the issuer in a table with keys (E, CN, OU, O, L, 
Packit 3adb1e
 * ST and C). The returned table will be allocated in @a pool.
Packit 3adb1e
 */
Packit 3adb1e
apr_hash_t *serf_ssl_cert_issuer(
Packit 3adb1e
    const serf_ssl_certificate_t *cert,
Packit 3adb1e
    apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Extract the fields of the subject in a table with keys (E, CN, OU, O, L, 
Packit 3adb1e
 * ST and C). The returned table will be allocated in @a pool.
Packit 3adb1e
 */
Packit 3adb1e
apr_hash_t *serf_ssl_cert_subject(
Packit 3adb1e
    const serf_ssl_certificate_t *cert,
Packit 3adb1e
    apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Extract the fields of the certificate in a table with keys (sha1, notBefore,
Packit 3adb1e
 * notAfter, subjectAltName). The returned table will be allocated in @a pool.
Packit 3adb1e
 */
Packit 3adb1e
apr_hash_t *serf_ssl_cert_certificate(
Packit 3adb1e
    const serf_ssl_certificate_t *cert,
Packit 3adb1e
    apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Export a certificate to base64-encoded, zero-terminated string.
Packit 3adb1e
 * The returned string is allocated in @a pool. Returns NULL on failure.
Packit 3adb1e
 */
Packit 3adb1e
const char *serf_ssl_cert_export(
Packit 3adb1e
    const serf_ssl_certificate_t *cert,
Packit 3adb1e
    apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Load a CA certificate file from a path @a file_path. If the file was loaded
Packit 3adb1e
 * and parsed correctly, a certificate @a cert will be created and returned.
Packit 3adb1e
 * This certificate object will be alloced in @a pool.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_ssl_load_cert_file(
Packit 3adb1e
    serf_ssl_certificate_t **cert,
Packit 3adb1e
    const char *file_path,
Packit 3adb1e
    apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Adds the certificate @a cert to the list of trusted certificates in 
Packit 3adb1e
 * @a ssl_ctx that will be used for verification. 
Packit 3adb1e
 * See also @a serf_ssl_load_cert_file.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_ssl_trust_cert(
Packit 3adb1e
    serf_ssl_context_t *ssl_ctx,
Packit 3adb1e
    serf_ssl_certificate_t *cert);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Enable or disable SSL compression on a SSL session.
Packit 3adb1e
 * @a enabled = 1 to enable compression, 0 to disable compression.
Packit 3adb1e
 * Default = disabled.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_ssl_use_compression(
Packit 3adb1e
    serf_ssl_context_t *ssl_ctx,
Packit 3adb1e
    int enabled);
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_ssl_encrypt_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_ssl_context_t *ssl_context,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_ssl_context_t *serf_bucket_ssl_encrypt_context_get(
Packit 3adb1e
    serf_bucket_t *bucket);
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_ssl_decrypt;
Packit 3adb1e
#define SERF_BUCKET_IS_SSL_DECRYPT(b) SERF_BUCKET_CHECK((b), ssl_decrypt)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_ssl_decrypt_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_ssl_context_t *ssl_context,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
serf_ssl_context_t *serf_bucket_ssl_decrypt_context_get(
Packit 3adb1e
    serf_bucket_t *bucket);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_barrier;
Packit 3adb1e
#define SERF_BUCKET_IS_BARRIER(b) SERF_BUCKET_CHECK((b), barrier)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_barrier_create(
Packit 3adb1e
    serf_bucket_t *stream,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
extern const serf_bucket_type_t serf_bucket_type_iovec;
Packit 3adb1e
#define SERF_BUCKET_IS_IOVEC(b) SERF_BUCKET_CHECK((b), iovec)
Packit 3adb1e
Packit 3adb1e
serf_bucket_t *serf_bucket_iovec_create(
Packit 3adb1e
    struct iovec vecs[],
Packit 3adb1e
    int len,
Packit 3adb1e
    serf_bucket_alloc_t *allocator);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/* ==================================================================== */
Packit 3adb1e
Packit 3adb1e
/* ### do we need a PIPE bucket type? they are simple apr_file_t objects */
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
#ifdef __cplusplus
Packit 3adb1e
}
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
#endif	/* !SERF_BUCKET_TYPES_H */