Skip to content

Requests to localhost are handed to DNS resolver #11

Closed

Description

@andig

...where they invariably fail.

Activity

  1. steverhoades commented on Nov 13, 2014

    @steverhoades

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

  2. andig commented on Nov 14, 2014

    @andig
    Author

    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...

  3. frankmayer commented on Apr 15, 2015

    @frankmayer

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

  4. frankmayer commented on Apr 15, 2015

    @frankmayer

    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.

  5. WyriHaximus commented on Apr 28, 2015

    @WyriHaximus
    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

  6. frankmayer commented on Apr 28, 2015

    @frankmayer

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

  7. itcreator commented on May 29, 2015

    @itcreator

    +1 for docker

  8. clue commented on May 31, 2015

    @clue
    Member

    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.

  9. filsh commented on May 5, 2016

    @filsh
  10. SamMousa commented on Sep 13, 2016

    @SamMousa

    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.

  11. added this to the v0.5.4 milestone on Aug 25, 2017
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions