{
struct msghdr msg;
struct cmsghdr *cmsg;
- char headers[HUGE_STRING_LEN];
- char request_body[HUGE_STRING_LEN];
- struct iovec iov[2];
+ char buffer[HUGE_STRING_LEN * 2], *headers, *body;
+ int headerslen, bodylen;
+ struct iovec iov;
int ret, dp;
apr_os_sock_t sd;
apr_bucket_alloc_t *alloc = apr_bucket_alloc_create(ptrans);
apr_os_sock_get(&sd, lr->sd);
- 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 = buffer;
+ iov.iov_len = sizeof(buffer);
msg.msg_name = NULL;
msg.msg_namelen = 0;
- msg.msg_iov = iov;
- msg.msg_iovlen = 2;
+ msg.msg_iov = &iov;
+ msg.msg_iovlen = 1;
cmsg = apr_palloc(ptrans, sizeof(*cmsg) + sizeof(sd));
cmsg->cmsg_len = sizeof(*cmsg) + sizeof(sd);
memcpy(&dp, CMSG_DATA(cmsg), sizeof(dp));
+ *csd = NULL; /* tell apr_os_sock_put() to allocate new apr_socket_t */
apr_os_sock_put((apr_socket_t **)csd, &dp, ptrans);
bucket = apr_bucket_eos_create(alloc);
APR_BRIGADE_INSERT_HEAD(bb, bucket);
bucket = apr_bucket_socket_create(*csd, alloc);
APR_BRIGADE_INSERT_HEAD(bb, bucket);
- bucket = apr_bucket_heap_create(iov[1].iov_base,
- iov[1].iov_len, NULL, alloc);
+
+ body = strchr(iov.iov_base, 0);
+ if (!body) {
+ return 1;
+ }
+
+ body++;
+ bodylen = strlen(body);
+
+ headers = iov.iov_base;
+ headerslen = body - headers;
+
+ bucket = apr_bucket_heap_create(body, bodylen, 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, headerslen, NULL, alloc);
APR_BRIGADE_INSERT_HEAD(bb, bucket);
apr_pool_userdata_set(bb, "PERCHILD_SOCKETS", NULL, ptrans);
+
return 0;
}
static void *worker_thread(apr_thread_t *thd, void *arg)
{
- void *csd = NULL;
+ void *csd;
apr_pool_t *tpool; /* Pool for this thread */
apr_pool_t *ptrans; /* Pool for per-transaction stuff */
volatile int thread_just_started = 1;
apr_bucket_brigade *bb = apr_brigade_create(r->pool, c->bucket_alloc);
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 = sizeof(request_body);
perchild_header h;
apr_bucket *sockbuck;
perchild_server_conf *sconf = (perchild_server_conf *)
"passing request to another child. Vhost: %s, child %d %d",
apr_table_get(r->headers_in, "Host"), child_num, sconf->output);
ap_get_brigade(r->connection->input_filters, bb, AP_MODE_EXHAUSTIVE, APR_NONBLOCK_READ,
- len);
+ 0);
for (sockbuck = APR_BRIGADE_FIRST(bb); sockbuck != APR_BRIGADE_SENTINEL(bb);
sockbuck = APR_BUCKET_NEXT(sockbuck)) {
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;
msg.msg_name = NULL;
msg.msg_namelen = 0;