]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
core: Add ap_create_connection() to create a server or client/proxy connection.
authorYann Ylavic <ylavic@apache.org>
Thu, 9 Sep 2021 16:55:24 +0000 (16:55 +0000)
committerYann Ylavic <ylavic@apache.org>
Thu, 9 Sep 2021 16:55:24 +0000 (16:55 +0000)
c->outgoing shouldn't be set by mod_ssl, ap_create_connection() allows that
and this commit also replaces all the calls to ap_run_create_connection() in
mod_proxy modules (not in the MPMs which create incoming connections only).

* include/http_connection.h, server/connection.c:
  Declare and implement ap_create_connection().

* modules/proxy/proxy_util.c, modules/proxy/mod_proxy_connect.c,
  modules/proxy/mod_proxy_ftp.c:
  Use ap_create_connection() instead of ap_run_create_connection(), and don't
  provide a connection_id a scoreboard handle for outgoing connection.

* server/log.c(do_errorlog_default):
  Use c->outgoing instead of c->sbh to determine if it's a "client" or "remote"
  connection.

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1893184 13f79535-47bb-0310-9956-ffa450edef68

changes-entries/ap_create_connection.txt [new file with mode: 0644]
include/ap_mmn.h
include/http_connection.h
modules/proxy/mod_proxy_connect.c
modules/proxy/mod_proxy_ftp.c
modules/proxy/proxy_util.c
server/connection.c
server/log.c

diff --git a/changes-entries/ap_create_connection.txt b/changes-entries/ap_create_connection.txt
new file mode 100644 (file)
index 0000000..834e5c4
--- /dev/null
@@ -0,0 +1,2 @@
+  *) core: Add ap_create_connection() to create either a server or client/proxy
+     connection.
\ No newline at end of file
index 4686cd3cb4827dd7d883536f41a7d82084c4328f..349e56274ca07e12fe784b3418580468ee1f0348 100644 (file)
  *                         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" */
 #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
index 8bc009da3b7fb9f22854d141d9ad5ce24ce19a89..b49a2577c527f25a2f4cd55940271f462e831bd1 100644 (file)
@@ -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;
 
index 21b0aef319bfc33839edd197dd77b2fce0c636fb..7e503e3322a38db789ffc74a50a6e5ff65f7ccef 100644 (file)
@@ -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)
index 77610e7df3a18fe747d7e31090f230101fe2a1f5..7df4a26f324436dc018c88c3c60c8c30a8fe61b2 100644 (file)
@@ -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)
index 29e13d551cc670b62de0d648a002449c38e264af..7b67276ed4cca71a7dd79e4dbd83d3d2b7968154 100644 (file)
@@ -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,
index b0093e16c9d053b570f33e4eccc1206f83674fd3..a6dfef7858376dad521b795efebf16a66bebc154 100644 (file)
@@ -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
index baa0b690438f7b947d4370bfb94868bed9b9d1d5..89e1679fed69ee624a99a7c8c96d17f4272cbaf7 100644 (file)
@@ -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);
     }