summaryrefslogtreecommitdiff
path: root/src/server/mod_wsgi.c
diff options
context:
space:
mode:
authorGraham Dumpleton <Graham.Dumpleton@gmail.com>2015-04-05 16:27:29 +1000
committerGraham Dumpleton <Graham.Dumpleton@gmail.com>2015-04-05 16:27:29 +1000
commited155b3e67cf563a1def4c85f2757060ed7cb600 (patch)
tree18ced97629d1e9cdffce884607c83db3d24a0731 /src/server/mod_wsgi.c
parent830e6f50c2cc0af83c913fcdb12f5394b6a20aec (diff)
parent9d24e44c973edc4697d90c91a7e778ec7d865d4c (diff)
downloadmod_wsgi-4.4.11.tar.gz
Merge branch 'release/4.4.11'4.4.11
Diffstat (limited to 'src/server/mod_wsgi.c')
-rw-r--r--src/server/mod_wsgi.c38
1 files changed, 36 insertions, 2 deletions
diff --git a/src/server/mod_wsgi.c b/src/server/mod_wsgi.c
index b900303..09dc527 100644
--- a/src/server/mod_wsgi.c
+++ b/src/server/mod_wsgi.c
@@ -10081,8 +10081,8 @@ static apr_status_t wsgi_socket_send(apr_socket_t *sock, const char *buf,
return APR_SUCCESS;
}
-static apr_status_t wsgi_socket_sendv(apr_socket_t *sock, struct iovec *vec,
- int nvec)
+static apr_status_t wsgi_socket_sendv_limit(apr_socket_t *sock,
+ struct iovec *vec, int nvec)
{
apr_status_t rv;
apr_size_t written = 0;
@@ -10137,6 +10137,40 @@ static apr_status_t wsgi_socket_sendv(apr_socket_t *sock, struct iovec *vec,
return APR_SUCCESS;
}
+static apr_status_t wsgi_socket_sendv(apr_socket_t *sock, struct iovec *vec,
+ int nvec)
+{
+#if defined(_SC_IOV_MAX)
+ static size_t iov_max = 0;
+
+ if (iov_max == 0)
+ iov_max = sysconf(_SC_IOV_MAX);
+#else
+ static size_t iov_max = APR_MAX_IOVEC_SIZE;
+#endif
+
+ if (nvec > iov_max) {
+ int offset = 0;
+
+ while (nvec > 0) {
+ apr_status_t rv;
+
+ rv = wsgi_socket_sendv_limit(sock, &vec[offset],
+ (nvec < iov_max ? nvec : (int)iov_max));
+
+ if (rv != APR_SUCCESS)
+ return rv;
+
+ nvec -= iov_max;
+ offset += iov_max;
+ }
+
+ return APR_SUCCESS;
+ }
+ else
+ return wsgi_socket_sendv_limit(sock, vec, nvec);
+}
+
static apr_status_t wsgi_send_request(request_rec *r,
WSGIRequestConfig *config,
WSGIDaemonSocket *daemon)