Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
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
51 changes: 51 additions & 0 deletions examples/certificate.pem
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
-----BEGIN CERTIFICATE-----
MIIEFzCCAv+gAwIBAgIBADANBgkqhkiG9w0BAQQFADBqMQswCQYDVQQGEwJkZTEP
MA0GA1UECBMGSGVzc2VuMSEwHwYDVQQKExhJbnRlcm5ldCBXaWRnaXRzIFB0eSBM
dGQxEzARBgNVBAcTCkRpbGxlbmJ1cmcxEjAQBgNVBAMTCTEyNy4wLjAuMTAeFw0x
MjA2MTYyMDE2MDhaFw0yMjA2MTQyMDE2MDhaMGoxCzAJBgNVBAYTAmRlMQ8wDQYD
VQQIEwZIZXNzZW4xITAfBgNVBAoTGEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDET
MBEGA1UEBxMKRGlsbGVuYnVyZzESMBAGA1UEAxMJMTI3LjAuMC4xMIIBIjANBgkq
hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAofA7J9eN5Q8pTrbHOBQC63gB4m6NPNjx
NZ302U5VK5SIkT8lYNk/uwY88C93jAgEBjgSk9IcLdzCRIay5UJmf92fSwZS+x+7
V8nQyuMtQ+9uipX5nhFVAj1iGbO92McsuBb9ck1jQuNt5YZW1WsnGivh88vMiKBa
7eKnJZbgPjAShCL+WvZpCbWuhy6iUlb/ya0PUNZZNYAkznXarUB706rhLFKF2ikq
lVJnK9d1b/rifBQbHs2anOnKa6ZUUKoai/uOg/F7KpV83tsR5RWaHqy0vICgiG77
qx8cBzKgnL14BFQ5AZWv6Rul9+snnJlpGhuNr7gc/iMD4RfEmJzIawIDAQABo4HH
MIHEMB0GA1UdDgQWBBQk4IptXfOI12nTkE1T4vvR8xw3gzCBlAYDVR0jBIGMMIGJ
gBQk4IptXfOI12nTkE1T4vvR8xw3g6FupGwwajELMAkGA1UEBhMCZGUxDzANBgNV
BAgTBkhlc3NlbjEhMB8GA1UEChMYSW50ZXJuZXQgV2lkZ2l0cyBQdHkgTHRkMRMw
EQYDVQQHEwpEaWxsZW5idXJnMRIwEAYDVQQDEwkxMjcuMC4wLjGCAQAwDAYDVR0T
BAUwAwEB/zANBgkqhkiG9w0BAQQFAAOCAQEAFQCgBVltXOW5qJvjT2DEozp1ns7E
xCU3QTZWYvav/yIz+QAI8tE9JV2aV0hbKYO5mcRYfU9aEgb7NjX3N+9TDh5a2g5W
r9ZSWH4cew+XgIdN0NZljTxk5DQ6CxQmWYrDT+UE6aGqbcpZymd4LXblxYKMTzE0
26pMipE5oFGkqqzP55ZoPhK7nThZ3kJe3e6xAav5f46yCORCkU/+Vmwq3iEInYD3
vTCbUMRzp1166QFSs1/BnAYecinz0RFZGtkm4YdKS9/uPf6LOTbYG0FnibS7NWco
1BTrH9YK/rsUO3DiCWkXT32lv+qC2BqmfrKUOCK+zo8/MhmVpdBxq6cr/Q==
-----END CERTIFICATE-----
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAofA7J9eN5Q8pTrbHOBQC63gB4m6NPNjxNZ302U5VK5SIkT8l
YNk/uwY88C93jAgEBjgSk9IcLdzCRIay5UJmf92fSwZS+x+7V8nQyuMtQ+9uipX5
nhFVAj1iGbO92McsuBb9ck1jQuNt5YZW1WsnGivh88vMiKBa7eKnJZbgPjAShCL+
WvZpCbWuhy6iUlb/ya0PUNZZNYAkznXarUB706rhLFKF2ikqlVJnK9d1b/rifBQb
Hs2anOnKa6ZUUKoai/uOg/F7KpV83tsR5RWaHqy0vICgiG77qx8cBzKgnL14BFQ5
AZWv6Rul9+snnJlpGhuNr7gc/iMD4RfEmJzIawIDAQABAoIBAFTfP2HGS4v9wjyK
9yag9lbK8tHl9wgo+2KKgsVRlLnegyT8324+7nPq9Q09E37ExLcttC7dM/+lb/vS
TPhzMJ1bXh1IFz2eh+We1FtBbXvphRoFOGpr0w31dfDaj2mKGhnxkqvRe3CXGgXt
vpzkJ/5DeYz5Bx2kTYPYAppk1OpCGkLRfYgvIP/AAmnuCEe7aUJc+owhVmmp9wtR
YGFA3tLfo9N01r/gA7hjHM4Fg5pPFTjHc5qE9MP4ZpRmitFTOHHVTJb5B4sLHqm0
gQdDsvLUzJOCQp8ajqiWuPgWqyU21gIIy0DnH2nTvkYlUk3cx6/ofXwiHZ9j/f/b
YhoC5yECgYEAzY8J6wYU/a0D+Wf25MDw+bFOioVDydNWPXCgbhwl1QKX5soy1ngV
5Saa7fgIMI5giIEqTyOSoh2XuBScjg3p+cgZBXLHl8DrHSDWXhvhLGskei7lT4Rp
BgzqJhNFu0q1p2Sf1/QleuTl5PCdMYhX7Dvg7bczwQ8Yh+HMASIwV78CgYEAya0D
XpDbvwY6+lyocfNGeYu6GJFKN0uA3JCZ66rxNi/cCxXE3Bi3RdjMXPYj3WdDH6NZ
UpH1Td+bNmg7TIHoc3yt/NtXCRhgdMEBffJATqXKW3a/yoV13Mpg89Cwj5w/uByJ
21xN8z4zm1TZkeKnlYSU22HoP2v5H4UdLonp2lUCgYEAgHJ5SBss0rdiXF7SsG7A
JcbdxUEw8tTUduAB38xG96v/L3/59HpldCODfGAY/f5549KSlZEs95B2VdjLWxjm
s+aNfBIVFoa+ZB041uWk9xScXp0fPWkIF3fKeLBiSn6MtGT0XQV6xihyX3TbRTBl
gICKNQDdni3IrmAyEiNDAhECgYASGb8lq6atXGfKtKpBn+4BVrMbJV8d217zbN8D
sdH4ZQ9Ax3Flt6orUKv24/iQFIaHvmdz67myhZEurugzk61DQDt1aFJFdLSjhfcW
ULnI1UR2NRA9owDTEi7lcyOFoCZv5c/RqlUssbZ8CH+Ggms8FiwuDHmFx7ESTSYz
WRluCQKBgQCiV5vjvitcjRaxQaqW4lnH2/DiPn1hkIXFMGFVW3spXadDDDicE2AH
PQo6dCCF67nR8H5+0/XBcQL65QAcPMdxt4dX4SCNPtJPop6cxj0/QTdby+S9Ws9x
RO1Psjt4WwPeFuoufbwP3dCgg87LeZRyuS5D7vfUMVI2OB7dzHaxXQ==
-----END RSA PRIVATE KEY-----
16 changes: 16 additions & 0 deletions examples/ssl-client.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
<?php

error_reporting(-1);

$clientContext = stream_context_create(array("ssl" => array(
'allow_self_signed' => true,
'verify_peer' => false
)));

$connection = stream_socket_client('ssl://localhost:4096', $errcode, $errstr, 2, STREAM_CLIENT_CONNECT, $clientContext);

if ($connection) {
echo stream_get_contents($connection);
} else {
echo "\n\nError occured:\n$errcode\n$errstr\n";
}
20 changes: 20 additions & 0 deletions examples/ssl-server.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?php

require dirname(__DIR__).'/vendor/autoload.php';

$loop = React\EventLoop\Factory::create();
$socket = new React\Socket\Server($loop,
array('ssl' => array(
'local_cert' => __DIR__.'/certificate.pem',
))
);

$socket->on('connection', function ($conn) {
$conn->write("This message is secure!\n");
});

echo "Socket server listening on port 4096.\n";
echo "Run ssl-client.php to receive a secure message\n";

$socket->listen(4096);
$loop->run();
34 changes: 34 additions & 0 deletions src/React/Socket/SecureConnection.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace React\Socket;

use Evenement\EventEmitter;
use React\EventLoop\LoopInterface;
use React\Stream\WritableStreamInterface;
use React\Stream\Stream;
use React\Stream\Util;

/** @events connection */
class SecureConnection extends Connection {
protected $secure = false;

public function handleData($stream) {
if (!$this->secure) {
$result = stream_socket_enable_crypto($this->stream, true, STREAM_CRYPTO_METHOD_TLS_SERVER);

if (0 === $result) {
return;
}

if (false === $result) {
echo "error\n";
return;
}

$this->secure = true;
$this->emit('connection', array($this));
}

parent::handleData($stream);
}
}
26 changes: 22 additions & 4 deletions src/React/Socket/Server.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,14 @@
/** @event connection */
class Server extends EventEmitter implements ServerInterface
{
public $master;
public $master;
private $loop;
private $context;

public function __construct(LoopInterface $loop)
public function __construct(LoopInterface $loop, array $context = array())
{
$this->loop = $loop;
$this->context = $context;
}

public function listen($port, $host = '127.0.0.1')
Expand All @@ -34,17 +36,26 @@ public function listen($port, $host = '127.0.0.1')

return;
}

$that->handleConnection($newSocket);
});
}

public function handleConnection($socket)
{
stream_context_set_option($socket, $this->context);
stream_set_blocking($socket, 0);

$client = $this->createConnection($socket);

$this->emit('connection', array($client));
if ($client instanceof SecureConnection) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

How about making the connection implement PromisorInterface, so it can return a promise that resolves as soon as the conn is established?

$self = $this;
$client->on('connection', function($client) use ($self) {
$self->emit('connection', array($client));
});
} else {
$this->emit('connection', array($client));
}
}

public function getPort()
Expand All @@ -62,6 +73,13 @@ public function shutdown()

public function createConnection($socket)
{
return new Connection($socket, $this->loop);
$context = stream_context_get_options($socket);
if (array_key_exists('ssl', $context)) {
$conn = new SecureConnection($socket, $this->loop);
} else {
$conn = new Connection($socket, $this->loop);
}

return $conn;
}
}