Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Requests to localhost are handed to DNS resolver #11

Closed
andig opened this issue Oct 10, 2014 · 10 comments · Fixed by #108
Closed

Requests to localhost are handed to DNS resolver #11

andig opened this issue Oct 10, 2014 · 10 comments · Fixed by #108

Comments

@andig
Copy link

andig commented Oct 10, 2014

...where they invariably fail.

@steverhoades
Copy link

@andig Can you please provide a test case for this? That will help us in replicating / resolving the issue.

@andig
Copy link
Author

andig commented Nov 14, 2014

Sure:

<?php
require_once '/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();

$dnsResolverFactory = new React\Dns\Resolver\Factory();
$dnsResolver = $dnsResolverFactory->createCached('8.8.8.8', $loop);

$factory = new React\HttpClient\Factory();
$client = $factory->create($loop, $dnsResolver);

$request = $client->request('GET', 'http://localhost/');
$request->on('response', function ($response) {
    $response->on('data', function ($data) {
        // ...
    });
});
$request->on('error', function ($error, $response) {
    echo("Request error: $error\n");
});

$request->end();

$loop->run();

Gives (Windows):

Request error: exception 'React\Dns\RecordNotFoundException' with message 'DNS Request did not return valid answer.' in
C:\vendor\react\react\src\Dns\Resolver\Resolver.php:40Stack trace:
#0 C:\vendor\react\react\src\Dns\Resolver\Resolver.php(28): React\Dns\Resolver\Resolver->extractAddress(Object(React\Dns\Query\Query), Object(React\Dns\Model\Message))
#1 C:\vendor\react\promise\src\FulfilledPromise.php(24): React\Dns\Resolver\Resolver->React\Dns\Resolver\{closure}(Object(React\Dns\Model\Message))
#2 C:\vendor\react\promise\src\Promise.php(69): React\Promise\FulfilledPromise->then(Object(Closure), NULL)
#3 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#4 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#5 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#6 C:\vendor\react\promise\src\FulfilledPromise.php(24): React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#7 C:\vendor\react\promise\src\Promise.php(70): React\Promise\FulfilledPromise->then(Object(Closure), Object(Closure), Object(Closure))
#8 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#9 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#10 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#11 [internal function]: React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#12 C:\vendor\react\promise\src\Deferred.php(35): call_user_func(Object(Closure), Object(React\Dns\Model\Message))
#13 C:\vendor\react\promise\src\FulfilledPromise.php(24): React\Promise\Deferred->resolve(Object(React\Dns\Model\Message))
#14 C:\vendor\react\promise\src\Promise.php(69): React\Promise\FulfilledPromise->then(Array, Object(Closure))
#15 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#16 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#17 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#18 [internal function]: React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#19 C:\vendor\react\promise\src\Deferred.php(35): call_user_func(Object(Closure), Object(React\Dns\Model\Message))
#20 C:\vendor\react\react\src\Dns\Query\Executor.php(88): React\Promise\Deferred->resolve(Object(React\Dns\Model\Message))
#21 [internal function]: React\Dns\Query\Executor->React\Dns\Query\{closure}('\xDB\xF1\x81\x83\x00\x01\x00\x00\x00\x01\x00\x00\tlo...', Object(React\Socket\Connection))
#22 C:\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(64): call_user_func_array(Object(Closure), Array)
#23 C:\vendor\react\react\src\Socket\Connection.php(15): Evenement\EventEmitter->emit('data', Array)
#24 [internal function]: React\Socket\Connection->handleData(Resource id #53, Object(React\EventLoop\StreamSelectLoop))
#25 C:\vendor\react\react\src\EventLoop\StreamSelectLoop.php(227): call_user_func(Array, Resource id #53, Object(React\EventLoop\StreamSelectLoop))
#26 C:\vendor\react\react\src\EventLoop\StreamSelectLoop.php(201): React\EventLoop\StreamSelectLoop->waitForStreamActivity(4980999.9465942)
#27 C:\test.php(25): React\EventLoop\StreamSelectLoop->run()
#28 {main}
Next exception 'RuntimeException' with message 'An error occurred in the underlying stream' in C:\vendor\react\react\src\HttpClient\Request.php:162Stack trace:
#0 C:\vendor\react\promise\src\RejectedPromise.php(25): React\HttpClient\Request->handleError(Object(React\Dns\RecordNotFoundException))
#1 C:\vendor\react\promise\src\Promise.php(69): React\Promise\RejectedPromise->then(Object(Closure), Array)
#2 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\RejectedPromise))
#3 C:\vendor\react\promise\src\Promise.php(92): React\Promise\Promise->settle(Object(React\Promise\RejectedPromise))
#4 C:\vendor\react\promise\src\Promise.php(125): React\Promise\Promise->reject(Object(React\Dns\RecordNotFoundException))
#5 C:\vendor\react\promise\src\RejectedPromise.php(25): React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\RecordNotFoundException))
#6 C:\vendor\react\promise\src\Promise.php(70): React\Promise\RejectedPromise->then(Object(Closure), Object(Closure), Object(Closure))
#7 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\RejectedPromise))
#8 C:\vendor\react\promise\src\Promise.php(92): React\Promise\Promise->settle(Object(React\Promise\RejectedPromise))
#9 C:\vendor\react\promise\src\Promise.php(125): React\Promise\Promise->reject(Object(React\Dns\RecordNotFoundException))
#10 C:\vendor\react\promise\src\RejectedPromise.php(25): React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\RecordNotFoundException))
#11 C:\vendor\react\promise\src\Promise.php(70): React\Promise\RejectedPromise->then(Object(Closure), Object(Closure), Object(Closure))
#12 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#13 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#14 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#15 C:\vendor\react\promise\src\FulfilledPromise.php(24): React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#16 C:\vendor\react\promise\src\Promise.php(70): React\Promise\FulfilledPromise->then(Object(Closure), Object(Closure), Object(Closure))
#17 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#18 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#19 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#20 [internal function]: React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#21 C:\vendor\react\promise\src\Deferred.php(35): call_user_func(Object(Closure), Object(React\Dns\Model\Message))
#22 C:\vendor\react\promise\src\FulfilledPromise.php(24): React\Promise\Deferred->resolve(Object(React\Dns\Model\Message))
#23 C:\vendor\react\promise\src\Promise.php(69): React\Promise\FulfilledPromise->then(Array, Object(Closure))
#24 C:\vendor\react\promise\src\Promise.php(109): React\Promise\Promise->React\Promise\{closure}(Object(React\Promise\FulfilledPromise))
#25 C:\vendor\react\promise\src\Promise.php(83): React\Promise\Promise->settle(Object(React\Promise\FulfilledPromise))
#26 C:\vendor\react\promise\src\Promise.php(122): React\Promise\Promise->resolve(Object(React\Dns\Model\Message))
#27 [internal function]: React\Promise\Promise->React\Promise\{closure}(Object(React\Dns\Model\Message))
#28 C:\vendor\react\promise\src\Deferred.php(35): call_user_func(Object(Closure), Object(React\Dns\Model\Message))
#29 C:\vendor\react\react\src\Dns\Query\Executor.php(88): React\Promise\Deferred->resolve(Object(React\Dns\Model\Message))
#30 [internal function]: React\Dns\Query\Executor->React\Dns\Query\{closure}('\xDB\xF1\x81\x83\x00\x01\x00\x00\x00\x01\x00\x00\tlo...', Object(React\Socket\Connection))
#31 C:\vendor\evenement\evenement\src\Evenement\EventEmitterTrait.php(64): call_user_func_array(Object(Closure), Array)
#32 C:\vendor\react\react\src\Socket\Connection.php(15): Evenement\EventEmitter->emit('data', Array)
#33 [internal function]: React\Socket\Connection->handleData(Resource id #53, Object(React\EventLoop\StreamSelectLoop))
#34 C:\vendor\react\react\src\EventLoop\StreamSelectLoop.php(227): call_user_func(Array, Resource id #53, Object(React\EventLoop\StreamSelectLoop))
#35 C:\vendor\react\react\src\EventLoop\StreamSelectLoop.php(201): React\EventLoop\StreamSelectLoop->waitForStreamActivity(4980999.9465942)
#36 C:\test.php(25): React\EventLoop\StreamSelectLoop->run()
#37 {main}

Either the DNSresolver should honor the hosts file or the client should not pass local requests to the DNS resolver- dunno which is better...

@frankmayer
Copy link

Hi there. Is there any solution planned for this? It bit me today (Using docker containers) 😄

@frankmayer
Copy link

This is actually a bigger issue when working with linked containers in Docker.
Explanation:
In Docker, when a link is created from one container to the other, for example from a php container to a db or service container, then the (dynamic) ip & hostname for that target container is written into /etc/hosts, Since the DNS resolver does not honor /etc/hosts, the lookup fails. Somehow the hosts file (in any system) should be respected.

@WyriHaximus
Copy link
Member

There is an issue about this on on the DNS component: reactphp/dns#10

Since I'm also working on the filesystem component we should look into using that to resolve this 👍 /cc @clue

@frankmayer
Copy link

BTW, I found a temporary workaround, for the docker problem, using "dnsmasq" and described it in my blog.

@itcreator
Copy link

+1 for docker

@clue
Copy link
Member

clue commented May 31, 2015

Big +1 for getting this in, both for convenience ("localhost" etc.) and for Docker containers!

This depends on upstream components (see reactphp-legacy/socket-client#35 which in turn depends on reactphp/dns#10) and for now there's little we can do here.

@filsh
Copy link

filsh commented May 5, 2016

I used it
http://php.net/manual/en/function.gethostbyname.php

@SamMousa
Copy link

One solution would be to implement a HostsExecutor and a FallthroughExecutor, combining these you would be able to have proper hosts file functionality, if you want it.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging a pull request may close this issue.

8 participants