else if(!pp->sendleft && Curl_conn_data_pending(data, FIRSTSOCKET))
/* We are receiving and there is data ready in the SSL library */
rc = 1;
- else
+ else {
+ DEBUGF(infof(data, "pp_statematch, select, timeout=%" FMT_TIMEDIFF_T
+ ", sendleft=%zu",
+ timeout_ms, pp->sendleft));
rc = Curl_socket_check(pp->sendleft ? CURL_SOCKET_BAD : sock, /* reading */
CURL_SOCKET_BAD,
pp->sendleft ? sock : CURL_SOCKET_BAD, /* writing */
interval_ms);
+ }
if(block) {
/* if we did not wait, we do not have to spend time on this now */
if(CURLE_AGAIN == result)
BIO_set_retry_read(bio);
}
- else if(nread == 0) {
- connssl->peer_closed = TRUE;
+ else {
+ /* feeding data to OpenSSL means SSL_read() might succeed */
+ connssl->input_pending = TRUE;
+ if(nread == 0)
+ connssl->peer_closed = TRUE;
}
/* Before returning server replies to the SSL instance, we need
const struct Curl_easy *data)
{
struct ssl_connect_data *connssl = cf->ctx;
- struct ossl_ctx *octx = (struct ossl_ctx *)connssl->backend;
-
(void)data;
- DEBUGASSERT(connssl && octx);
- if(octx->ssl && SSL_pending(octx->ssl))
- return TRUE;
- return FALSE;
+ return connssl->input_pending;
}
static ssize_t ossl_send(struct Curl_cfilter *cf,
}
out:
+ if(!nread || ((nread < 0) && (*curlcode == CURLE_AGAIN))) {
+ /* This happens when:
+ * - we read an EOF
+ * - OpenSSLs buffers are empty, there is no more data
+ * - OpenSSL read is blocked on writing something first
+ * - an incomplete TLS packet is buffered that cannot be read
+ * until more data arrives */
+ connssl->input_pending = FALSE;
+ }
return nread;
}
BIT(use_alpn); /* if ALPN shall be used in handshake */
BIT(peer_closed); /* peer has closed connection */
BIT(prefs_checked); /* SSL preferences have been checked */
+ BIT(input_pending); /* data for SSL_read() may be available */
};