diff --git a/changes-entries/ap_create_connection.txt b/changes-entries/ap_create_connection.txt new file mode 100644 index 0000000000..834e5c4a3d --- /dev/null +++ b/changes-entries/ap_create_connection.txt @@ -0,0 +1,2 @@ + *) core: Add ap_create_connection() to create either a server or client/proxy + connection. \ No newline at end of file diff --git a/include/ap_mmn.h b/include/ap_mmn.h index 4686cd3cb4..349e56274c 100644 --- a/include/ap_mmn.h +++ b/include/ap_mmn.h @@ -679,6 +679,7 @@ * ap_proxy_define_worker_ex() to mod_proxy.h * 20210531.3 (2.5.1-dev) Add hook child_stopping to get informed that a child * is being shut down. + * 20210531.4 (2.5.1-dev) Add ap_create_connection */ #define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */ @@ -686,7 +687,7 @@ #ifndef MODULE_MAGIC_NUMBER_MAJOR #define MODULE_MAGIC_NUMBER_MAJOR 20210531 #endif -#define MODULE_MAGIC_NUMBER_MINOR 3 /* 0...n */ +#define MODULE_MAGIC_NUMBER_MINOR 4 /* 0...n */ /** * Determine if the server's current MODULE_MAGIC_NUMBER is at least a diff --git a/include/http_connection.h b/include/http_connection.h index 8bc009da3b..b49a2577c5 100644 --- a/include/http_connection.h +++ b/include/http_connection.h @@ -135,6 +135,28 @@ AP_DECLARE_HOOK(int,process_connection,(conn_rec *c)) */ AP_DECLARE_HOOK(int,pre_close_connection,(conn_rec *c)) +/** + * Create a new server/incoming or client/outgoing/proxy connection + * @param p The pool from which to allocate the connection record + * @param server The server record to create the connection too. + * @param csd The socket that has been accepted + * @param conn_id A unique identifier for this connection. The ID only + * needs to be unique at that time, not forever. + * @param sbh A handle to scoreboard information for this connection. + * @param alloc The bucket allocator to use for all bucket/brigade creations + * @param outgoing Whether it's an outgoing (client) connection + * @return An allocated connection record or NULL. + * @remark To allow for future flags, outgoing must be a boolean (0 or 1) + * for now, otherwise NULL is returned + */ +AP_DECLARE(conn_rec *) ap_create_connection(apr_pool_t *p, + server_rec *server, + apr_socket_t *csd, + long conn_id, void *sbh, + apr_bucket_alloc_t *alloc, + unsigned int outgoing); + + /** End Of Connection (EOC) bucket */ AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eoc; diff --git a/modules/proxy/mod_proxy_connect.c b/modules/proxy/mod_proxy_connect.c index 21b0aef319..7e503e3322 100644 --- a/modules/proxy/mod_proxy_connect.c +++ b/modules/proxy/mod_proxy_connect.c @@ -261,8 +261,8 @@ static int proxy_connect_handler(request_rec *r, proxy_worker *worker, * Send the HTTP/1.1 CONNECT request to the remote server */ - backconn = ap_run_create_connection(c->pool, r->server, sock, - c->id, c->sbh, c->bucket_alloc); + backconn = ap_create_connection(c->pool, r->server, sock, 0, NULL, + c->bucket_alloc, 1); if (!backconn) { /* peer reset */ ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01021) diff --git a/modules/proxy/mod_proxy_ftp.c b/modules/proxy/mod_proxy_ftp.c index 77610e7df3..7df4a26f32 100644 --- a/modules/proxy/mod_proxy_ftp.c +++ b/modules/proxy/mod_proxy_ftp.c @@ -1968,11 +1968,11 @@ static int proxy_ftp_handler(request_rec *r, proxy_worker *worker, } /* the transfer socket is now open, create a new connection */ - data = ap_run_create_connection(p, r->server, data_sock, r->connection->id, - r->connection->sbh, c->bucket_alloc); + data = ap_create_connection(p, r->server, data_sock, 0, NULL, + c->bucket_alloc, 1); if (!data) { /* - * the peer reset the connection already; ap_run_create_connection() closed + * the peer reset the connection already; ap_create_connection() closed * the socket */ ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01054) diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 29e13d551c..7b67276ed4 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -3404,13 +3404,12 @@ static int proxy_connection_create(const char *proxy_function, /* * The socket is now open, create a new backend server connection */ - conn->connection = ap_run_create_connection(conn->scpool, s, conn->sock, - 0, NULL, - bucket_alloc); + conn->connection = ap_create_connection(conn->scpool, s, conn->sock, + 0, NULL, bucket_alloc, 1); if (!conn->connection) { /* - * the peer reset the connection already; ap_run_create_connection() + * the peer reset the connection already; ap_create_connection() * closed the socket */ ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, diff --git a/server/connection.c b/server/connection.c index b0093e16c9..a6dfef7858 100644 --- a/server/connection.c +++ b/server/connection.c @@ -43,6 +43,29 @@ AP_IMPLEMENT_HOOK_RUN_FIRST(int,process_connection,(conn_rec *c),(c),DECLINED) AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_connection,(conn_rec *c, void *csd),(c, csd),OK,DECLINED) AP_IMPLEMENT_HOOK_RUN_ALL(int,pre_close_connection,(conn_rec *c),(c),OK,DECLINED) +AP_DECLARE(conn_rec *) ap_create_connection(apr_pool_t *p, + server_rec *server, + apr_socket_t *csd, + long conn_id, void *sbh, + apr_bucket_alloc_t *alloc, + unsigned int outgoing) +{ + conn_rec *c; + + /* Some day it may be flags, so deny anything but 0 or 1 for now */ + if (outgoing > 1) { + return NULL; + } + + c = ap_run_create_connection(p, server, csd, conn_id, sbh, alloc); + + if (c && outgoing) { + c->outgoing = 1; + } + + return c; +} + /* * More machine-dependent networking gooo... on some systems, * you've got to be *really* sure that all the packets are acknowledged diff --git a/server/log.c b/server/log.c index baa0b69043..89e1679fed 100644 --- a/server/log.c +++ b/server/log.c @@ -914,14 +914,14 @@ static int do_errorlog_default(const ap_errorlog_info *info, char *buf, * a scoreboard handle, it is likely a client. */ if (info->r) { - len += apr_snprintf(buf + len, buflen - len, - info->r->connection->sbh ? "[client %s:%d] " : "[remote %s:%d] ", + len += apr_snprintf(buf + len, buflen - len, "[%s %s:%d] ", + info->r->connection->outgoing ? "remote" : "client", info->r->useragent_ip, info->r->useragent_addr ? info->r->useragent_addr->port : 0); } else if (info->c) { - len += apr_snprintf(buf + len, buflen - len, - info->c->sbh ? "[client %s:%d] " : "[remote %s:%d] ", + len += apr_snprintf(buf + len, buflen - len, "[%s %s:%d] ", + info->c->outgoing ? "remote" : "client", info->c->client_ip, info->c->client_addr ? info->c->client_addr->port : 0); }