From b892f9147a0d924d94687228d338a887d989abf8 Mon Sep 17 00:00:00 2001 From: Matteo Nastasi Date: Thu, 14 May 2020 05:16:25 +0000 Subject: [PATCH] refactoring to be closer to original proxy_pass plugin code --- mod_proxy_fdpass2.c | 72 +++++++++++++++++++++++++++++---------------- 1 file changed, 47 insertions(+), 25 deletions(-) diff --git a/mod_proxy_fdpass2.c b/mod_proxy_fdpass2.c index 3b2afb4..84e8ed3 100644 --- a/mod_proxy_fdpass2.c +++ b/mod_proxy_fdpass2.c @@ -75,7 +75,7 @@ static int proxy_fdpass2_canon(request_rec *r, char *url) } /* TODO: In APR 2.x: Extend apr_sockaddr_t to possibly be a path !!! */ -static apr_status_t socket_connect_un(request_rec *r, apr_socket_t *sock, +static apr_status_t socket_connect_un(apr_socket_t *sock, struct sockaddr_un *sa) { apr_status_t rv; @@ -84,14 +84,14 @@ static apr_status_t socket_connect_un(request_rec *r, apr_socket_t *sock, rv = apr_os_sock_get(&rawsock, sock); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "proxy: FD: apr_os_sock_get failed"); return rv; } rv = apr_socket_timeout_get(sock, &t); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "proxy: FD: apr_socket_timeout_get failed"); return rv; } @@ -100,7 +100,7 @@ static apr_status_t socket_connect_un(request_rec *r, apr_socket_t *sock, /* ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FD: pre_connect"); */ rv = connect(rawsock, (struct sockaddr*)sa, - sizeof(*sa) /* + strlen(sa->sun_path)*/ ); + sizeof(*sa) /* + strlen(sa->sun_path)*/ ); /* ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: FD: post_connect %d", rv); */ } while (rv == -1 && errno == EINTR); @@ -121,15 +121,15 @@ static apr_status_t socket_connect_un(request_rec *r, apr_socket_t *sock, } if (rv == -1 && errno != EISCONN) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "proxy: FD: socket_connect_un preexit %d", errno); + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "proxy: FD: socket_connect_un preexit %d", errno); return errno; } return APR_SUCCESS; } -static apr_status_t get_socket_from_path(request_rec *r, apr_pool_t *p, +static apr_status_t get_socket_from_path(apr_pool_t *p, const char* path, apr_socket_t **out_sock) { @@ -139,17 +139,17 @@ static apr_status_t get_socket_from_path(request_rec *r, apr_pool_t *p, *out_sock = NULL; /* - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, - "proxy: FD: Failed to connect to '%s' %d xxx", + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, + "proxy: FD: Failed to connect to '%s' %d xxx", url, rv); - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "proxy: FD: get_socket_from_path::START"); */ rv = apr_socket_create(&s, AF_UNIX, SOCK_STREAM, 0, p); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "proxy: FD: get_socket_from_path::create %d", rv); return rv; } @@ -157,9 +157,9 @@ static apr_status_t get_socket_from_path(request_rec *r, apr_pool_t *p, sa.sun_family = AF_UNIX; apr_cpystrn(sa.sun_path, path, sizeof(sa.sun_path)); - rv = socket_connect_un(r, s, &sa); + rv = socket_connect_un(s, &sa); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_error(APLOG_MARK, APLOG_ERR, rv, NULL, "proxy: FD: get_socket_from_path::connect_un %d", rv); return rv; } @@ -411,7 +411,7 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, return DECLINED; } - rv = get_socket_from_path(r, r->pool, url, &sock); + rv = get_socket_from_path(r->pool, url, &sock); #if ALTOUT_DEBUG > 0 long long t_cur; @@ -487,27 +487,27 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, } rv = apr_os_sock_put(&ctrlsock, &(ctrlrawsock[0]), r->connection->pool); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01152) "proxy: FD: apr_os_sock_put failed"); return HTTP_INTERNAL_SERVER_ERROR; } rv = apr_os_sock_put(&clientctrlsock, &(ctrlrawsock[1]), r->connection->pool); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01152) "proxy: FD: apr_os_sock_put failed"); return HTTP_INTERNAL_SERVER_ERROR; } { int status; - /* const char *flush_method = worker->flusher ? worker->flusher : "flush"; */ + /* const char *flush_method = worker->s->flusher ? worker->s->flusher : "flush"; */ const char *flush_method = "flush"; proxy_fdpass2_flush *flush = ap_lookup_provider(PROXY_FDPASS_FLUSHER, - flush_method, "0"); + flush_method, "0"); if (!flush) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01153) "proxy: FD: Unable to find configured flush " "provider '%s'", flush_method); return HTTP_INTERNAL_SERVER_ERROR; @@ -528,11 +528,13 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, /* XXXXX: THIS IS AN EVIL HACK */ /* There should really be a (documented) public API for this ! */ - clientsock = ap_get_module_config(r->connection->conn_config, &core_module); + /* oldmop clientsock = ap_get_module_config(r->connection->conn_config, &core_module); */ + clientsock = ap_get_core_module_config(r->connection->conn_config); + rv = send_socket(r->pool, sock, clientsock, clientctrlsock); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01154) "proxy: FD: send_socket failed:"); return HTTP_INTERNAL_SERVER_ERROR; } @@ -567,8 +569,9 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, } } apr_socket_shutdown(ctrlsock, APR_SHUTDOWN_READWRITE); - if (headers_out) + if (headers_out) { free(headers_out); + } { apr_socket_t *dummy; @@ -579,11 +582,11 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, rv = apr_socket_create(&dummy, APR_INET, SOCK_STREAM, APR_PROTO_TCP, r->connection->pool); if (rv != APR_SUCCESS) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, APLOGNO(01155) "proxy: FD: failed to create dummy socket"); return HTTP_INTERNAL_SERVER_ERROR; } - ap_set_module_config(r->connection->conn_config, &core_module, dummy); + ap_set_core_module_config(r->connection->conn_config, dummy); } #if ALTOUT_DEBUG > 0 @@ -619,11 +622,30 @@ static int standard_flush(request_rec *r) status = ap_pass_brigade(r->output_filters, bb); if (status != OK) { - ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, + ap_log_rerror(APLOG_MARK, APLOG_ERR, status, r, APLOGNO(01156) "proxy: FD: ap_pass_brigade failed:"); return status; } +#if ALTOUT_DEBUG > 0 + long long t_cur; + int t_rnd; + t_cur = (long long)time(NULL); + t_rnd = rand(); +#endif + +#if ALTOUT_DEBUG > 0 + { + int mop_fd; + char mop_bf[512]; + + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); + sprintf(mop_bf, "%lld: (%d) proxy_fdpass2_handler: flusher\n", t_cur, t_rnd); + write(mop_fd, mop_bf, strlen(mop_bf)); + close(mop_fd); + } +#endif + return OK; } -- 2.17.1