Blame serf_private.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_PRIVATE_H_
Packit 3adb1e
#define _SERF_PRIVATE_H_
Packit 3adb1e
Packit 3adb1e
/* ### what the hell? why does the APR interface have a "size" ??
Packit 3adb1e
   ### the implication is that, if we bust this limit, we'd need to
Packit 3adb1e
   ### stop, rebuild a pollset, and repopulate it. what suckage.  */
Packit 3adb1e
#define MAX_CONN 16
Packit 3adb1e
Packit 3adb1e
/* Windows does not define IOV_MAX, so we need to ensure it is defined. */
Packit 3adb1e
#ifndef IOV_MAX
Packit 3adb1e
/* There is no limit for iovec count on Windows, but apr_socket_sendv
Packit 3adb1e
   allocates WSABUF structures on stack if vecs_count <= 50. */
Packit 3adb1e
#define IOV_MAX 50
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
/* Older versions of APR do not have this macro.  */
Packit 3adb1e
#ifdef APR_SIZE_MAX
Packit 3adb1e
#define REQUESTED_MAX APR_SIZE_MAX
Packit 3adb1e
#else
Packit 3adb1e
#define REQUESTED_MAX (~((apr_size_t)0))
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
#define SERF_IO_CLIENT (1)
Packit 3adb1e
#define SERF_IO_CONN (2)
Packit 3adb1e
#define SERF_IO_LISTENER (3)
Packit 3adb1e
Packit 3adb1e
/* Internal logging facilities, set flag to 1 to enable console logging for
Packit 3adb1e
   the selected component. */
Packit 3adb1e
#define SSL_VERBOSE 0
Packit 3adb1e
#define SSL_MSG_VERBOSE 0  /* logs decrypted requests and responses. */
Packit 3adb1e
#define SOCK_VERBOSE 0
Packit 3adb1e
#define SOCK_MSG_VERBOSE 0 /* logs bytes received from or written to a socket. */
Packit 3adb1e
#define CONN_VERBOSE 0
Packit 3adb1e
#define AUTH_VERBOSE 0
Packit 3adb1e
Packit 3adb1e
/* Older versions of APR do not have the APR_VERSION_AT_LEAST macro. Those
Packit 3adb1e
   implementations are safe.
Packit 3adb1e
Packit 3adb1e
   If the macro *is* defined, and we're on WIN32, and APR is version 1.4.0+,
Packit 3adb1e
   then we have a broken WSAPoll() implementation.
Packit 3adb1e
Packit 3adb1e
   See serf_context_create_ex() below.  */
Packit 3adb1e
#if defined(APR_VERSION_AT_LEAST) && defined(WIN32)
Packit 3adb1e
#if APR_VERSION_AT_LEAST(1,4,0)
Packit 3adb1e
#define BROKEN_WSAPOLL
Packit 3adb1e
#endif
Packit 3adb1e
#endif
Packit 3adb1e
Packit 3adb1e
typedef struct serf__authn_scheme_t serf__authn_scheme_t;
Packit 3adb1e
Packit 3adb1e
typedef struct serf_io_baton_t {
Packit 3adb1e
    int type;
Packit 3adb1e
    union {
Packit 3adb1e
        serf_incoming_t *client;
Packit 3adb1e
        serf_connection_t *conn;
Packit 3adb1e
        serf_listener_t *listener;
Packit 3adb1e
    } u;
Packit 3adb1e
} serf_io_baton_t;
Packit 3adb1e
Packit 3adb1e
/* Holds all the information corresponding to a request/response pair. */
Packit 3adb1e
struct serf_request_t {
Packit 3adb1e
    serf_connection_t *conn;
Packit 3adb1e
Packit 3adb1e
    apr_pool_t *respool;
Packit 3adb1e
    serf_bucket_alloc_t *allocator;
Packit 3adb1e
Packit 3adb1e
    /* The bucket corresponding to the request. Will be NULL once the
Packit 3adb1e
     * bucket has been emptied (for delivery into the socket).
Packit 3adb1e
     */
Packit 3adb1e
    serf_bucket_t *req_bkt;
Packit 3adb1e
Packit 3adb1e
    serf_request_setup_t setup;
Packit 3adb1e
    void *setup_baton;
Packit 3adb1e
Packit 3adb1e
    serf_response_acceptor_t acceptor;
Packit 3adb1e
    void *acceptor_baton;
Packit 3adb1e
Packit 3adb1e
    serf_response_handler_t handler;
Packit 3adb1e
    void *handler_baton;
Packit 3adb1e
Packit 3adb1e
    serf_bucket_t *resp_bkt;
Packit 3adb1e
Packit 3adb1e
    int writing_started;
Packit 3adb1e
    int priority;
Packit 3adb1e
    /* 1 if this is a request to setup a SSL tunnel, 0 for normal requests. */
Packit 3adb1e
    int ssltunnel;
Packit 3adb1e
Packit 3adb1e
    /* This baton is currently only used for digest authentication, which
Packit 3adb1e
       needs access to the uri of the request in the response handler.
Packit 3adb1e
       If serf_request_t is replaced by a serf_http_request_t in the future,
Packit 3adb1e
       which knows about uri and method and such, this baton won't be needed
Packit 3adb1e
       anymore. */
Packit 3adb1e
    void *auth_baton;
Packit 3adb1e
Packit 3adb1e
    struct serf_request_t *next;
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
typedef struct serf_pollset_t {
Packit 3adb1e
    /* the set of connections to poll */
Packit 3adb1e
    apr_pollset_t *pollset;
Packit 3adb1e
} serf_pollset_t;
Packit 3adb1e
Packit 3adb1e
typedef struct serf__authn_info_t {
Packit 3adb1e
    const serf__authn_scheme_t *scheme;
Packit 3adb1e
Packit 3adb1e
    void *baton;
Packit 3adb1e
Packit 3adb1e
    int failed_authn_types;
Packit 3adb1e
} serf__authn_info_t;
Packit 3adb1e
Packit 3adb1e
struct serf_context_t {
Packit 3adb1e
    /* the pool used for self and for other allocations */
Packit 3adb1e
    apr_pool_t *pool;
Packit 3adb1e
Packit 3adb1e
    void *pollset_baton;
Packit 3adb1e
    serf_socket_add_t pollset_add;
Packit 3adb1e
    serf_socket_remove_t pollset_rm;
Packit 3adb1e
Packit 3adb1e
    /* one of our connections has a dirty pollset state. */
Packit 3adb1e
    int dirty_pollset;
Packit 3adb1e
Packit 3adb1e
    /* the list of active connections */
Packit 3adb1e
    apr_array_header_t *conns;
Packit 3adb1e
#define GET_CONN(ctx, i) (((serf_connection_t **)(ctx)->conns->elts)[i])
Packit 3adb1e
Packit 3adb1e
    /* Proxy server address */
Packit 3adb1e
    apr_sockaddr_t *proxy_address;
Packit 3adb1e
Packit 3adb1e
    /* Progress callback */
Packit 3adb1e
    serf_progress_t progress_func;
Packit 3adb1e
    void *progress_baton;
Packit 3adb1e
    apr_off_t progress_read;
Packit 3adb1e
    apr_off_t progress_written;
Packit 3adb1e
Packit 3adb1e
    /* authentication info for the servers used in this context. Shared by all
Packit 3adb1e
       connections to the same server.
Packit 3adb1e
       Structure of the hashtable:  key: host url, e.g. https://localhost:80
Packit 3adb1e
                                  value: serf__authn_info_t *
Packit 3adb1e
     */
Packit 3adb1e
    apr_hash_t *server_authn_info;
Packit 3adb1e
Packit 3adb1e
    /* authentication info for the proxy configured in this context, shared by
Packit 3adb1e
       all connections. */
Packit 3adb1e
    serf__authn_info_t proxy_authn_info;
Packit 3adb1e
Packit 3adb1e
    /* List of authn types supported by the client.*/
Packit 3adb1e
    int authn_types;
Packit 3adb1e
    /* Callback function used to get credentials for a realm. */
Packit 3adb1e
    serf_credentials_callback_t cred_cb; 
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
struct serf_listener_t {
Packit 3adb1e
    serf_context_t *ctx;
Packit 3adb1e
    serf_io_baton_t baton;
Packit 3adb1e
    apr_socket_t *skt;
Packit 3adb1e
    apr_pool_t *pool;
Packit 3adb1e
    apr_pollfd_t desc;
Packit 3adb1e
    void *accept_baton;
Packit 3adb1e
    serf_accept_client_t accept_func;
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
struct serf_incoming_t {
Packit 3adb1e
    serf_context_t *ctx;
Packit 3adb1e
    serf_io_baton_t baton;
Packit 3adb1e
    void *request_baton;
Packit 3adb1e
    serf_incoming_request_cb_t request;
Packit 3adb1e
    apr_socket_t *skt;
Packit 3adb1e
    apr_pollfd_t desc;
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
/* States for the different stages in the lifecyle of a connection. */
Packit 3adb1e
typedef enum {
Packit 3adb1e
    SERF_CONN_INIT,             /* no socket created yet */
Packit 3adb1e
    SERF_CONN_SETUP_SSLTUNNEL,  /* ssl tunnel being setup, no requests sent */
Packit 3adb1e
    SERF_CONN_CONNECTED,        /* conn is ready to send requests */
Packit 3adb1e
    SERF_CONN_CLOSING           /* conn is closing, no more requests,
Packit 3adb1e
                                   start a new socket */
Packit 3adb1e
} serf__connection_state_t;
Packit 3adb1e
Packit 3adb1e
struct serf_connection_t {
Packit 3adb1e
    serf_context_t *ctx;
Packit 3adb1e
Packit 3adb1e
    apr_status_t status;
Packit 3adb1e
    serf_io_baton_t baton;
Packit 3adb1e
Packit 3adb1e
    apr_pool_t *pool;
Packit 3adb1e
    serf_bucket_alloc_t *allocator;
Packit 3adb1e
Packit 3adb1e
    apr_sockaddr_t *address;
Packit 3adb1e
Packit 3adb1e
    apr_socket_t *skt;
Packit 3adb1e
    apr_pool_t *skt_pool;
Packit 3adb1e
Packit 3adb1e
    /* the last reqevents we gave to pollset_add */
Packit 3adb1e
    apr_int16_t reqevents;
Packit 3adb1e
Packit 3adb1e
    /* the events we've seen for this connection in our returned pollset */
Packit 3adb1e
    apr_int16_t seen_in_pollset;
Packit 3adb1e
Packit 3adb1e
    /* are we a dirty connection that needs its poll status updated? */
Packit 3adb1e
    int dirty_conn;
Packit 3adb1e
Packit 3adb1e
    /* number of completed requests we've sent */
Packit 3adb1e
    unsigned int completed_requests;
Packit 3adb1e
Packit 3adb1e
    /* number of completed responses we've got */
Packit 3adb1e
    unsigned int completed_responses;
Packit 3adb1e
Packit 3adb1e
    /* keepalive */
Packit 3adb1e
    unsigned int probable_keepalive_limit;
Packit 3adb1e
Packit 3adb1e
    /* Current state of the connection (whether or not it is connected). */
Packit 3adb1e
    serf__connection_state_t state;
Packit 3adb1e
Packit 3adb1e
    /* This connection may have responses without a request! */
Packit 3adb1e
    int async_responses;
Packit 3adb1e
    serf_bucket_t *current_async_response;
Packit 3adb1e
    serf_response_acceptor_t async_acceptor;
Packit 3adb1e
    void *async_acceptor_baton;
Packit 3adb1e
    serf_response_handler_t async_handler;
Packit 3adb1e
    void *async_handler_baton;
Packit 3adb1e
Packit 3adb1e
    /* A bucket wrapped around our socket (for reading responses). */
Packit 3adb1e
    serf_bucket_t *stream;
Packit 3adb1e
    /* A reference to the aggregate bucket that provides the boundary between
Packit 3adb1e
     * request level buckets and connection level buckets.
Packit 3adb1e
     */
Packit 3adb1e
    serf_bucket_t *ostream_head;
Packit 3adb1e
    serf_bucket_t *ostream_tail;
Packit 3adb1e
Packit 3adb1e
    /* Aggregate bucket used to send the CONNECT request. */
Packit 3adb1e
    serf_bucket_t *ssltunnel_ostream;
Packit 3adb1e
Packit 3adb1e
    /* The list of active requests. */
Packit 3adb1e
    serf_request_t *requests;
Packit 3adb1e
    serf_request_t *requests_tail;
Packit 3adb1e
Packit 3adb1e
    struct iovec vec[IOV_MAX];
Packit 3adb1e
    int vec_len;
Packit 3adb1e
Packit 3adb1e
    serf_connection_setup_t setup;
Packit 3adb1e
    void *setup_baton;
Packit 3adb1e
    serf_connection_closed_t closed;
Packit 3adb1e
    void *closed_baton;
Packit 3adb1e
Packit 3adb1e
    /* Max. number of outstanding requests. */
Packit 3adb1e
    unsigned int max_outstanding_requests;
Packit 3adb1e
Packit 3adb1e
    int hit_eof;
Packit 3adb1e
Packit 3adb1e
    /* Host url, path ommitted, syntax: https://svn.apache.org . */
Packit 3adb1e
    const char *host_url;
Packit 3adb1e
    
Packit 3adb1e
    /* Exploded host url, path ommitted. Only scheme, hostinfo, hostname &
Packit 3adb1e
       port values are filled in. */
Packit 3adb1e
    apr_uri_t host_info;
Packit 3adb1e
Packit 3adb1e
    /* authentication info for this connection. */
Packit 3adb1e
    serf__authn_info_t authn_info;
Packit 3adb1e
Packit 3adb1e
    /* Time marker when connection begins. */
Packit 3adb1e
    apr_time_t connect_time;
Packit 3adb1e
Packit 3adb1e
    /* Calculated connection latency. Negative value if latency is unknown. */
Packit 3adb1e
    apr_interval_time_t latency;
Packit 3adb1e
Packit 3adb1e
    /* Needs to read first before we can write again. */
Packit 3adb1e
    int stop_writing;
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
/*** Internal bucket functions ***/
Packit 3adb1e
Packit 3adb1e
/** Transform a response_bucket in-place into an aggregate bucket. Restore the
Packit 3adb1e
    status line and all headers, not just the body.
Packit 3adb1e
 
Packit 3adb1e
    This can only be used when we haven't started reading the body of the
Packit 3adb1e
    response yet.
Packit 3adb1e
 
Packit 3adb1e
    Keep internal for now, probably only useful within serf.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf_response_full_become_aggregate(serf_bucket_t *bucket);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Remove the header from the list, do nothing if the header wasn't added.
Packit 3adb1e
 */
Packit 3adb1e
void serf__bucket_headers_remove(serf_bucket_t *headers_bucket,
Packit 3adb1e
                                 const char *header);
Packit 3adb1e
Packit 3adb1e
/*** Authentication handler declarations ***/
Packit 3adb1e
Packit 3adb1e
typedef enum { PROXY, HOST } peer_t;
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * For each authentication scheme we need a handler function of type
Packit 3adb1e
 * serf__auth_handler_func_t. This function will be called when an
Packit 3adb1e
 * authentication challenge is received in a session.
Packit 3adb1e
 */
Packit 3adb1e
typedef apr_status_t
Packit 3adb1e
(*serf__auth_handler_func_t)(int code,
Packit 3adb1e
                             serf_request_t *request,
Packit 3adb1e
                             serf_bucket_t *response,
Packit 3adb1e
                             const char *auth_hdr,
Packit 3adb1e
                             const char *auth_attr,
Packit 3adb1e
                             void *baton,
Packit 3adb1e
                             apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * For each authentication scheme we need an initialization function of type
Packit 3adb1e
 * serf__init_context_func_t. This function will be called the first time
Packit 3adb1e
 * serf tries a specific authentication scheme handler.
Packit 3adb1e
 */
Packit 3adb1e
typedef apr_status_t
Packit 3adb1e
(*serf__init_context_func_t)(int code,
Packit 3adb1e
                             serf_context_t *conn,
Packit 3adb1e
                             apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * For each authentication scheme we need an initialization function of type
Packit 3adb1e
 * serf__init_conn_func_t. This function will be called when a new
Packit 3adb1e
 * connection is opened.
Packit 3adb1e
 */
Packit 3adb1e
typedef apr_status_t
Packit 3adb1e
(*serf__init_conn_func_t)(const serf__authn_scheme_t *scheme,
Packit 3adb1e
                          int code,
Packit 3adb1e
                          serf_connection_t *conn,
Packit 3adb1e
                          apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * For each authentication scheme we need a setup_request function of type
Packit 3adb1e
 * serf__setup_request_func_t. This function will be called when a
Packit 3adb1e
 * new serf_request_t object is created and should fill in the correct
Packit 3adb1e
 * authentication headers (if needed).
Packit 3adb1e
 */
Packit 3adb1e
typedef apr_status_t
Packit 3adb1e
(*serf__setup_request_func_t)(peer_t peer,
Packit 3adb1e
                              int code,
Packit 3adb1e
                              serf_connection_t *conn,
Packit 3adb1e
                              serf_request_t *request,
Packit 3adb1e
                              const char *method,
Packit 3adb1e
                              const char *uri,
Packit 3adb1e
                              serf_bucket_t *hdrs_bkt);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * This function will be called when a response is received, so that the 
Packit 3adb1e
 * scheme handler can validate the Authentication related response headers
Packit 3adb1e
 * (if needed).
Packit 3adb1e
 */
Packit 3adb1e
typedef apr_status_t
Packit 3adb1e
(*serf__validate_response_func_t)(const serf__authn_scheme_t *scheme,
Packit 3adb1e
                                  peer_t peer,
Packit 3adb1e
                                  int code,
Packit 3adb1e
                                  serf_connection_t *conn,
Packit 3adb1e
                                  serf_request_t *request,
Packit 3adb1e
                                  serf_bucket_t *response,
Packit 3adb1e
                                  apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * serf__authn_scheme_t: vtable for an authn scheme provider.
Packit 3adb1e
 */
Packit 3adb1e
struct serf__authn_scheme_t {
Packit 3adb1e
    /* The name of this authentication scheme. Used in headers of requests and
Packit 3adb1e
       for logging. */
Packit 3adb1e
    const char *name;
Packit 3adb1e
Packit 3adb1e
    /* Key is the name of the authentication scheme in lower case, to
Packit 3adb1e
       facilitate case insensitive matching of the response headers. */
Packit 3adb1e
    const char *key;
Packit 3adb1e
Packit 3adb1e
    /* Internal code used for this authn type. */
Packit 3adb1e
    int type;
Packit 3adb1e
Packit 3adb1e
    /* The context initialization function if any; otherwise, NULL */
Packit 3adb1e
    serf__init_context_func_t init_ctx_func;
Packit 3adb1e
Packit 3adb1e
    /* The connection initialization function if any; otherwise, NULL */
Packit 3adb1e
    serf__init_conn_func_t init_conn_func;
Packit 3adb1e
Packit 3adb1e
    /* The authentication handler function */
Packit 3adb1e
    serf__auth_handler_func_t handle_func;
Packit 3adb1e
Packit 3adb1e
    /* Function to set up the authentication header of a request */
Packit 3adb1e
    serf__setup_request_func_t setup_request_func;
Packit 3adb1e
Packit 3adb1e
    /* Function to validate the authentication header of a response */
Packit 3adb1e
    serf__validate_response_func_t validate_response_func;
Packit 3adb1e
};
Packit 3adb1e
Packit 3adb1e
/**
Packit 3adb1e
 * Handles a 401 or 407 response, tries the different available authentication
Packit 3adb1e
 * handlers.
Packit 3adb1e
 */
Packit 3adb1e
apr_status_t serf__handle_auth_response(int *consumed_response,
Packit 3adb1e
                                        serf_request_t *request,
Packit 3adb1e
                                        serf_bucket_t *response,
Packit 3adb1e
                                        void *baton,
Packit 3adb1e
                                        apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/* Get the cached serf__authn_info_t object for the target server, or create one
Packit 3adb1e
   when this is the first connection to the server.
Packit 3adb1e
   TODO: The serf__authn_info_t objects are allocated in the context pool, so
Packit 3adb1e
   a context that's used to connect to many different servers using Basic or 
Packit 3adb1e
   Digest authencation will hold on to many objects indefinitely. We should be
Packit 3adb1e
   able to cleanup stale objects from time to time. */
Packit 3adb1e
serf__authn_info_t *serf__get_authn_info_for_server(serf_connection_t *conn);
Packit 3adb1e
Packit 3adb1e
/* fromt context.c */
Packit 3adb1e
void serf__context_progress_delta(void *progress_baton, apr_off_t read,
Packit 3adb1e
                                  apr_off_t written);
Packit 3adb1e
Packit 3adb1e
/* from incoming.c */
Packit 3adb1e
apr_status_t serf__process_client(serf_incoming_t *l, apr_int16_t events);
Packit 3adb1e
apr_status_t serf__process_listener(serf_listener_t *l);
Packit 3adb1e
Packit 3adb1e
/* from outgoing.c */
Packit 3adb1e
apr_status_t serf__open_connections(serf_context_t *ctx);
Packit 3adb1e
apr_status_t serf__process_connection(serf_connection_t *conn,
Packit 3adb1e
                                       apr_int16_t events);
Packit 3adb1e
apr_status_t serf__conn_update_pollset(serf_connection_t *conn);
Packit 3adb1e
serf_request_t *serf__ssltunnel_request_create(serf_connection_t *conn,
Packit 3adb1e
                                               serf_request_setup_t setup,
Packit 3adb1e
                                               void *setup_baton);
Packit 3adb1e
apr_status_t serf__provide_credentials(serf_context_t *ctx,
Packit 3adb1e
                                       char **username,
Packit 3adb1e
                                       char **password,
Packit 3adb1e
                                       serf_request_t *request,
Packit 3adb1e
                                       void *baton,
Packit 3adb1e
                                       int code, const char *authn_type,
Packit 3adb1e
                                       const char *realm,
Packit 3adb1e
                                       apr_pool_t *pool);
Packit 3adb1e
Packit 3adb1e
/* from ssltunnel.c */
Packit 3adb1e
apr_status_t serf__ssltunnel_connect(serf_connection_t *conn);
Packit 3adb1e
Packit 3adb1e
Packit 3adb1e
/** Logging functions. Use one of the [COMP]_VERBOSE flags to enable specific
Packit 3adb1e
    logging. 
Packit 3adb1e
 **/
Packit 3adb1e
Packit 3adb1e
/* Logs a standard event, with filename & timestamp header */
Packit 3adb1e
void serf__log(int verbose_flag, const char *filename, const char *fmt, ...);
Packit 3adb1e
Packit 3adb1e
/* Logs a standard event, but without prefix. This is useful to build up
Packit 3adb1e
 log lines in parts. */
Packit 3adb1e
void serf__log_nopref(int verbose_flag, const char *fmt, ...);
Packit 3adb1e
Packit 3adb1e
/* Logs a socket event, add local and remote ip address:port */
Packit 3adb1e
void serf__log_skt(int verbose_flag, const char *filename, apr_socket_t *skt,
Packit 3adb1e
                   const char *fmt, ...);
Packit 3adb1e
Packit 3adb1e
#endif