Only in httpd-2.0.47-post/: httpd-2.0.47 diff -r -u httpd-2.0.47/server/mpm/experimental/metuxmpm/metuxmpm.c httpd-2.0.47-post/server/mpm/experimental/metuxmpm/metuxmpm.c --- httpd-2.0.47/server/mpm/experimental/metuxmpm/metuxmpm.c 2003-08-07 12:07:15.000000000 +0200 +++ httpd-2.0.47-post/server/mpm/experimental/metuxmpm/metuxmpm.c 2003-08-07 12:03:26.000000000 +0200 @@ -861,7 +861,7 @@ struct cmsghdr *cmsg; char headers[HUGE_STRING_LEN]; char request_body[HUGE_STRING_LEN]; - struct iovec iov[2]; + struct iovec iov; int ret, fd_tmp; apr_os_sock_t ctrl_sock_fd; apr_os_sock_t trans_sock_fd; @@ -872,18 +872,16 @@ apr_bucket *bucket; /* prepare the buffers for receiving data from remote side */ - iov[0].iov_base = headers; - iov[0].iov_len = HUGE_STRING_LEN; - iov[1].iov_base = request_body; - iov[1].iov_len = HUGE_STRING_LEN; + iov.iov_base = headers; + iov.iov_len = HUGE_STRING_LEN; cmsg = apr_palloc(ptrans, sizeof(*cmsg) + sizeof(trans_sock_fd)); cmsg->cmsg_len = sizeof(*cmsg) + sizeof(trans_sock_fd); msg.msg_name = NULL; msg.msg_namelen = 0; - msg.msg_iov = iov; - msg.msg_iovlen = 2; + msg.msg_iov = &iov; + msg.msg_iovlen = 1; msg.msg_control = cmsg; msg.msg_controllen = cmsg->cmsg_len; @@ -896,6 +894,9 @@ memcpy(&trans_sock_fd, CMSG_DATA(cmsg), sizeof(trans_sock_fd)); apr_os_sock_put((apr_socket_t **)trans_sock, &trans_sock_fd, ptrans); apr_os_sock_get(&fd_tmp, *trans_sock); + + strcpy(request_body, strchr(headers, 0) + 1); + _FDBG("trans_sock=%ld fdx=%d sock_fd=%d headers=\"%s\" body=\"%s\"", *trans_sock, trans_sock_fd, fd_tmp, &headers, &request_body); @@ -905,11 +906,11 @@ APR_BRIGADE_INSERT_HEAD(bb, bucket); bucket = apr_bucket_socket_create(*trans_sock, alloc); APR_BRIGADE_INSERT_HEAD(bb, bucket); - bucket = apr_bucket_heap_create(iov[1].iov_base, - iov[1].iov_len, NULL, alloc); + bucket = apr_bucket_heap_create(request_body, + strlen(request_body), NULL, alloc); APR_BRIGADE_INSERT_HEAD(bb, bucket); - bucket = apr_bucket_heap_create(iov[0].iov_base, - iov[0].iov_len, NULL, alloc); + bucket = apr_bucket_heap_create(headers, + strlen(headers), NULL, alloc); APR_BRIGADE_INSERT_HEAD(bb, bucket); apr_pool_userdata_set(bb, "metuxmpm_SOCKETS", NULL, ptrans); @@ -1966,7 +1967,7 @@ apr_bucket_brigade *sockbb; char request_body[HUGE_STRING_LEN] = "\0"; apr_off_t len = 0; - apr_size_t l = 0; + apr_size_t l = HUGE_STRING_LEN; metuxmpm_header h; apr_bucket *sockbuck; const apr_array_header_t *headers_in_array; @@ -2031,6 +2032,7 @@ || !apr_strnatcasecmp (headers_in[counter].key, "X-AP-metuxmpm") || !apr_strnatcasecmp (headers_in[counter].key, "X-AP-metuxmpm-FOR-IP") || !apr_strnatcasecmp (headers_in[counter].key, "Keep-Alive") + || !apr_strnatcasecmp (headers_in[counter].key, "Host") || !apr_strnatcasecmp (headers_in[counter].key, "Connection")) { continue; } @@ -2044,13 +2046,13 @@ } if (buf == NULL) { - h.headers = apr_pstrcat(h.p, r->the_request, CRLF, "Host: ", r->hostname, + h.headers = apr_pstrcat(h.p, r->the_request, CRLF, "Host: ", r->hostname, CRLF, "X-AP-metuxmpm: passed between childs", CRLF, "X-AP-metuxmpm-FOR-IP: ", r -> connection -> remote_ip, - CRLF, "Connection: close", + CRLF, "Connection: close", CRLF, "Host: ", r->hostname, CRLF, CRLF, NULL); } else { - h.headers = apr_pstrcat(h.p, r->the_request, CRLF, "Host: ", r->hostname, + h.headers = apr_pstrcat(h.p, r->the_request, CRLF, "Host: ", r->hostname, CRLF, "X-AP-metuxmpm: passed between childs", CRLF, "X-AP-metuxmpm-FOR-IP: ", r -> connection -> remote_ip, CRLF, "Connection: close", @@ -2061,7 +2063,8 @@ iov[0].iov_base = h.headers; iov[0].iov_len = strlen(h.headers) + 1; iov[1].iov_base = request_body; - iov[1].iov_len = len + 1; + iov[1].iov_len = l + 1; +_DBG("pass_request(): [POST] body=\"%s\" length=%d", request_body, l); msg.msg_name = NULL; msg.msg_namelen = 0;