Skip to content

Instantly share code, notes, and snippets.

@jsor
Created October 24, 2012 21:19
Show Gist options
  • Select an option

  • Save jsor/3948956 to your computer and use it in GitHub Desktop.

Select an option

Save jsor/3948956 to your computer and use it in GitHub Desktop.
<?php
namespace React\Whois;
use Promise\Deferred as Deferred;
use React\Curry\Util as Curry;
use React\Dns\Resolver\Resolver;
class Client
{
private $dns;
private $connFactory;
public function __construct(Resolver $dns, $connFactory)
{
$this->dns = $dns;
$this->connFactory = $connFactory;
}
public function query($domain, $callback = null)
{
return $this
->resolveWhoisServer($domain)
->then(Curry::bind(array($this, 'queryWhoisServer'), $domain))
->then(function ($result) use ($callback) {
if (is_callable($callback)) {
call_user_func($callback, $result);
}
return $result;
});
}
public function resolveWhoisServer($domain)
{
$deferred = new Deferred();
$tld = substr(strrchr($domain, '.'), 1);
$target = $tld.'.whois-servers.net';
$this->dns->resolve($target, array($deferred, 'resolve'));
return $deferred->promise();
}
public function queryWhoisServer($domain, $ip)
{
$deferred = new Deferred();
$result = '';
$conn = call_user_func($this->connFactory, $ip);
$conn->write("$domain\r\n");
$conn->on('data', function ($data) use (&$result) {
$result .= $data;
});
$conn->on('close', array($deferred, 'resolve'));
return $deferred
->promise()
->then(function ($result) {
return str_replace("\r\n", "\n", $result);
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment