Commit 6695d74c authored by Brian Pane's avatar Brian Pane
Browse files

Forward-port of wrowe's NET_TIME filter removal/refactor into

the async-dev branch, in preparation for developing async write
completion in this branch on top of the new timeout design.
http://svn.apache.org/viewcvs.cgi?rev=306495&view=rev


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/async-dev@306541 13f79535-47bb-0310-9956-ffa450edef68
parent b1dad5e7
Loading
Loading
Loading
Loading
+5 −3
Original line number Diff line number Diff line
@@ -105,14 +105,16 @@
 * 20050701.1 (2.1.7-dev) trace_enable member added to core server_config
 * 20050708.0 (2.1.7-dev) Bump MODULE_MAGIC_COOKIE to "AP22"!
 * 20050708.1 (2.1.7-dev) add proxy request_status hook (minor)
 * 20050919.0 (2.1.8-dev) mod_ssl ssl_ext_list optional function added
 * 20051005.0 (2.1.8-dev) NET_TIME filter eliminated
 */

#define MODULE_MAGIC_COOKIE 0x41503232UL /* "AP22" */

#ifndef MODULE_MAGIC_NUMBER_MAJOR
#define MODULE_MAGIC_NUMBER_MAJOR 20050708
#define MODULE_MAGIC_NUMBER_MAJOR 20051005
#endif
#define MODULE_MAGIC_NUMBER_MINOR 1                     /* 0...n */
#define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */

/**
 * Determine if the server's current MODULE_MAGIC_NUMBER is at least a
+0 −4
Original line number Diff line number Diff line
@@ -600,9 +600,6 @@ AP_CORE_DECLARE(void) ap_add_file_conf(core_dir_config *conf, void *url_config);
AP_CORE_DECLARE_NONSTD(const char *) ap_limit_section(cmd_parms *cmd, void *dummy, const char *arg);

/* Core filters; not exported. */
int ap_net_time_filter(ap_filter_t *f, apr_bucket_brigade *b,
                       ap_input_mode_t mode, apr_read_type_e block,
                       apr_off_t readbytes);
int ap_core_input_filter(ap_filter_t *f, apr_bucket_brigade *b,
                         ap_input_mode_t mode, apr_read_type_e block,
                         apr_off_t readbytes);
@@ -641,7 +638,6 @@ typedef struct {
extern AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle;
extern AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle;

/**
+4 −4
Original line number Diff line number Diff line
@@ -157,7 +157,6 @@ static int ap_process_http_async_connection(conn_rec *c)
static int ap_process_http_connection(conn_rec *c)
{
    request_rec *r;
    int csd_set = 0;
    apr_socket_t *csd = NULL;

    /*
@@ -186,12 +185,13 @@ static int ap_process_http_connection(conn_rec *c)
 
        if (ap_graceful_stop_signalled())
            break;
        /* Go straight to select() to wait for the next request */
        if (!csd_set) {

        if (!csd) {
            csd = ap_get_module_config(c->conn_config, &core_module);
            csd_set = 1;
        }
        apr_socket_opt_set(csd, APR_INCOMPLETE_READ, 1);
        apr_socket_timeout_set(csd, c->base_server->keep_alive_timeout);
        /* Go straight to select() to wait for the next request */
    }
 
    return OK;
+20 −43
Original line number Diff line number Diff line
@@ -21,7 +21,6 @@
#include "apr_hash.h"
#include "apr_thread_proc.h"    /* for RLIMIT stuff */
#include "apr_hooks.h"
#include "apr_optional.h"

#define APR_WANT_IOVEC
#define APR_WANT_STRFUNC
@@ -49,7 +48,6 @@
#include "mod_core.h"
#include "mod_proxy.h"
#include "ap_listen.h"
#include "ap_mpm.h"

#include "mod_so.h" /* for ap_find_loaded_module_symbol */

@@ -92,13 +90,9 @@ AP_IMPLEMENT_HOOK_RUN_ALL(int, get_mgmt_items,
/* Handles for core filters */
AP_DECLARE_DATA ap_filter_rec_t *ap_subreq_core_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_core_output_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_core_mpm_write_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_content_length_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_net_time_filter_handle;
AP_DECLARE_DATA ap_filter_rec_t *ap_core_input_filter_handle;

static APR_OPTIONAL_FN_TYPE(ap_mpm_custom_write_filter) *mpm_write_func;

/* magic pointer for ErrorDocument xxx "default" */
static char errordocument_default;

@@ -3681,25 +3675,9 @@ APR_OPTIONAL_FN_TYPE(ap_logio_add_bytes_out) *logio_add_bytes_out;

static int core_post_config(apr_pool_t *pconf, apr_pool_t *plog, apr_pool_t *ptemp, server_rec *s)
{
    int mpm_write = 0;

    logio_add_bytes_out = APR_RETRIEVE_OPTIONAL_FN(ap_logio_add_bytes_out);
    ident_lookup = APR_RETRIEVE_OPTIONAL_FN(ap_ident_lookup);

    if (ap_mpm_query(AP_MPMQ_CUSTOM_WRITE, &mpm_write) == APR_SUCCESS
        && mpm_write == 1) {
        mpm_write_func = APR_RETRIEVE_OPTIONAL_FN(ap_mpm_custom_write_filter);

        ap_core_output_filter_handle =
            ap_register_output_filter("CORE", mpm_write_func,
                                      NULL, AP_FTYPE_NETWORK);
    }
    else {
        ap_core_output_filter_handle =
            ap_register_output_filter("CORE", ap_core_output_filter,
                                      NULL, AP_FTYPE_NETWORK);
    }

    ap_set_version(pconf);
    ap_setup_make_content_type(pconf);
    return OK;
@@ -3780,19 +3758,10 @@ static int core_create_req(request_rec *r)
    }
    else {
        req_cfg->bb = apr_brigade_create(r->pool, r->connection->bucket_alloc);
        if (!r->prev) {
            ap_add_input_filter_handle(ap_net_time_filter_handle,
                                       NULL, r, r->connection);
        }
    }

    ap_set_module_config(r->request_config, &core_module, req_cfg);

    /* Begin by presuming any module can make its own path_info assumptions,
     * until some module interjects and changes the value.
     */
    r->used_path_info = AP_REQ_DEFAULT_PATH_INFO;

    return OK;
}

@@ -3855,10 +3824,9 @@ static conn_rec *core_create_conn(apr_pool_t *ptrans, server_rec *server,
static int core_pre_connection(conn_rec *c, void *csd)
{
    core_net_rec *net = apr_palloc(c->pool, sizeof(*net));

#ifdef AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK
    apr_status_t rv;

#ifdef AP_MPM_DISABLE_NAGLE_ACCEPTED_SOCK
    /* The Nagle algorithm says that we should delay sending partial
     * packets in hopes of getting more data.  We don't want to do
     * this; we are not telnet.  There are bad interactions between
@@ -3875,6 +3843,20 @@ static int core_pre_connection(conn_rec *c, void *csd)
                      "apr_socket_opt_set(APR_TCP_NODELAY)");
    }
#endif

    /* The core filter requires the timeout mode to be set, which
     * incidentally sets the socket to be nonblocking.  If this
     * is not initialized correctly, Linux - for example - will
     * be initially blocking, while Solaris will be non blocking
     * and any initial read will fail.
     */
    rv = apr_socket_timeout_set(csd, c->base_server->timeout);
    if (rv != APR_SUCCESS) {
        /* expected cause is that the client disconnected already */
        ap_log_cerror(APLOG_MARK, APLOG_DEBUG, rv, c,
                      "apr_socket_timeout_set");
    }

    net->c = c;
    net->in_ctx = NULL;
    net->out_ctx = NULL;
@@ -3882,10 +3864,7 @@ static int core_pre_connection(conn_rec *c, void *csd)

    ap_set_module_config(net->c->conn_config, &core_module, csd);
    ap_add_input_filter_handle(ap_core_input_filter_handle, net, NULL, net->c);

    ap_add_output_filter_handle(ap_core_output_filter_handle, net, 
                                NULL, net->c);

    ap_add_output_filter_handle(ap_core_output_filter_handle, net, NULL, net->c);
    return DONE;
}

@@ -3924,14 +3903,12 @@ static void register_hooks(apr_pool_t *p)
    ap_core_input_filter_handle =
        ap_register_input_filter("CORE_IN", ap_core_input_filter,
                                 NULL, AP_FTYPE_NETWORK);
    ap_net_time_filter_handle =
        ap_register_input_filter("NET_TIME", ap_net_time_filter,
                                 NULL, AP_FTYPE_PROTOCOL);
    ap_content_length_filter_handle =
        ap_register_output_filter("CONTENT_LENGTH", ap_content_length_filter,
                                  NULL, AP_FTYPE_PROTOCOL);


    ap_core_output_filter_handle =
        ap_register_output_filter("CORE", ap_core_output_filter,
                                  NULL, AP_FTYPE_NETWORK);
    ap_subreq_core_filter_handle =
        ap_register_output_filter("SUBREQ_CORE", ap_sub_req_output_filter,
                                  NULL, AP_FTYPE_CONTENT_SET);
+0 −35
Original line number Diff line number Diff line
@@ -60,41 +60,6 @@
#define AP_MIN_SENDFILE_BYTES           (256)
// #define APR_HAS_SENDFILE 0

typedef struct net_time_filter_ctx {
    apr_socket_t *csd;
    int           first_line;
} net_time_filter_ctx_t;

int ap_net_time_filter(ap_filter_t *f, apr_bucket_brigade *b,
                       ap_input_mode_t mode, apr_read_type_e block,
                       apr_off_t readbytes)
{
    net_time_filter_ctx_t *ctx = f->ctx;
    int keptalive = f->c->keepalive == AP_CONN_KEEPALIVE;

    if (!ctx) {
        f->ctx = ctx = apr_palloc(f->r->pool, sizeof(*ctx));
        ctx->first_line = 1;
        ctx->csd = ap_get_module_config(f->c->conn_config, &core_module);        
    }

    if (mode != AP_MODE_INIT && mode != AP_MODE_EATCRLF) {
        if (ctx->first_line) {
            apr_socket_timeout_set(ctx->csd, 
                                   keptalive
                                      ? f->c->base_server->keep_alive_timeout
                                      : f->c->base_server->timeout);
            ctx->first_line = 0;
        }
        else {
            if (keptalive) {
                apr_socket_timeout_set(ctx->csd, f->c->base_server->timeout);
            }
        }
    }
    return ap_get_brigade(f->next, b, mode, block, readbytes);
}

/**
 * Remove all zero length buckets from the brigade.
 */
Loading