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(apr_status_t) ap_proxy_destroy_connection(proxy_conn_rec *conn);
+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,
- proxy_server_conf *conf, server_rec *s);
-PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function, proxy_conn_rec *conn,
- proxy_server_conf *conf, conn_rec *c, server_rec *s);
+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, conn_rec *c, server_rec *s);
+
/* For proxy_util */
extern module PROXY_DECLARE_DATA proxy_module;
return APR_SUCCESS;
}
-/* Destroy the connection */
-PROXY_DECLARE(apr_status_t) ap_proxy_destroy_connection(proxy_conn_rec *conn)
-{
- return connection_destructor(conn, NULL, NULL);
-}
-
-/* Destroy the connection */
+/* Close the connection
+ * The proxy_conn_rec from now on can not be used
+ */
PROXY_DECLARE(apr_status_t) ap_proxy_close_connection(proxy_conn_rec *conn)
{
- apr_status_t rv = APR_EOF;
- /* Close the socket */
- if (conn->sock)
- rv = apr_socket_close(conn->sock);
- conn->sock = NULL;
- return rv;
+ if (conn->worker && conn->worker->cp)
+ conn->worker->cp->conn = NULL;
+ return connection_destructor(conn, NULL, NULL);
}
-/* low level connection acquire/release functions
- * they are hiding apr_reslist for nothreaded or prefork servers.
- */
-static apr_status_t acquire_connection_low(proxy_conn_rec **conn, proxy_worker *worker)
+static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s)
{
apr_status_t rv;
#if APR_HAS_THREADS
if (worker->hmax) {
- rv = apr_reslist_acquire(worker->cp->res, (void **)conn);
+ rv = apr_reslist_create(&(worker->cp->res),
+ worker->min, worker->smax,
+ worker->hmax, worker->ttl,
+ connection_constructor, connection_destructor,
+ s, worker->cp->pool);
+#if (APR_MAJOR_VERSION > 0)
+ /* Set the acquire timeout */
+ if (rv == APR_SUCCESS && worker->acquire_set)
+ apr_reslist_timeout_set(worker->cp->res, worker->acquire);
+#endif
}
else
#endif
{
- *conn = worker->cp->conn;
- worker->cp->conn = NULL;
+
+ connection_constructor((void **)&(worker->cp->conn), s, worker->cp->pool);
rv = APR_SUCCESS;
}
return rv;
}
-static apr_status_t release_connection_low(proxy_conn_rec *conn, proxy_worker *worker)
+PROXY_DECLARE(int) ap_proxy_acquire_connection(const char *proxy_function,
+ proxy_conn_rec **conn,
+ proxy_worker *worker,
+ server_rec *s)
{
- apr_status_t rv = APR_SUCCESS;
+ apr_status_t rv;
#if APR_HAS_THREADS
if (worker->hmax) {
- rv = apr_reslist_release(worker->cp->res, (void *)conn);
+ rv = apr_reslist_acquire(worker->cp->res, (void **)conn);
}
else
#endif
{
- worker->cp->conn = conn;
+ /* create the new connection if the previous was destroyed */
+ if (!worker->cp->conn)
+ connection_constructor((void **)conn, s, worker->cp->pool);
+ else {
+ *conn = worker->cp->conn;
+ worker->cp->conn = NULL;
+ }
+ rv = APR_SUCCESS;
}
- return rv;
-}
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
+ "proxy: %s: failed to acquire connection for (%s)",
+ proxy_function, worker->hostname);
+ return DECLINED;
+ }
+ return OK;
+}
-static apr_status_t init_conn_worker(proxy_worker *worker, server_rec *s)
+PROXY_DECLARE(int) ap_proxy_release_connection(const char *proxy_function,
+ proxy_conn_rec *conn,
+ server_rec *s)
{
- apr_status_t rv;
+ apr_status_t rv = APR_SUCCESS;
+ proxy_worker *worker = conn->worker;
+
+ if (!worker) {
+ /* something bad happened. Obviously bug.
+ * for now make a core dump.
+ */
+ }
#if APR_HAS_THREADS
if (worker->hmax) {
- rv = apr_reslist_create(&(worker->cp->res),
- worker->min, worker->smax,
- worker->hmax, worker->ttl,
- connection_constructor, connection_destructor,
- s, worker->cp->pool);
-#if (APR_MAJOR_VERSION > 0)
- /* Set the acquire timeout */
- if (rv == APR_SUCCESS && worker->acquire_set)
- apr_reslist_timeout_set(worker->cp->res, worker->acquire);
-#endif
+ rv = apr_reslist_release(worker->cp->res, (void *)conn);
}
else
#endif
{
-
- connection_constructor((void **)&(worker->cp->conn), s, worker->cp->pool);
- rv = APR_SUCCESS;
+ worker->cp->conn = conn;
}
- return rv;
+ if (rv != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
+ "proxy: %s: failed to acquire connection for (%s)",
+ proxy_function, conn->hostname);
+ return DECLINED;
+ }
+ return OK;
}
PROXY_DECLARE(apr_status_t)
PROXY_DECLARE(int) ap_proxy_connect_backend(const char *proxy_function,
proxy_conn_rec *conn,
proxy_worker *worker,
- proxy_server_conf *conf,
server_rec *s)
{
apr_status_t rv;
}
#if !defined(TPF) && !defined(BEOS)
- if (conf->recv_buffer_size > 0 &&
+ if (worker->recv_buffer_size > 0 &&
(rv = apr_socket_opt_set(newsock, APR_SO_RCVBUF,
- conf->recv_buffer_size))) {
+ worker->recv_buffer_size))) {
ap_log_error(APLOG_MARK, APLOG_ERR, rv, s,
"apr_socket_opt_set(SO_RCVBUF): Failed to set "
"ProxyReceiveBufferSize, using default");
continue;
}
- conn->sock = newsock;
- conn->worker = worker;
- /* XXX: the hostname will go from proxy_conn_rec
- * keep for now.
- * We will 'optimize' later, both code and unneeded data
- */
- conn->hostname = worker->hostname;
- connected = 1;
+ conn->sock = newsock;
+ conn->worker = worker;
+ connected = 1;
}
return connected ? OK : DECLINED;
}
PROXY_DECLARE(int) ap_proxy_connection_create(const char *proxy_function,
proxy_conn_rec *conn,
- proxy_server_conf *conf,
conn_rec *c,
server_rec *s)
{