Subversion Repositories php-qbpwcf

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3 liveuser 1
<?php
2
namespace Ratchet\RFC6455\Handshake;
3
use Psr\Http\Message\RequestInterface;
4
use Psr\Http\Message\ResponseInterface;
5
use Psr\Http\Message\UriInterface;
6
use GuzzleHttp\Psr7\Request;
7
 
8
class ClientNegotiator {
9
    /**
10
     * @var ResponseVerifier
11
     */
12
    private $verifier;
13
 
14
    /**
15
     * @var \Psr\Http\Message\RequestInterface
16
     */
17
    private $defaultHeader;
18
 
19
    function __construct(PermessageDeflateOptions $perMessageDeflateOptions = null) {
20
        $this->verifier = new ResponseVerifier;
21
 
22
        $this->defaultHeader = new Request('GET', '', [
23
            'Connection'            => 'Upgrade'
24
          , 'Upgrade'               => 'websocket'
25
          , 'Sec-WebSocket-Version' => $this->getVersion()
26
          , 'User-Agent'            => "Ratchet"
27
        ]);
28
 
29
        if ($perMessageDeflateOptions === null) {
30
            $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
31
        }
32
 
33
        // https://bugs.php.net/bug.php?id=73373
34
        // https://bugs.php.net/bug.php?id=74240 - need >=7.1.4 or >=7.0.18
35
        if ($perMessageDeflateOptions->isEnabled() &&
36
            !PermessageDeflateOptions::permessageDeflateSupported()) {
37
            trigger_error('permessage-deflate is being disabled because it is not support by your PHP version.', E_USER_NOTICE);
38
            $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
39
        }
40
        if ($perMessageDeflateOptions->isEnabled() && !function_exists('deflate_add')) {
41
            trigger_error('permessage-deflate is being disabled because you do not have the zlib extension.', E_USER_NOTICE);
42
            $perMessageDeflateOptions = PermessageDeflateOptions::createDisabled();
43
        }
44
 
45
        $this->defaultHeader = $perMessageDeflateOptions->addHeaderToRequest($this->defaultHeader);
46
    }
47
 
48
    public function generateRequest(UriInterface $uri) {
49
        return $this->defaultHeader->withUri($uri)
50
            ->withHeader("Sec-WebSocket-Key", $this->generateKey());
51
    }
52
 
53
    public function validateResponse(RequestInterface $request, ResponseInterface $response) {
54
        return $this->verifier->verifyAll($request, $response);
55
    }
56
 
57
    public function generateKey() {
58
        $chars     = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwzyz1234567890+/=';
59
        $charRange = strlen($chars) - 1;
60
        $key       = '';
61
        for ($i = 0; $i < 16; $i++) {
62
            $key .= $chars[mt_rand(0, $charRange)];
63
        }
64
 
65
        return base64_encode($key);
66
    }
67
 
68
    public function getVersion() {
69
        return 13;
70
    }
71
}