Made retry secure write/read use the exactly last parameters #4539

This commit is contained in:
XinyuHou 2015-04-17 14:01:35 +01:00
parent 951cbe9a62
commit 586a893201
2 changed files with 28 additions and 1 deletions

View File

@ -461,15 +461,26 @@ TCPSocket::serviceConnected(ISocketMultiplexerJob* job,
}
bool needNewJob = false;
static UInt32 s_retryOutputBufferSize = 0;
if (write) {
try {
// write data
UInt32 n = m_outputBuffer.getSize();
if (s_retryOutputBufferSize > 0) {
n = s_retryOutputBufferSize;
}
const void* buffer = m_outputBuffer.peek(n);
if (isSecure()) {
if (isSecureReady()) {
s_retryOutputBufferSize = n;
n = secureWrite(buffer, n);
if (n > 0) {
s_retryOutputBufferSize = 0;
}
}
else {
return job;
@ -519,7 +530,8 @@ TCPSocket::serviceConnected(ISocketMultiplexerJob* job,
if (read && m_readable) {
try {
UInt8 buffer[4096];
static UInt8 buffer[4096];
memset(buffer, 0, sizeof(buffer));
size_t n = 0;
if (isSecure()) {

View File

@ -370,6 +370,21 @@ SecureSocket::checkResult(int n, bool& fatal, bool& retry)
case SSL_ERROR_SYSCALL:
LOG((CLOG_ERR "secure socket error: SSL_ERROR_SYSCALL"));
if (ERR_peek_error() == 0) {
if (n == 0) {
LOG((CLOG_ERR "an EOF violates the protocol"));
}
else if (n == -1) {
// underlying socket I/O reproted an error
try {
ARCH->throwErrorOnSocket(getSocket());
}
catch (XArchNetwork& e) {
LOG((CLOG_ERR "%s", e.what()));
}
}
}
fatal = true;
break;