Author: rhuijben
Date: Thu Nov 5 17:26:06 2015
New Revision: 1712825
URL: http://svn.apache.org/viewvc?rev=1712825&view=rev
Log:
While checking if there is data waiting to be written also write out
the encrypted buffer even when the bucket reported that it needs a
read first... perhaps it had asked to write.
This fixes the ALPN negotiate test failure on Windows/platforms with a very
recent openssl.
* outgoing.c
(serf__conn_update_pollset): Use the actual stream information
to determine when we want to be able to write first, instead
of the flag that only determines if we should refill the buffer.
Modified:
serf/trunk/outgoing.c
Modified: serf/trunk/outgoing.c
URL:
http://svn.apache.org/viewvc/serf/trunk/outgoing.c?rev=1712825&r1=1712824&r2=1712825&view=diff
==============================================================================
--- serf/trunk/outgoing.c (original)
+++ serf/trunk/outgoing.c Thu Nov 5 17:26:06 2015
@@ -198,6 +198,7 @@ apr_status_t serf__conn_update_pollset(s
/* If we are not connected yet, we just want to know when we are */
if (conn->wait_for_connect) {
data_waiting = TRUE;
+ desc.reqevents |= APR_POLLOUT;
}
else {
/* Directly look at the connection data. While this may look
@@ -209,16 +210,14 @@ apr_status_t serf__conn_update_pollset(s
*/
if (conn->vec_len) {
/* We still have vecs in the connection, which lifetime is
- managed by buckets inside conn->ostream_head.
+ managed by buckets inside conn->ostream_head.
- Don't touch ostream as that might destroy the
- vecs */
+ Don't touch ostream as that might destroy the vecs */
data_waiting = (conn->state != SERF_CONN_CLOSING);
}
else {
serf_bucket_t *ostream;
- data_waiting = FALSE;
ostream = conn->ostream_head;
@@ -231,19 +230,24 @@ apr_status_t serf__conn_update_pollset(s
status = serf_bucket_peek(ostream, &dummy_data, &len);
- if (SERF_BUCKET_READ_ERROR(status))
+ if (SERF_BUCKET_READ_ERROR(status) || len > 0) {
+ /* DATA or error waiting */
data_waiting = TRUE; /* Error waiting */
- else if (len > 0)
- data_waiting = TRUE;
+ }
+ else if (! status || APR_STATUS_IS_EOF(status)) {
+ data_waiting = FALSE;
+ writing_queue_empty(conn);
+ }
+ else
+ data_waiting = FALSE; /* EAGAIN / EOF / WAIT_CONN */
}
-
- if (!data_waiting)
- writing_queue_empty(conn);
+ else
+ data_waiting = FALSE;
}
- }
- if (data_waiting && ! conn->stop_writing) {
- desc.reqevents |= APR_POLLOUT;
+ if (data_waiting) {
+ desc.reqevents |= APR_POLLOUT;
+ }
}
if ((conn->written_reqs || conn->unwritten_reqs) &&
@@ -255,26 +259,15 @@ apr_status_t serf__conn_update_pollset(s
/* Don't write if OpenSSL told us that it needs to read data first. */
if (! conn->stop_writing && !data_waiting) {
- /* If the connection is not closing down and
- * has unwritten data or
- * there are any requests that still have buckets to write out,
- * then we want to write.
- */
- if (conn->vec_len &&
- conn->state != SERF_CONN_CLOSING)
+ if ((conn->probable_keepalive_limit &&
+ conn->completed_requests > conn->probable_keepalive_limit) ||
+ (conn->max_outstanding_requests &&
+ conn->completed_requests - conn->completed_responses >=
+ conn->max_outstanding_requests)) {
+ /* we wouldn't try to write any way right now. */
+ }
+ else if (request_pending(NULL, conn)) {
desc.reqevents |= APR_POLLOUT;
- else {
-
- if ((conn->probable_keepalive_limit &&
- conn->completed_requests >
conn->probable_keepalive_limit) ||
- (conn->max_outstanding_requests &&
- conn->completed_requests - conn->completed_responses >=
- conn->max_outstanding_requests)) {
- /* we wouldn't try to write any way right now. */
- }
- else if (request_pending(NULL, conn)) {
- desc.reqevents |= APR_POLLOUT;
- }
}
}
}