Give it a better chance to work hopefully
This commit is contained in:
parent
548f92d144
commit
a9705fc22f
|
@ -828,6 +828,7 @@ static int _socket_callback_recv(SSLSocket * sslsocket)
|
||||||
const size_t inc = INC;
|
const size_t inc = INC;
|
||||||
int ssize;
|
int ssize;
|
||||||
char * p;
|
char * p;
|
||||||
|
int err;
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
|
||||||
if((p = realloc(sslsocket->bufin, sslsocket->bufin_cnt + inc)) == NULL)
|
if((p = realloc(sslsocket->bufin, sslsocket->bufin_cnt + inc)) == NULL)
|
||||||
|
@ -836,9 +837,34 @@ static int _socket_callback_recv(SSLSocket * sslsocket)
|
||||||
if((ssize = SSL_read(sslsocket->ssl,
|
if((ssize = SSL_read(sslsocket->ssl,
|
||||||
&sslsocket->bufin[sslsocket->bufin_cnt],
|
&sslsocket->bufin[sslsocket->bufin_cnt],
|
||||||
inc)) <= 0)
|
inc)) <= 0)
|
||||||
|
{
|
||||||
|
/* FIXME not tested */
|
||||||
|
if((err = SSL_get_error(sslsocket->ssl, ssize))
|
||||||
|
== SSL_ERROR_WANT_WRITE)
|
||||||
|
{
|
||||||
|
event_unregister_io_write(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd);
|
||||||
|
event_register_io_write(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd,
|
||||||
|
(EventIOFunc)_ssl_socket_callback_read,
|
||||||
|
sslsocket);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(err == SSL_ERROR_WANT_READ)
|
||||||
|
{
|
||||||
|
event_register_io_read(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd,
|
||||||
|
(EventIOFunc)_ssl_socket_callback_read,
|
||||||
|
sslsocket);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* XXX report error (and reconnect clients) */
|
/* XXX report error (and reconnect clients) */
|
||||||
ERR_error_string(SSL_get_error(sslsocket->ssl, ssize), buf);
|
ERR_error_string(err, buf);
|
||||||
error_set_code(1, "%s", buf);
|
error_set_code(1, "%s", buf);
|
||||||
SSL_free(sslsocket->ssl);
|
SSL_free(sslsocket->ssl);
|
||||||
sslsocket->ssl = NULL;
|
sslsocket->ssl = NULL;
|
||||||
|
@ -846,6 +872,7 @@ static int _socket_callback_recv(SSLSocket * sslsocket)
|
||||||
sslsocket->fd = -1;
|
sslsocket->fd = -1;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
sslsocket->bufin_cnt += ssize;
|
sslsocket->bufin_cnt += ssize;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -855,6 +882,7 @@ static int _socket_callback_recv(SSLSocket * sslsocket)
|
||||||
static int _ssl_socket_callback_write(int fd, SSLSocket * sslsocket)
|
static int _ssl_socket_callback_write(int fd, SSLSocket * sslsocket)
|
||||||
{
|
{
|
||||||
int ssize;
|
int ssize;
|
||||||
|
int err;
|
||||||
char buf[128];
|
char buf[128];
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -865,9 +893,34 @@ static int _ssl_socket_callback_write(int fd, SSLSocket * sslsocket)
|
||||||
return -1;
|
return -1;
|
||||||
if((ssize = SSL_write(sslsocket->ssl, sslsocket->bufout,
|
if((ssize = SSL_write(sslsocket->ssl, sslsocket->bufout,
|
||||||
sslsocket->bufout_cnt)) <= 0)
|
sslsocket->bufout_cnt)) <= 0)
|
||||||
|
{
|
||||||
|
/* FIXME not tested */
|
||||||
|
if((err = SSL_get_error(sslsocket->ssl, ssize))
|
||||||
|
== SSL_ERROR_WANT_READ)
|
||||||
|
{
|
||||||
|
event_unregister_io_read(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd);
|
||||||
|
event_register_io_write(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd,
|
||||||
|
(EventIOFunc)_ssl_socket_callback_write,
|
||||||
|
sslsocket);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else if(err == SSL_ERROR_WANT_WRITE)
|
||||||
|
{
|
||||||
|
event_register_io_write(
|
||||||
|
sslsocket->transport->helper->event,
|
||||||
|
sslsocket->fd,
|
||||||
|
(EventIOFunc)_ssl_socket_callback_write,
|
||||||
|
sslsocket);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
/* XXX report error (and reconnect clients) */
|
/* XXX report error (and reconnect clients) */
|
||||||
ERR_error_string(SSL_get_error(sslsocket->ssl, ssize), buf);
|
ERR_error_string(err, buf);
|
||||||
error_set_code(1, "%s", buf);
|
error_set_code(1, "%s", buf);
|
||||||
SSL_free(sslsocket->ssl);
|
SSL_free(sslsocket->ssl);
|
||||||
sslsocket->ssl = NULL;
|
sslsocket->ssl = NULL;
|
||||||
|
@ -875,6 +928,7 @@ static int _ssl_socket_callback_write(int fd, SSLSocket * sslsocket)
|
||||||
sslsocket->fd = -1;
|
sslsocket->fd = -1;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
fprintf(stderr, "DEBUG: %s() send() => %ld\n", __func__, ssize);
|
fprintf(stderr, "DEBUG: %s() send() => %ld\n", __func__, ssize);
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue
Block a user