X-Git-Url: https://mop.ddnsfree.com/gitweb/?a=blobdiff_plain;f=mod_proxy_fdpass2.c;h=e338c2bd189358ce8a9d543a4d0ace3cbdf37203;hb=refs%2Fheads%2Fmaster;hp=7d4c6aec5bb27b374ab0633ad8c599e0c6a9e717;hpb=a10c60232480678fdc9ea2314df64e0655eb169b;p=mod-proxy-fdpass.git diff --git a/mod_proxy_fdpass2.c b/mod_proxy_fdpass2.c index 7d4c6ae..e338c2b 100644 --- a/mod_proxy_fdpass2.c +++ b/mod_proxy_fdpass2.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #ifndef CMSG_DATA #error This module only works on unix platforms with the correct OS support @@ -34,22 +36,26 @@ module AP_MODULE_DECLARE_DATA proxy_fdpass2_module; -#define MOP_DEBUG 1 +#define ALTOUT_USOCK_N 10 +#define ALTOUT_DEBUG 1 +#define ALTOUT_DBG_FILE "/home/log/fdpass2.log" static int proxy_fdpass2_canon(request_rec *r, char *url) { const char *path; + char sfx[16]; - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "proxy_http_canon: start [%p]\n", r->headers_in); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); - } +#endif if (strncasecmp(url, "fd://", 5) == 0) { url += 5; @@ -57,10 +63,11 @@ static int proxy_fdpass2_canon(request_rec *r, char *url) else { return DECLINED; } - + path = ap_server_root_relative(r->pool, url); - r->filename = apr_pstrcat(r->pool, "proxy:fd://", path, NULL); + sprintf(sfx, "%d.sock", rand() % ALTOUT_USOCK_N); + r->filename = apr_pstrcat(r->pool, "proxy:fd://", path, sfx, NULL); /* ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, "proxy: FD: set r->filename to %s", r->filename); */ @@ -68,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; @@ -77,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; } @@ -93,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); @@ -112,17 +119,17 @@ static apr_status_t socket_connect_un(request_rec *r, apr_socket_t *sock, return rv; } } - + 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) { @@ -132,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; } @@ -150,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; } @@ -183,16 +190,18 @@ static apr_status_t send_socket(apr_pool_t *p, char b = '\0', *buf; ANCIL_FD_BUFFER(2) ancil_buf; - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "send_socket: start\n"); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); } - +#endif + rv = apr_os_sock_get(&rawsock, outbound); if (rv != APR_SUCCESS) { return rv; @@ -207,17 +216,19 @@ static apr_status_t send_socket(apr_pool_t *p, if (rv != APR_SUCCESS) { return rv; } - - if (MOP_DEBUG == 1) { + +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); write(mop_fd, "XX", 2); write(mop_fd, &srawsock, sizeof(apr_os_sock_t)); write(mop_fd, "XX", 2); close(mop_fd); } +#endif memset(&msg, 0, sizeof(msg)); @@ -241,21 +252,22 @@ static apr_status_t send_socket(apr_pool_t *p, rv = sendmsg(srawsock, &msg, 0); - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "SENT BYTES: %d\n", rv); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); } +#endif if (rv == -1) { return errno; } - return APR_SUCCESS; } @@ -265,16 +277,17 @@ static int headers_builder(void *rec, const char *key, const char *value) s = (char *)rec; - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "HEADERS_BUILDER: [%s:%s]\n", key, value); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); } - +#endif // TODO: verify length // sprintf(s, "%s%s:%s\n", s, key, value); @@ -325,15 +338,17 @@ int read_post(request_rec *r, const char **data) int rc = OK; s_type[255] = '\0'; - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "read_post: start: numb: %d %d head_in: [%s]\n", r->method_number, M_POST, apr_table_get(r->headers_in, "Content-Type")); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); } +#endif if (r->method_number != M_POST) { @@ -354,15 +369,17 @@ int read_post(request_rec *r, const char **data) return rc; } - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); sprintf(mop_bf, "read_post: finish\n"); write(mop_fd, mop_bf, strlen(mop_bf)); close(mop_fd); } +#endif return OK; } @@ -394,7 +411,26 @@ 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; + 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: start\n", t_cur, t_rnd); + write(mop_fd, mop_bf, strlen(mop_bf)); + close(mop_fd); + } +#endif if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, @@ -430,16 +466,19 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, } read_post(r, &post_data); - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); - sprintf(mop_bf, "proxy_fdpass2_handler: start\n"); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); + sprintf(mop_bf, "proxy_fdpass2_handler: headers\n"); write(mop_fd, mop_bf, strlen(mop_bf)); write(mop_fd, headers_out, strlen(headers_out)); close(mop_fd); } +#endif + /* create a couple of sockets and pass one to the client for headers and so on */ if (socketpair(AF_UNIX, SOCK_STREAM, 0, ctrlrawsock)) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, @@ -448,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 = "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; @@ -489,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; } @@ -501,16 +542,17 @@ static int proxy_fdpass2_handler(request_rec *r, proxy_worker *worker, wrlen = strlen(headers_out); rv = apr_socket_send(ctrlsock, headers_out, &wrlen); - if (MOP_DEBUG == 1) { +#if ALTOUT_DEBUG > 1 + { int mop_fd; char mop_bf[512]; - mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644); + mop_fd = open(ALTOUT_DBG_FILE, O_WRONLY | O_APPEND | O_CREAT, 0644); write(mop_fd, "HEADERS_OUT\n", 12); write(mop_fd, headers_out, wrlen); close(mop_fd); } - +#endif if (rv != APR_SUCCESS) { ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, @@ -527,26 +569,41 @@ 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; - /* Create a dummy unconnected socket, and set it as the one we were - * connected to, so that when the core closes it, it doesn't close + /* Create a dummy unconnected socket, and set it as the one we were + * connected to, so that when the core closes it, it doesn't close * the tcp connection to the client. */ 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 + { + 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: end\n", t_cur, t_rnd); + write(mop_fd, mop_bf, strlen(mop_bf)); + close(mop_fd); + } +#endif + /* close socket pair before end proxy */ + close(ctrlrawsock[0]); + close(ctrlrawsock[1]); + return OK; } @@ -562,17 +619,36 @@ static int standard_flush(request_rec *r) // ap_set_content_type(r, apr_pstrdup(p, NO_CONTENT_TYPE)); bb = apr_brigade_create(r->pool, r->connection->bucket_alloc); e = apr_bucket_flush_create(r->connection->bucket_alloc); - + APR_BRIGADE_INSERT_TAIL(bb, e); 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; }