Skip to content
Closed
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
5e29f51
Middleware
WyriHaximus Aug 14, 2017
6ecd9dc
Merged in master
WyriHaximus Aug 16, 2017
e883ae8
Merge branch 'master' into middleware
WyriHaximus Aug 16, 2017
9e318ed
Updated Server.php documentation
WyriHaximus Aug 16, 2017
0447be8
Updated readme code examples
WyriHaximus Aug 16, 2017
1eac846
Use MiddlewareStack directly in example 13
WyriHaximus Aug 17, 2017
f7fa17f
Document middleware in the readme
WyriHaximus Aug 17, 2017
f27febb
Removed PSR15RecoilMiddlewareStack as it is implemented in a for package
WyriHaximus Aug 19, 2017
ad7f8bb
Removed unused class imports from Server.php
WyriHaximus Aug 19, 2017
4699ea0
Removed unused class imports from MiddlewareStack.php
WyriHaximus Aug 19, 2017
9c3a09a
Allow both ResponseInterface and PromiseInterface<ResponseInterface> …
WyriHaximus Aug 19, 2017
ba9e744
Added supported types for Server::__construct InvalidArgumentException
WyriHaximus Aug 19, 2017
ece043b
When passing a callable to Server::__construct it is automatically wr…
WyriHaximus Aug 19, 2017
21aff47
PHP 5.3 compatibility fixes
WyriHaximus Aug 19, 2017
567f924
Use fully qualified class names in Server::__construct InvalidArgumen…
WyriHaximus Aug 19, 2017
1dfb784
Catch exceptions in MiddlewareStack
WyriHaximus Aug 21, 2017
1052597
Moved exception catching to the Callback middleware and MiddlewareSta…
WyriHaximus Aug 22, 2017
8cfcdf5
self => MiddlewareStack
WyriHaximus Aug 22, 2017
3fef536
PHP 5.3 compatibility
WyriHaximus Aug 22, 2017
b4211aa
Removed middleware related interfaces and assume all middlewares (and…
WyriHaximus Sep 4, 2017
0f6df46
Updated examples and renamed the MiddlewareStack to MiddlewareRunner
WyriHaximus Sep 4, 2017
7c32bc1
Restored Server.php documentation
WyriHaximus Sep 5, 2017
4e9d514
Restored Server.php constructor documentation
WyriHaximus Sep 5, 2017
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
451 changes: 283 additions & 168 deletions README.md

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
"react/socket": "^1.0 || ^0.8 || ^0.7 || ^0.6 || ^0.5",
"react/stream": "^1.0 || ^0.7 || ^0.6 || ^0.5 || ^0.4.6",
"react/promise": "^2.3 || ^1.2.1",
"evenement/evenement": "^3.0 || ^2.0 || ^1.0"
"evenement/evenement": "^3.0 || ^2.0 || ^1.0",
"react/promise-stream": "^0.1.1"
},
"autoload": {
"psr-4": {
Expand All @@ -18,7 +19,6 @@
},
"require-dev": {
"phpunit/phpunit": "^4.8.10||^5.0",
"react/promise-stream": "^0.1.1",
"react/socket": "^1.0 || ^0.8 || ^0.7",
"clue/block-react": "^1.1"
}
Expand Down
21 changes: 12 additions & 9 deletions examples/01-hello-world.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,25 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) {
return new Response(
200,
array(
'Content-Type' => 'text/plain'
),
"Hello world\n"
);
});
$server = new Server([
new Callback(function (ServerRequestInterface $request) {
return new Response(
200,
array(
'Content-Type' => 'text/plain'
),
"Hello world\n"
);
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
17 changes: 10 additions & 7 deletions examples/02-count-visitors.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;

Expand All @@ -10,13 +11,15 @@
$loop = Factory::create();

$counter = 0;
$server = new Server(function (ServerRequestInterface $request) use (&$counter) {
return new Response(
200,
array('Content-Type' => 'text/plain'),
"Welcome number " . ++$counter . "!\n"
);
});
$server = new Server([
new Callback(function (ServerRequestInterface $request) use (&$counter) {
return new Response(
200,
array('Content-Type' => 'text/plain'),
"Welcome number " . ++$counter . "!\n"
);
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
21 changes: 12 additions & 9 deletions examples/03-client-ip.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,22 +2,25 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) {
$body = "Your IP is: " . $request->getServerParams()['REMOTE_ADDR'];

return new Response(
200,
array('Content-Type' => 'text/plain'),
$body
);
});
$server = new Server([
new Callback(function (ServerRequestInterface $request) {
$body = "Your IP is: " . $request->getServerParams()['REMOTE_ADDR'];

return new Response(
200,
array('Content-Type' => 'text/plain'),
$body
);
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
29 changes: 16 additions & 13 deletions examples/04-query-parameter.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,32 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) {
$queryParams = $request->getQueryParams();
$server = new Server([
new Callback(function (ServerRequestInterface $request) {
$queryParams = $request->getQueryParams();

$body = 'The query parameter "foo" is not set. Click the following link ';
$body .= '<a href="/?foo=bar">to use query parameter in your request</a>';
$body = 'The query parameter "foo" is not set. Click the following link ';
$body .= '<a href="/?foo=bar">to use query parameter in your request</a>';

if (isset($queryParams['foo'])) {
$body = 'The value of "foo" is: ' . htmlspecialchars($queryParams['foo']);
}
if (isset($queryParams['foo'])) {
$body = 'The value of "foo" is: ' . htmlspecialchars($queryParams['foo']);
}

return new Response(
200,
array('Content-Type' => 'text/html'),
$body
);
});
return new Response(
200,
array('Content-Type' => 'text/html'),
$body
);
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
37 changes: 20 additions & 17 deletions examples/05-cookie-handling.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,35 +2,38 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;

require __DIR__ . '/../vendor/autoload.php';

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) {
$key = 'react\php';
$server = new Server([
new Callback(function (ServerRequestInterface $request) {
$key = 'react\php';

if (isset($request->getCookieParams()[$key])) {
$body = "Your cookie value is: " . $request->getCookieParams()[$key];
if (isset($request->getCookieParams()[$key])) {
$body = "Your cookie value is: " . $request->getCookieParams()[$key];

return new Response(
200,
array('Content-Type' => 'text/plain'),
$body
);
}

return new Response(
200,
array('Content-Type' => 'text/plain'),
$body
array(
'Content-Type' => 'text/plain',
'Set-Cookie' => urlencode($key) . '=' . urlencode('test;more')
),
"Your cookie has been set."
);
}

return new Response(
200,
array(
'Content-Type' => 'text/plain',
'Set-Cookie' => urlencode($key) . '=' . urlencode('test;more')
),
"Your cookie has been set."
);
});
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
25 changes: 14 additions & 11 deletions examples/06-sleep.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;
use React\Promise\Promise;
Expand All @@ -10,18 +11,20 @@

$loop = Factory::create();

$server = new Server(function (ServerRequestInterface $request) use ($loop) {
return new Promise(function ($resolve, $reject) use ($request, $loop) {
$loop->addTimer(1.5, function() use ($loop, $resolve) {
$response = new Response(
200,
array('Content-Type' => 'text/plain'),
"Hello world"
);
$resolve($response);
$server = new Server([
new Callback(function (ServerRequestInterface $request) use ($loop) {
return new Promise(function ($resolve, $reject) use ($request, $loop) {
$loop->addTimer(1.5, function() use ($loop, $resolve) {
$response = new Response(
200,
array('Content-Type' => 'text/plain'),
"Hello world"
);
$resolve($response);
});
});
});
});
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
37 changes: 20 additions & 17 deletions examples/07-error-handling.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;
use React\Promise\Promise;
Expand All @@ -11,23 +12,25 @@
$loop = Factory::create();

$count = 0;
$server = new Server(function (ServerRequestInterface $request) use (&$count) {
return new Promise(function ($resolve, $reject) use (&$count) {
$count++;

if ($count%2 === 0) {
throw new Exception('Second call');
}

$response = new Response(
200,
array('Content-Type' => 'text/plain'),
"Hello World!\n"
);

$resolve($response);
});
});
$server = new Server([
new Callback(function (ServerRequestInterface $request) use (&$count) {
return new Promise(function ($resolve, $reject) use (&$count) {
$count++;

if ($count%2 === 0) {
throw new Exception('Second call');
}

$response = new Response(
200,
array('Content-Type' => 'text/plain'),
"Hello World!\n"
);

$resolve($response);
});
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
47 changes: 25 additions & 22 deletions examples/08-stream-response.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

use Psr\Http\Message\ServerRequestInterface;
use React\EventLoop\Factory;
use React\Http\Middleware\Callback;
use React\Http\Response;
use React\Http\Server;
use React\Stream\ThroughStream;
Expand All @@ -10,28 +11,30 @@

$loop = Factory::create();

$server = new Server($loop,function (ServerRequestInterface $request) use ($loop) {
if ($request->getMethod() !== 'GET' || $request->getUri()->getPath() !== '/') {
return new Response(404);
}

$stream = new ThroughStream();

$timer = $loop->addPeriodicTimer(0.5, function () use ($stream) {
$stream->emit('data', array(microtime(true) . PHP_EOL));
});

$loop->addTimer(5, function() use ($loop, $timer, $stream) {
$loop->cancelTimer($timer);
$stream->emit('end');
});

return new Response(
200,
array('Content-Type' => 'text/plain'),
$stream
);
});
$server = new Server([
new Callback(function (ServerRequestInterface $request) use ($loop) {
if ($request->getMethod() !== 'GET' || $request->getUri()->getPath() !== '/') {
return new Response(404);
}

$stream = new ThroughStream();

$timer = $loop->addPeriodicTimer(0.5, function () use ($stream) {
$stream->emit('data', array(microtime(true) . PHP_EOL));
});

$loop->addTimer(5, function() use ($loop, $timer, $stream) {
$loop->cancelTimer($timer);
$stream->emit('end');
});

return new Response(
200,
array('Content-Type' => 'text/plain'),
$stream
);
})
]);

$socket = new \React\Socket\Server(isset($argv[1]) ? $argv[1] : '0.0.0.0:0', $loop);
$server->listen($socket);
Expand Down
Loading