PHP ver gevorderde |
|
Beste,
Ik heb onlangs een systeem ontwikkeld waarbij ook gebruikt wordt gemaakt van de iDEAL API uitgegeven door Mollie.
Deze maak gebruik van een SSL verbinding (ssl://secure.mollie.nl). Lokaal werkt het allemaal perfect, maar zodra ik het op de host upload krijg ik de warning:
Warning: fgets() [function.fgets]: SSL: fatal protocol error in ... line 160
In de phpinfo vind ik terug:
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, sslv2, tls
En zodra ik stream_get_transports() output krijg ik de volgende waardes terug:
Array ( [0] => tc [1] => ud [2] => uni [3] => ud [4] => ss [5] => sslv [6] => sslv [7] => tl )
Naar mijn idee zal dit toch gewoon horen te werken?
De betreffende code:
<?php
$hostname = str_replace('ssl://', '', $host); // $host heeft als waarde "ssl://secure.mollie.nl"
$fp = @fsockopen($host, $port, $errno, $errstr);
$buf = '';
if (!$fp)
{
$this->error_message = 'Kon geen verbinding maken met server: ' . $errstr;
$this->error_code = 0;
return false;
}
@fputs($fp, "POST $path HTTP/1.0\n");
@fputs($fp, "Host: $hostname\n");
@fputs($fp, "Content-type: application/x-www-form-urlencoded\n");
@fputs($fp, "Content-length: " . strlen($data) . "\n");
@fputs($fp, "Connection: close\n\n");
@fputs($fp, $data);
while (!feof($fp)) {
$buf .= fgets($fp, 128); // line 160
}
fclose($fp);
?>
<?php $hostname = str_replace('ssl://', '', $host); // $host heeft als waarde "ssl://secure.mollie.nl" $fp = @fsockopen($host, $port, $errno, $errstr); $buf = ''; if (!$fp) { $this->error_message = 'Kon geen verbinding maken met server: ' . $errstr; $this->error_code = 0; return false; } @fputs($fp, "POST $path HTTP/1.0\n"); @fputs($fp, "Host: $hostname\n"); @fputs($fp, "Content-type: application/x-www-form-urlencoded\n"); @fputs($fp, "Content-length: " . strlen($data) . "\n"); @fputs($fp, "Connection: close\n\n"); $buf .= fgets($fp, 128); // line 160 } ?>
Ik had het liefst vanavond de boel online gegooid, maar dit is natuurlijk hartstikke vervelend.
Hopelijk heeft iemand een oplossing!
Mvg,
Jarno
edit: wel verbazend is dat stream_get_transports geen "ssl" returned.
edit2: ik vond het volgende op php.net:
"When using SSL, Microsoft IIS will violate the protocol by closing the connection without sending a close_notify indicator. PHP will report this as "SSL: Fatal Protocol Error" when you reach the end of the data. To work around this, the value of error_reporting should be lowered to a level that does not include warnings."
En tot mijn grote verbazing werkt de request wel gewoon, vervolgens de error reporting op E_ALL ^ E_WARNING gezet en het werkt allemaal naar behoren.
|