Search code examples
phpfsockopenopenvas

PHP fread hangs when using SSL


I'm using fsockopen to connect to an OpenVAS manager and send XML. The code I am using is:

$connection = fsockopen('ssl://'.$server_data['host'], $server_data['port']);
stream_set_timeout($connection, 5);
fwrite($connection, $xml);

while ($chunk = fread($connection, 2048)) {
    $response .= $chunk;
}

However after reading the first two chunks of data, PHP hangs on fread and doesn't time out after 5 seconds. I have tried using stream_get_contents, which gives the same result, BUT if I only use one fread, it works ok, just that I want to read everything, regardless of length.

I am guessing, it is an issue with OpenVAS, which doesn't end the stream the way PHP expects it to, but that's a shot in the dark. How do I read the stream?


Solution

  • I believe that fread is hanging up because on that last chunk, it is expecting 2048 bytes of information and is probably getting less that that, so it waits until it times out.

    You could try to refactor your code like this:

    $bytes_to_read = 2048;
    while ($chunk = fread($connection, $bytes_to_read)) {
      $response .= $chunk;
      $status = socket_get_status ($connection);
      $bytes_to_read = $status["unread_bytes"];
    }
    

    That way, you'll read everything in two chunks.... I haven't tested this code, but I remember having a similar issue a while ago and fixing it with something like this.

    Hope it helps!