Skip to content

Instantly share code, notes, and snippets.

@WyriHaximus
Created September 29, 2014 19:33
Show Gist options
  • Save WyriHaximus/bc1e06d30c510cac1d01 to your computer and use it in GitHub Desktop.
Save WyriHaximus/bc1e06d30c510cac1d01 to your computer and use it in GitHub Desktop.
reactphp proxy
<?php
$dnsResolverFactory = new \React\Dns\Resolver\Factory();
$dnsResolver = $dnsResolverFactory->createCached('8.8.8.8', $loop);
$factory = new \React\HttpClient\Factory();
$client = $factory->create($loop, $dnsResolver);
$socket = new \React\Socket\Server($loop);
$http = new \React\Http\Server($socket);
$http->on('request', function (\React\Http\Request $request, \React\Http\Response $response) use ($client, $loop) {
$query = array();
foreach ($request->getQuery() as $key => $value) {
$query[] = $key . '=' . $value;
}
$request = $client->request($request->getMethod(), 'http://site' . $request->getPath() . '?' . implode('&', $query));
$request->on('response', function (\React\HttpClient\Response $upstreamResponse) use ($response, $loop, $request) {
$headers = $upstreamResponse->getHeaders();
$response->writeHead($upstreamResponse->getCode(), $headers);
$upstreamResponse->on('data', function ($data) use ($response) {
$response->write($data);
});
$request->on('end', function () use ($response, $loop) {
$response->end('');
});
});
$request->end();
});
$socket->listen(6666, '0.0.0.0');
@miladr
Copy link

miladr commented Nov 29, 2014

I'm using it like this but i'm getting

feof():  is not a valid stream resource
<?php

require '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);

$socket = new \React\Socket\Server($loop);

$http = new \React\Http\Server($socket);
$http->on('request', function (\React\Http\Request $request, \React\Http\Response $response) use ($client, $loop) {
        $query = array();
        foreach ($request->getQuery() as $key => $value) {
            $query[] = $key . '=' . $value;
        }
        $request = $client->request('GET' , 'http://httpbin.org/get' .  '?' . implode('&', $query));
        $request->on('response', function (\React\HttpClient\Response $upstreamResponse) use ($response, $loop, $request) {
                $headers = $upstreamResponse->getHeaders();
                $response->writeHead($upstreamResponse->getCode(), $headers);
                $upstreamResponse->on('data', function ($data) use ($response) {
                        $response->write($data);
                    });
                $request->on('end', function () use ($response, $loop) {
                        $response->end('');
                    });
            });
        $request->end();
    });

$socket->listen(6666, '0.0.0.0');

$loop->run();

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