When there's a read timeout, the response looks something like this:
FusionAuth\ClientResponse::__set_state(array(
'errorResponse' => NULL,
'exception' => NULL,
'method' => 'PATCH',
'request' =>
array (
'user' =>
array (
/* ... */
),
),
'successResponse' => NULL,
'status' => 0,
))
i.e. The errorResponse, exception, and successResponse are all NULL.
I think the code needs to use curl_errno to check for errors.