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
 
6
class ResponseVerifier {
7
    public function verifyAll(RequestInterface $request, ResponseInterface $response) {
8
        $passes = 0;
9
 
10
        $passes += (int)$this->verifyStatus($response->getStatusCode());
11
        $passes += (int)$this->verifyUpgrade($response->getHeader('Upgrade'));
12
        $passes += (int)$this->verifyConnection($response->getHeader('Connection'));
13
        $passes += (int)$this->verifySecWebSocketAccept(
14
            $response->getHeader('Sec-WebSocket-Accept')
15
          , $request->getHeader('Sec-WebSocket-Key')
16
        );
17
        $passes += (int)$this->verifySubProtocol(
18
            $request->getHeader('Sec-WebSocket-Protocol')
19
          , $response->getHeader('Sec-WebSocket-Protocol')
20
        );
21
        $passes += (int)$this->verifyExtensions(
22
            $request->getHeader('Sec-WebSocket-Extensions')
23
            , $response->getHeader('Sec-WebSocket-Extensions')
24
        );
25
 
26
        return (6 === $passes);
27
    }
28
 
29
    public function verifyStatus($status) {
30
        return ((int)$status === 101);
31
    }
32
 
33
    public function verifyUpgrade(array $upgrade) {
34
        return (in_array('websocket', array_map('strtolower', $upgrade)));
35
    }
36
 
37
    public function verifyConnection(array $connection) {
38
        return (in_array('upgrade', array_map('strtolower', $connection)));
39
    }
40
 
41
    public function verifySecWebSocketAccept($swa, $key) {
42
        return (
43
            1 === count($swa) &&
44
            1 === count($key) &&
45
            $swa[0] === $this->sign($key[0])
46
        );
47
    }
48
 
49
    public function sign($key) {
50
        return base64_encode(sha1($key . NegotiatorInterface::GUID, true));
51
    }
52
 
53
    public function verifySubProtocol(array $requestHeader, array $responseHeader) {
54
        if (0 === count($responseHeader)) {
55
            return true;
56
        }
57
 
58
        $requestedProtocols = array_map('trim', explode(',', implode(',', $requestHeader)));
59
 
60
        return count($responseHeader) === 1 && count(array_intersect($responseHeader, $requestedProtocols)) === 1;
61
    }
62
 
63
    public function verifyExtensions(array $requestHeader, array $responseHeader) {
64
        if (in_array('permessage-deflate', $responseHeader)) {
65
            return strpos(implode(',', $requestHeader), 'permessage-deflate') !== false ? 1 : 0;
66
        }
67
 
68
        return 1;
69
    }
70
}