net.openssl: read doesn't block infinitely (#14406)
parent
c01a8a1737
commit
eeff02a8ee
|
@ -151,30 +151,31 @@ pub fn (mut s SSLConn) socket_read_into_ptr(buf_ptr &u8, len int) ?int {
|
||||||
mut res := 0
|
mut res := 0
|
||||||
for {
|
for {
|
||||||
res = C.SSL_read(voidptr(s.ssl), buf_ptr, len)
|
res = C.SSL_read(voidptr(s.ssl), buf_ptr, len)
|
||||||
if res < 0 {
|
if res >= 0 {
|
||||||
|
return res
|
||||||
|
} else {
|
||||||
err_res := ssl_error(res, s.ssl)?
|
err_res := ssl_error(res, s.ssl)?
|
||||||
if err_res == .ssl_error_want_read {
|
match err_res {
|
||||||
for {
|
.ssl_error_want_read {
|
||||||
ready := @select(s.handle, .read, s.duration)?
|
ready := @select(s.handle, .read, s.duration)?
|
||||||
if ready {
|
if !ready {
|
||||||
break
|
return net.err_timed_out
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue
|
.ssl_error_want_write {
|
||||||
} else if err_res == .ssl_error_want_write {
|
|
||||||
for {
|
|
||||||
ready := @select(s.handle, .write, s.duration)?
|
ready := @select(s.handle, .write, s.duration)?
|
||||||
if ready {
|
if !ready {
|
||||||
break
|
return net.err_timed_out
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue
|
.ssl_error_zero_return {
|
||||||
} else if err_res == .ssl_error_zero_return {
|
return 0
|
||||||
return 0
|
}
|
||||||
|
else {
|
||||||
|
return error('Could not read using SSL. ($err_res)')
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return error('Could not read using SSL. ($err_res)')
|
|
||||||
}
|
}
|
||||||
break
|
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue