module AP_MODULE_DECLARE_DATA proxy_fdpass_module;
+#define MOP_DEBUG 0
+
static int proxy_fdpass_canon(request_rec *r, char *url)
{
const char *path;
- {
+ if (MOP_DEBUG == 1) {
int mop_fd;
char mop_bf[512];
- mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT);
+ mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, 0644);
sprintf(mop_bf, "proxy_http_canon: start\n");
write(mop_fd, mop_bf, strlen(mop_bf));
close(mop_fd);
r->filename = apr_pstrcat(r->pool, "proxy:fd://", path, NULL);
- ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
- "proxy: FD: set r->filename to %s", r->filename);
+ /* ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r,
+ "proxy: FD: set r->filename to %s", r->filename); */
return OK;
}
}
do {
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "proxy: FD: pre_connect");
+ /* 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)*/ );
- ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "proxy: FD: post_connect %d", rv);
+ /* ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "proxy: FD: post_connect %d", rv); */
} while (rv == -1 && errno == EINTR);
if ((rv == -1) && (errno == EINPROGRESS || errno == EALREADY)
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: FD: Failed to connect to '%s' %d xxx",
url, rv);
- */
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: FD: get_socket_from_path::START");
+ */
rv = apr_socket_create(&s, AF_UNIX, SOCK_STREAM, 0, p);
char b = '\0', *buf;
ANCIL_FD_BUFFER(2) ancil_buf;
- {
+ if (MOP_DEBUG == 1) {
int mop_fd;
char mop_bf[512];
- mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
+ mop_fd = open("/tmp/apache_mop.log", 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);
-
}
rv = apr_os_sock_get(&rawsock, outbound);
return rv;
}
- {
+ if (MOP_DEBUG == 1) {
int mop_fd;
char mop_bf[512];
- mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
+ mop_fd = open("/tmp/apache_mop.log", 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);
-
}
memset(&msg, 0, sizeof(msg));
rv = sendmsg(srawsock, &msg, 0);
- {
+ if (MOP_DEBUG == 1) {
int mop_fd;
char mop_bf[512];
- mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
+ mop_fd = open("/tmp/apache_mop.log", 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);
-
}
if (rv == -1) {
sprintf(s, "%s%s:%s\n", s, key, value);
}
+#define CTRL_BUFF_MAX_SZ (8*1024)
+
+#define DEFAULT_ENCTYPE "application/x-www-form-urlencoded"
+
+int util_read(request_rec *r, const char **rbuf)
+{
+ int rc;
+
+ if ((rc = ap_setup_client_block(r, REQUEST_CHUNKED_ERROR)) != OK) {
+ return rc;
+ }
+
+ if (ap_should_client_block(r)) {
+ char argsbuffer[HUGE_STRING_LEN];
+ int rsize, len_read, rpos=0;
+ long length = r->remaining;
+ *rbuf = (char *)apr_pcalloc(r->pool, length +1);
+ if ((len_read = ap_get_client_block(r, argsbuffer,
+ sizeof(argsbuffer))) > 0) {
+ if ((rpos + len_read) > length) {
+ rsize = length - rpos;
+ } else {
+ rsize = len_read;
+ }
+
+ memcpy((char *)*rbuf + rpos, argsbuffer, rsize);
+ rpos += rsize;
+ }
+
+ }
+
+ return rc;
+}
+
+int read_post(request_rec *r, const char **data)
+{
+ const char *type;
+ char *p, s_type[256];
+ int rc = OK;
+
+ s_type[255] = '\0';
+ if (MOP_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, "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);
+ }
+
+
+ if (r->method_number != M_POST) {
+ return rc;
+ }
+
+ type = apr_table_get(r->headers_in, "Content-Type");
+ strncpy(s_type, type, 255);
+ if (p = strchr(s_type, ';')) {
+ *p = '\0';
+ }
+ if (strcasecmp(s_type, DEFAULT_ENCTYPE) != 0) {
+ return DECLINED;
+ }
+
+ if ((rc = util_read(r, data)) != OK) {
+ return rc;
+ }
+
+ if (MOP_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, "read_post: finish\n");
+ write(mop_fd, mop_bf, strlen(mop_bf));
+ close(mop_fd);
+ }
+
+ return OK;
+}
+
+
// TODO: sanitize calloc
static int proxy_fdpass_handler(request_rec *r, proxy_worker *worker,
proxy_server_conf *conf,
int ctrlrawsock[2];
apr_socket_t *ctrlsock = NULL, *clientctrlsock = NULL;
apr_size_t wrlen;
+ const char *post_data = NULL;
- if ((headers_out = calloc(8*1024, 1)) != NULL) {
- apr_table_do(headers_builder, headers_out, r->headers_in, NULL);
- }
-
+ ap_filter_t *f;
+ ap_filter_rec_t *fg;
- {
- int mop_fd;
- char mop_bf[512];
-
- mop_fd = open("/tmp/apache_mop.log", O_WRONLY | O_APPEND | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO);
- sprintf(mop_bf, "proxy_fdpass_handler: start\n");
- write(mop_fd, mop_bf, strlen(mop_bf));
- write(mop_fd, headers_out, strlen(headers_out));
- close(mop_fd);
-
- }
- /*
- if (headers_out)
- free(headers_out);
- */
if (strncasecmp(url, "fd://", 5) == 0) {
url += 5;
}
return HTTP_INTERNAL_SERVER_ERROR;
}
+ fg = ap_get_output_filter_handle("HTTP_HEADER");
+
+ /*
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "proxy: FD: filter fg: %lx func %lx", fg, ap_http_header_filter);
+ */
+
+ for (f = r->output_filters ; f != NULL ; f = f->next) {
+ /* ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "proxy: FD: filter loop: %lx", f->frec);
+ */
+ if (f->frec == fg) {
+ /*
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, 0, r,
+ "proxy: FD: filter found, remove it");
+ */
+ ap_remove_output_filter(f);
+ break;
+ }
+ }
+
+ if ((headers_out = calloc(CTRL_BUFF_MAX_SZ, 1)) != NULL) {
+ sprintf(headers_out, "The-Request:%s\n", r->the_request);
+ apr_table_do(headers_builder, headers_out, r->headers_in, NULL);
+ }
+ read_post(r, &post_data);
+
+ if (MOP_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_fdpass_handler: start\n");
+ write(mop_fd, mop_bf, strlen(mop_bf));
+ write(mop_fd, headers_out, strlen(headers_out));
+ close(mop_fd);
+ }
/* 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,
}
}
+ /*
if ((buf = apr_table_get(r->headers_in, "Host"))) {
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
"proxy: FD: Host is: [%s]", buf);
}
+ */
/* XXXXX: THIS IS AN EVIL HACK */
/* There should really be a (documented) public API for this ! */
"proxy: FD: send_socket failed:");
return HTTP_INTERNAL_SERVER_ERROR;
}
+ strcat(headers_out, "\n");
wrlen = strlen(headers_out);
rv = apr_socket_send(ctrlsock, headers_out, &wrlen);
if (rv != APR_SUCCESS) {
"proxy: FD: send headers failed");
return HTTP_INTERNAL_SERVER_ERROR;
}
+ if (post_data) {
+ wrlen = strlen(post_data);
+ rv = apr_socket_send(ctrlsock, post_data, &wrlen);
+ if (rv != APR_SUCCESS) {
+ ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
+ "proxy: FD: send post failed");
+ return HTTP_INTERNAL_SERVER_ERROR;
+ }
+ }
apr_socket_shutdown(ctrlsock, APR_SHUTDOWN_READWRITE);
+ if (headers_out)
+ free(headers_out);
+
{
apr_socket_t *dummy;
/* Create a dummy unconnected socket, and set it as the one we were
r->connection->keepalive = AP_CONN_CLOSE;
/* MOP NOTE: set here the content type */
- // ap_set_content_type(r, apr_pstrdup(p, "text/plain"));
-
+ // 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);