/* handle the scheme */
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"Trying to run scheme_handler against proxy");
- access_status = proxy_run_scheme_handler(r, conf, url, ents[i].hostname, ents[i].port);
+ access_status = proxy_run_scheme_handler(r, worker, conf, url, ents[i].hostname, ents[i].port);
/* an error or success */
if (access_status != DECLINED && access_status != HTTP_BAD_GATEWAY) {
/* handle the scheme */
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"Trying to run scheme_handler");
- access_status = proxy_run_scheme_handler(r, conf, url, NULL, 0);
+ access_status = proxy_run_scheme_handler(r, worker, conf, url, NULL, 0);
if (DECLINED == access_status) {
ap_log_error(APLOG_MARK, APLOG_WARNING, 0, r->server,
"proxy: No protocol handler was valid for the URL %s. "
}
}
else {
- proxy_worker *worker = ap_proxy_get_worker(cmd->pool, conf, r);
+ proxy_worker *worker = ap_proxy_get_worker(cmd->temp_pool, conf, r);
if (!worker) {
const char *err = ap_proxy_add_worker(&worker, cmd->pool, conf, r);
if (err)
)
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, scheme_handler,
- (request_rec *r, proxy_server_conf *conf,
- char *url, const char *proxyhost,
- apr_port_t proxyport),(r,conf,url,
- proxyhost,proxyport),DECLINED)
+ (request_rec *r, proxy_worker *worker,
+ proxy_server_conf *conf,
+ char *url, const char *proxyhost,
+ apr_port_t proxyport),(r,worker,conf,
+ url,proxyhost,proxyport),DECLINED)
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, canon_handler,
- (request_rec *r, char *url),(r,
- url),DECLINED)
+ (request_rec *r, char *url),(r,
+ url),DECLINED)
APR_IMPLEMENT_EXTERNAL_HOOK_RUN_FIRST(proxy, PROXY, int, pre_request, (
proxy_worker **worker,
proxy_balancer **balancer,
APR_OPTIONAL_HOOK(proxy,name,fn,pre,succ,order)
APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, scheme_handler, (request_rec *r,
- proxy_server_conf *conf, char *url,
+ proxy_worker *worker, proxy_server_conf *conf, char *url,
const char *proxyhost, apr_port_t proxyport))
APR_DECLARE_EXTERNAL_HOOK(proxy, PROXY, int, canon_handler, (request_rec *r,
char *url))
PROXY_DECLARE(const char *) ap_proxy_add_balancer(proxy_balancer **balancer, apr_pool_t *p, proxy_server_conf *conf, const char *url);
PROXY_DECLARE(void) ap_proxy_add_worker_to_balancer(proxy_balancer *balancer, proxy_worker *worker);
PROXY_DECLARE(int) ap_proxy_pre_request(proxy_worker **worker, proxy_balancer **balancer, request_rec *r, proxy_server_conf *conf, char **url);
-PROXY_DECLARE(apr_status_t) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn,
- apr_pool_t *ppool, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport,
- char *server_portstr, int server_portstr_size);
+PROXY_DECLARE(int) ap_proxy_determine_connection(apr_pool_t *p, request_rec *r, proxy_server_conf *conf, proxy_worker *worker, proxy_conn_rec *conn,
+ apr_pool_t *ppool, apr_uri_t *uri, char **url, const char *proxyname, apr_port_t proxyport,
+ char *server_portstr, int server_portstr_size);
PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function, proxy_conn_rec **conn, proxy_worker *worker, server_rec *s);
PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function, proxy_conn_rec *conn, server_rec *s);
PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn);
PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function, proxy_conn_rec *conn, proxy_worker *worker, server_rec *s);
-PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, int close_on_recycle, conn_rec *c, server_rec *s);
+PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn, conn_rec *c, server_rec *s);
/* For proxy_util */
extern module PROXY_DECLARE_DATA proxy_module;
char *c, *uri = apr_pstrdup(p, url);
int i;
- c = strchr(url, ':');
+ c = strchr(uri, ':');
if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
return NULL;
/* remove path from uri */
int port;
apr_status_t rc = 0;
- c = strchr(url, ':');
+ c = strchr(uri, ':');
if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
return "Bad syntax for a remote proxy server";
/* remove path from uri */
if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) {
return "Bad syntax for a remote proxy server (bad port number)";
}
- *q = '\0';
}
else
port = -1;
ap_str_tolower(uri);
*balancer = apr_array_push(conf->balancers);
- (*balancer)->name = apr_pstrdup(p, uri);
- *c = '\0';
+ (*balancer)->name = uri;
(*balancer)->workers = apr_array_make(p, 5, sizeof(proxy_runtime_worker));
/* XXX Is this a right place to create mutex */
#if APR_HAS_THREADS
char *c, *uri = apr_pstrdup(p, url);
int i;
- c = strchr(url, ':');
+ c = strchr(uri, ':');
if (c == NULL || c[1] != '/' || c[2] != '/' || c[3] == '\0')
return NULL;
/* remove path from uri */
if ((c = strchr(c + 3, '/')))
*c = '\0';
+
worker = (proxy_worker *)conf->workers->elts;
for (i = 0; i < conf->workers->nelts; i++) {
- if (strcasecmp(worker->name, uri) == 0)
+ if (strcasecmp(worker->name, uri) == 0) {
return worker;
+ }
worker++;
}
return NULL;
}
+static apr_status_t conn_pool_cleanup(void *thepool)
+{
+ proxy_conn_pool *cp = (proxy_conn_pool *)thepool;
+ /* Close the socket */
+ cp->addr = NULL;
+ return APR_SUCCESS;
+}
+
static void init_conn_pool(apr_pool_t *p, proxy_worker *worker)
{
apr_pool_t *pool;
* proxy_conn_pool is permanently attached to the worker.
*/
cp = (proxy_conn_pool *)apr_pcalloc(p, sizeof(proxy_conn_pool));
- cp->pool = pool;
-#if APR_HAS_THREADS
- {
- int mpm_threads;
- ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
- if (mpm_threads > 1) {
- /* Set hard max to no more then mpm_threads */
- if (worker->hmax == 0 || worker->hmax > mpm_threads)
- worker->hmax = mpm_threads;
- if (worker->smax == 0 || worker->smax > worker->hmax)
- worker->smax = worker->hmax;
- /* Set min to be lower then smax */
- if (worker->min > worker->smax)
- worker->min = worker->smax;
- }
- else {
- /* This will supress the apr_reslist creation */
- worker->min = worker->smax = worker->hmax = 0;
- }
- }
-#endif
-
+ cp->pool = pool;
worker->cp = cp;
+ apr_pool_cleanup_register(p, (void *)cp,
+ conn_pool_cleanup,
+ apr_pool_cleanup_null);
+
}
PROXY_DECLARE(const char *) ap_proxy_add_worker(proxy_worker **worker,
if (sscanf(q + 1, "%u", &port) != 1 || port > 65535) {
return "Bad syntax for a remote proxy server (bad port number)";
}
- *q = '\0';
}
else
port = -1;
ap_str_tolower(uri);
*worker = apr_array_push(conf->workers);
- (*worker)->name = apr_pstrdup(p, url);
+ memset(*worker, 0, sizeof(proxy_worker));
+ (*worker)->name = (*worker)->hostname = apr_pstrdup(p, uri);
*c = '\0';
(*worker)->scheme = uri;
if (port == -1)
if (conn->sock)
apr_socket_close(conn->sock);
conn->sock = NULL;
+ conn->pool = NULL;
return APR_SUCCESS;
}
if (conn->sock)
apr_socket_close(conn->sock);
conn->sock = NULL;
-
}
conn->connection = NULL;
ap_proxy_release_connection(NULL, conn, NULL);
*resource = conn;
/* register the pool cleanup */
apr_pool_cleanup_register(ctx, (void *)conn,
- proxy_conn_cleanup, apr_pool_cleanup_null);
+ proxy_conn_cleanup,
+ apr_pool_cleanup_null);
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
"proxy: socket is constructed");
proxy_conn_rec *conn = (proxy_conn_rec *)resource;
server_rec *s = (server_rec *)params;
- apr_pool_destroy(conn->pool);
+#if 0
+ if (conn->sock)
+ apr_socket_close(conn->sock);
+ conn->sock = NULL;
+ apr_pool_cleanup_kill(conn->pool, conn, proxy_conn_cleanup);
+#endif
+ if (conn->pool)
+ apr_pool_destroy(conn->pool);
+ conn->pool = NULL;
+#if 0
if (s != NULL)
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
"proxy: socket is destructed");
-
+#endif
return APR_SUCCESS;
}
*/
PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn)
{
+
if (conn->worker && conn->worker->cp)
conn->worker->cp->conn = NULL;
return connection_destructor(conn, NULL, NULL);
static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s)
{
apr_status_t rv;
+
#if APR_HAS_THREADS
+ int mpm_threads;
+
+ ap_mpm_query(AP_MPMQ_MAX_THREADS, &mpm_threads);
+ if (mpm_threads > 1) {
+ /* Set hard max to no more then mpm_threads */
+ if (worker->hmax == 0 || worker->hmax > mpm_threads)
+ worker->hmax = mpm_threads;
+ if (worker->smax == 0 || worker->smax > worker->hmax)
+ worker->smax = worker->hmax;
+ /* Set min to be lower then smax */
+ if (worker->min > worker->smax)
+ worker->min = worker->smax;
+ }
+ else {
+ /* This will supress the apr_reslist creation */
+ worker->min = worker->smax = worker->hmax = 0;
+ }
if (worker->hmax) {
rv = apr_reslist_create(&(worker->cp->res),
worker->min, worker->smax,
server_rec *s)
{
apr_status_t rv;
+
+ if (!worker->status) {
+ if ((rv = init_conn_worker(worker, s)) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
+ "proxy: %s: failed to initialize worker for (%s)",
+ proxy_function, worker->hostname);
+ return DECLINED;
+ }
+ /* TODO: make worker status codes */
+ worker->status = 1;
+ }
#if APR_HAS_THREADS
if (worker->hmax) {
rv = apr_reslist_acquire(worker->cp->res, (void **)conn);
apr_pool_cleanup_kill(conn->connection->pool, conn, connection_cleanup);
#if APR_HAS_THREADS
- if (worker->hmax) {
+ if (worker->hmax && worker->cp->res) {
rv = apr_reslist_release(worker->cp->res, (void *)conn);
}
else
return OK;
}
-PROXY_DECLARE(apr_status_t)
+PROXY_DECLARE(int)
ap_proxy_determine_connection(apr_pool_t *p, request_rec *r,
proxy_server_conf *conf,
proxy_worker *worker,
PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
proxy_conn_rec *conn,
- int close_on_recycle,
conn_rec *c,
server_rec *s)
{
/* TODO: See if this will break FTP */
ap_proxy_ssl_disable(conn->connection);
}
- conn->close_on_recycle = close_on_recycle;
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s,
"proxy: %s: connection complete to %pI (%s)",
/* register the connection cleanup to client connection
* so that the connection can be closed or reused
*/
- apr_pool_cleanup_register(c->pool, (void *)conn, connection_cleanup,
+ apr_pool_cleanup_register(conn->connection->pool, (void *)conn,
+ connection_cleanup,
apr_pool_cleanup_null);
return OK;