469,330 Members | 1,329 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,330 developers. It's quick & easy.

fsockopen problem

Hi, I am trying to complete a post using fsockopen but I'm getting the
following error:

"Unable to find the socket transport "ssl" - did you forget to enable
it when you configured PHP?

I am running php 5.1.4 with apache 2 on fedora core 4. When I
configured php I did it like this:
../configure --with-apxs2=/usr/sbin/apxs --with-mysql

All I'm trying to achieve is to get a response from the neteller test
server, the response will be an error as the numbers I'm sending it are
garbage, but I'm not bothered about that, I just want to be able to
send the request and get the response back. I've searched google for a
while but can't figure out why my code isn't working, I know there were
problems with windows platforms with php4 but obviously, that is not an
issue here...
Thanks in advance, my code is below...
Angus

<?php
//SIMULATES A (HTTP POST) FORM SUBMISSION
//www.zend.com/zend/spotlight/mimocsumissions.php
//takes 2 parameters: associative array containing data to be sent to
server, DNS or IP of server
//returns $result array with lines of response
function post_it($datastream, $url)
{
//replace http:// with the empty string, get host, get resource
$url = preg_replace("@^https://@i", "", $url);
$host = substr($url, 0, strpos($url, "/"));
$uri = strstr($url, "/");

//construct request body: vars and their values
$reqbody ="";
foreach ($datastream as $key => $val)
{
if (!empty($reqbody))
$reqbody .= "&";
$reqbody .= $key."=".urlencode($val);
}

//construct post request to be sent to server, include size of reqbody
$contentlength = strlen($reqbody);
$reqheader = "POST $uri HTTP/1.0 \r\n";
$reqheader .= "Host: $host\n";
$reqheader .= "User-Agent: PostIt\r\n";
$reqheader .= "Content-Type: application/x-www-form-urlencoded\r\n";
$reqheader .= "Content-Length: $contentlength\r\n\r\n";
$reqheader .= "$reqbody\r\n";

//connect to server, send POST request, read result, close socket
$socket = fsockopen("ssl://".$host, 443, $errno, $errstr);

if (!$socket)
{
echo "host: ".$host."<br>";

echo "<p>&nbsp;</p>";

$result["errno"] = $errno;
$result["errstr"] = $errstr;
return $result;
}
fputs($socket, $reqheader);
while (!feof($socket))
{
$result[] = fgets($socket, 4096);
}
fclose($socket);
return $result;
}
?>

<HTML>
<HEAD>
<TITLE>NETeller Transfer</TITLE><META HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
<?php
$data["merchant_ID"] = 123;
$data["merch_transid"] = 123;
$data["test"] = 1;
$data["amount"] = 123;
$data["currency"] = "USD";
$data["net_account"] = 123;
$data["secure_id"] = 123;

$result = post_it($data,
"https://www.neteller.com/gateway/netdirectv4.cfm");

if (isset($result["errno"])) {
$errno = $result["errno"];
$errstr = $result["errstr"];
echo "<B>Error $errno</B> $errstr";
exit;
}
else {
for($i = 0; $i < count($result); $i++)
echo $result[$i];
}
?>
</BODY>
</HTML>

May 20 '06 #1
6 45524
tim

mu**@hotmail.co.uk wrote:
Hi, I am trying to complete a post using fsockopen but I'm getting the
following error:

"Unable to find the socket transport "ssl" - did you forget to enable
it when you configured PHP?

I am running php 5.1.4 with apache 2 on fedora core 4. When I
configured php I did it like this:
./configure --with-apxs2=/usr/sbin/apxs --with-mysql


Hi

My guess is that either mod_ssl is not installed for apache or it is
installed but the configuration lines for mod_ssl are commented out in
httpd.conf (like it was on suse9 for me). apxs will only enable ssl
functions in php if mod_ssl is up and running

So check mod_ssl is available + enabled in apache then try recompiling
php with

./configure --with-apxs2=/usr/sbin/apxs --with-mysql --enable-ssl

Tim

May 20 '06 #2
tim wrote:

mu**@hotmail.co.uk wrote:
Hi, I am trying to complete a post using fsockopen but I'm getting the
following error:

"Unable to find the socket transport "ssl" - did you forget to enable
it when you configured PHP?

I am running php 5.1.4 with apache 2 on fedora core 4. When I
configured php I did it like this:
./configure --with-apxs2=/usr/sbin/apxs --with-mysql


Hi

My guess is that either mod_ssl is not installed for apache or it is


Wrong. You are getting confused about servers and clients - mod_ssl is what
runs on the server. The OP is talking about the client end of an SSL
connection. I had a quick look at the PHP docs and it doesn't tell you the
option for client SSL. Trying with a copy of 5.0.4 I've got
handy, ./configure --help suggests:

--with-openssl[=DIR] Include OpenSSL support (requires OpenSSL >= 0.9.6)

YMMV. Alternatively, as a quick hack, set up a stunnel connection.

C.
May 20 '06 #3
tim

Colin McKinnon wrote:
tim wrote:

mu**@hotmail.co.uk wrote:
Hi, I am trying to complete a post using fsockopen but I'm getting the
following error:

"Unable to find the socket transport "ssl" - did you forget to enable
it when you configured PHP?

I am running php 5.1.4 with apache 2 on fedora core 4. When I
configured php I did it like this:
./configure --with-apxs2=/usr/sbin/apxs --with-mysql


Hi

My guess is that either mod_ssl is not installed for apache or it is


Wrong. You are getting confused about servers and clients - mod_ssl is what
runs on the server. The OP is talking about the client end of an SSL
connection.


I know the difference but I failed to point out the difference clear in
my post and there are good resons in this case to make suggest mod_ssl
is installed.

The OP is going to be submitting details to neteller and I assumed they
will be submitted to him over the web.

When processing banking info over the web its best to have a secure
connection between the web browser->server/php script as well as
between the script/merchant bank. This would need mod_ssl installed in
the server as well as the ssl client functions enabled in php and this
is why I talked about mod_ssl in apache being needed.

Of course I should have said in my post that mod_ssl isnt needed to
enable the the ssl functions in php so thanks for pointing it out.

Tim

May 21 '06 #4
Thank you for the reply.... However, I forgot to mention in my
initial post that if I try it with a normal http post on port 80 it
still throws an error: Something like:

"Unable to find the socket transport "http" - did you forget to enable
it when you configured PHP?

Can someone check to see if the code I've got does actually send the
request and get a response on their system?

Thanks

May 21 '06 #5
tim

Eh Lit wrote:
Thank you for the reply.... However, I forgot to mention in my
initial post that if I try it with a normal http post on port 80 it
still throws an error: Something like:

"Unable to find the socket transport "http" - did you forget to enable
it when you configured PHP?

Can someone check to see if the code I've got does actually send the
request and get a response on their system?

Thanks


Its worked ok for ssl and port 80 on my gf's pc. There was a http 400
error but it was only a missing carriage return in $reqheader .= "Host:
$host\n";

My only suggestion is recompile php with --enable-sockets as well as
--with-openssl like Colin said earlier.

The full response from neteller was

<HTML>
<HEAD>
<TITLE>NETeller Transfer</TITLE><META HTTP-EQUIV="Content-Type"
CONTENT="text/html; charset=iso-8859-1">
</HEAD>
<BODY>
HTTP/1.1 200 OK
Connection: close
Date: Sun, 21 May 2006 01:00:03 GMT
Content-Type: text/html; charset=UTF-8
Server: Microsoft-IIS/6.0 Geobytes-GeoSelect/2.1.0.1
Set-Cookie:
WEBTRENDS_ID=80.192.149.30-3837753504.29785201::380E735293EA42E24D4975C6BB5EC 4EF;
path=/; expires=Mon, 21-May-2007 01:00:03 GMT

<?xml version="1.0" encoding="ISO-8859-1"?><netdirect version="4.0">
<approval>no</approval>
<error>1020</error>
<custom_1>none</custom_1>

<custom_2>none</custom_2>
<custom_3>none</custom_3>
</netdirect>

</BODY>
</HTML>

May 21 '06 #6
tim
Thank you for the reply.... However, I forgot to mention in my
initial post that if I try it with a normal http post on port 80 it
still throws an error: Something like:

"Unable to find the socket transport "http" - did you forget to enable
it when you configured PHP?
My only suggestion is recompile php with --enable-sockets as well as
--with-openssl like Colin said earlier.
I made a big mistake. I thought fsockopen was one of the socket
functions and needed enabling. It isn't. Its one of the network
functions and is always available.

By chance I got the exact same message you had when I tried
fsockopen('http://servername.com',80) but itr workde when I tried
fsockopen('servername.com',80)
From the looks of http://uk.php.net/manual/en/transports.php the right

way to do a normal http request with fsockopen is using 'tcp://' not
'http://'.....Also tcp:// is assumed if by default if one isn't
specified and http:// isnt recognised.

Tim

May 21 '06 #7

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

2 posts views Thread by Chris | last post: by
2 posts views Thread by Colin Bell | last post: by
9 posts views Thread by fipaj1992 | last post: by
1 post views Thread by Syl | last post: by
8 posts views Thread by Yoko | last post: by
reply views Thread by zhoujie | last post: by
reply views Thread by suresh191 | last post: by
reply views Thread by Purva khokhar | last post: by
reply views Thread by haryvincent176 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.