mirror of
https://github.com/apache/httpd.git
synced 2025-08-08 15:02:10 +03:00
core: Add ap_create_connection() to create a server or client/proxy connection.
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
This commit is contained in:
2
changes-entries/ap_create_connection.txt
Normal file
2
changes-entries/ap_create_connection.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
*) core: Add ap_create_connection() to create either a server or client/proxy
|
||||||
|
connection.
|
@@ -679,6 +679,7 @@
|
|||||||
* ap_proxy_define_worker_ex() to mod_proxy.h
|
* 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
|
* 20210531.3 (2.5.1-dev) Add hook child_stopping to get informed that a child
|
||||||
* is being shut down.
|
* is being shut down.
|
||||||
|
* 20210531.4 (2.5.1-dev) Add ap_create_connection
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
#define MODULE_MAGIC_COOKIE 0x41503235UL /* "AP25" */
|
||||||
@@ -686,7 +687,7 @@
|
|||||||
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
#ifndef MODULE_MAGIC_NUMBER_MAJOR
|
||||||
#define MODULE_MAGIC_NUMBER_MAJOR 20210531
|
#define MODULE_MAGIC_NUMBER_MAJOR 20210531
|
||||||
#endif
|
#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
|
* Determine if the server's current MODULE_MAGIC_NUMBER is at least a
|
||||||
|
@@ -135,6 +135,28 @@ AP_DECLARE_HOOK(int,process_connection,(conn_rec *c))
|
|||||||
*/
|
*/
|
||||||
AP_DECLARE_HOOK(int,pre_close_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 */
|
/** End Of Connection (EOC) bucket */
|
||||||
AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eoc;
|
AP_DECLARE_DATA extern const apr_bucket_type_t ap_bucket_type_eoc;
|
||||||
|
|
||||||
|
@@ -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
|
* Send the HTTP/1.1 CONNECT request to the remote server
|
||||||
*/
|
*/
|
||||||
|
|
||||||
backconn = ap_run_create_connection(c->pool, r->server, sock,
|
backconn = ap_create_connection(c->pool, r->server, sock, 0, NULL,
|
||||||
c->id, c->sbh, c->bucket_alloc);
|
c->bucket_alloc, 1);
|
||||||
if (!backconn) {
|
if (!backconn) {
|
||||||
/* peer reset */
|
/* peer reset */
|
||||||
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01021)
|
ap_log_rerror(APLOG_MARK, APLOG_INFO, 0, r, APLOGNO(01021)
|
||||||
|
@@ -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 */
|
/* the transfer socket is now open, create a new connection */
|
||||||
data = ap_run_create_connection(p, r->server, data_sock, r->connection->id,
|
data = ap_create_connection(p, r->server, data_sock, 0, NULL,
|
||||||
r->connection->sbh, c->bucket_alloc);
|
c->bucket_alloc, 1);
|
||||||
if (!data) {
|
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
|
* the socket
|
||||||
*/
|
*/
|
||||||
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01054)
|
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01054)
|
||||||
|
@@ -3404,13 +3404,12 @@ static int proxy_connection_create(const char *proxy_function,
|
|||||||
/*
|
/*
|
||||||
* The socket is now open, create a new backend server connection
|
* The socket is now open, create a new backend server connection
|
||||||
*/
|
*/
|
||||||
conn->connection = ap_run_create_connection(conn->scpool, s, conn->sock,
|
conn->connection = ap_create_connection(conn->scpool, s, conn->sock,
|
||||||
0, NULL,
|
0, NULL, bucket_alloc, 1);
|
||||||
bucket_alloc);
|
|
||||||
|
|
||||||
if (!conn->connection) {
|
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
|
* closed the socket
|
||||||
*/
|
*/
|
||||||
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
|
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0,
|
||||||
|
@@ -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_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_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,
|
* More machine-dependent networking gooo... on some systems,
|
||||||
* you've got to be *really* sure that all the packets are acknowledged
|
* you've got to be *really* sure that all the packets are acknowledged
|
||||||
|
@@ -914,14 +914,14 @@ static int do_errorlog_default(const ap_errorlog_info *info, char *buf,
|
|||||||
* a scoreboard handle, it is likely a client.
|
* a scoreboard handle, it is likely a client.
|
||||||
*/
|
*/
|
||||||
if (info->r) {
|
if (info->r) {
|
||||||
len += apr_snprintf(buf + len, buflen - len,
|
len += apr_snprintf(buf + len, buflen - len, "[%s %s:%d] ",
|
||||||
info->r->connection->sbh ? "[client %s:%d] " : "[remote %s:%d] ",
|
info->r->connection->outgoing ? "remote" : "client",
|
||||||
info->r->useragent_ip,
|
info->r->useragent_ip,
|
||||||
info->r->useragent_addr ? info->r->useragent_addr->port : 0);
|
info->r->useragent_addr ? info->r->useragent_addr->port : 0);
|
||||||
}
|
}
|
||||||
else if (info->c) {
|
else if (info->c) {
|
||||||
len += apr_snprintf(buf + len, buflen - len,
|
len += apr_snprintf(buf + len, buflen - len, "[%s %s:%d] ",
|
||||||
info->c->sbh ? "[client %s:%d] " : "[remote %s:%d] ",
|
info->c->outgoing ? "remote" : "client",
|
||||||
info->c->client_ip,
|
info->c->client_ip,
|
||||||
info->c->client_addr ? info->c->client_addr->port : 0);
|
info->c->client_addr ? info->c->client_addr->port : 0);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user