Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

php - Whois works with fsockopen not with curl

This works:

$connection = fsockopen("whois.iis.se", 43);
fputs($connection, "google.se
");
while (!feof($connection)) {
    $data .= fgets($connection, 4096);
}
fclose($connection);
echo nl2br($data);

But this do not work:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "whois.iis.se");
curl_setopt($ch, CURLOPT_PORT, 43);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "google.se
");
$data = curl_exec($ch); 
curl_close($ch);
echo nl2br($data);

What is wrong with this curl function?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

I know this is a year old but: The accepted answer is incorrect. cURL actually did have functionality to support the Whois protocol but it takes a bit more than a simple request.

I do not know the exact translation to PHP but I think this would just need options changed to support TELNET since that is what Whois uses:

curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_TELNET);

Finally once you get a response back, you may need to deal with referrals unless you are hitting the direct Whois server that has the actual WhoIs data. For the Whois server in the example it should return mot addresses as as the response for google.se.

This support has been in it for a long time now, I believe even before this question was asked.


UPDATE:

Sorry, haven't really worked with PHP much and PHP's CURL but got the following to work. It isn't ideal but wasn't sure best way to handle the stdin stuff.

$filename = "query.txt";
$fp = fopen($filename, "r");

function readFunc($ch, $fh, $length = false) {
  return fread($fh, $length);
}

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "telnet://whois.iis.se:43");
curl_setopt($ch, CURLOPT_PORT, 43);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($ch, CURLOPT_NOPROGRESS, TRUE);
curl_setopt($ch, CURLOPT_PROTOCOLS, CURLPROTO_TELNET);
curl_setopt($ch, CURLOPT_INFILE, $fp);
curl_setopt($ch, CURLOPT_INFILESIZE, filesize($filename));
curl_setopt($ch, CURLOPT_READFUNCTION, 'readFunc');
curl_setopt($ch, CURLOPT_VERBOSE, TRUE);  // Can take this out

$data = curl_exec($ch);
curl_close($ch);
echo nl2br($data);

This then returns:

$ php query.php
* Rebuilt URL to: telnet://whois.iis.se:43/
*   Trying 91.226.37.83...
* TCP_NODELAY set
* Connected to whois.iis.se (91.226.37.83) port 43 (#0)
* Closing connection 0
# Copyright (c) 1997- IIS (The Internet Foundation In Sweden).<br />
# All rights reserved.<br />
# The information obtained through searches, or otherwise, is protected<br />
# by the Swedish Copyright Act (1960:729) and international conventions.<br />
# It is also subject to database protection according to the Swedish<br />
# Copyright Act.<br />
# Any use of this material to target advertising or<br />
# similar activities is forbidden and will be prosecuted.<br />
# If any of the information below is transferred to a third<br />
# party, it must be done in its entirety. This server must<br />
# not be used as a backend for a search engine.<br />
# Result of search for registered domain names under<br />
# the .se top level domain.<br />
# This whois printout is printed with UTF-8 encoding.<br />
#<br />
state:            active<br />
domain:           google.se<br />
holder:           mmr8008-53808<br />
admin-c:          -<br />
tech-c:           -<br />
billing-c:        -<br />
created:          2008-10-20<br />
modified:         2016-09-18<br />
expires:          2017-10-20<br />
transferred:      2009-03-06<br />
nserver:          ns1.google.com<br />
nserver:          ns2.google.com<br />
nserver:          ns3.google.com<br />
nserver:          ns4.google.com<br />
dnssec:           unsigned delegation<br />
status:           serverDeleteProhibited<br />
status:           serverTransferProhibited<br />
status:           serverUpdateProhibited<br />
registrar:        MarkMonitor Inc<br />

If you need it to work for random strings, then you can easily just write to a temporary file and use that to pass into the function. I unfortunately do not have the time to continue digging through the PHP curl options to determine which option may work best for streaming the data to the WHOIS server.

The file query.txt just has google.se in it.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to WuJiGu Developer Q&A Community for programmer and developer-Open, Learning and Share
...