refactoring to be closer to original proxy_pass plugin code
authorMatteo Nastasi <nastasi@alternativeoutput.it>
Thu, 14 May 2020 05:16:25 +0000 (05:16 +0000)
committerMatteo Nastasi <nastasi@alternativeoutput.it>
Thu, 14 May 2020 05:16:25 +0000 (05:16 +0000)
mod_proxy_fdpass2.c

index 3b2afb4..84e8ed3 100644 (file)
@@ -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;
 }