• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

sirn-se / websocket-php / 5608975860

pending completion
5608975860

push

github

Sören Jensen
Middleware support

90 of 90 new or added lines in 8 files covered. (100.0%)

245 of 671 relevant lines covered (36.51%)

1.27 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

90.48
/src/Middleware/CloseHandler.php
1
<?php
2

3
/**
4
 * Copyright (C) 2014-2023 Textalk and contributors.
5
 *
6
 * This file is part of Websocket PHP and is free software under the ISC License.
7
 * License text: https://raw.githubusercontent.com/sirn-se/websocket-php/master/COPYING.md
8
 */
9

10
namespace WebSocket\Middleware;
11

12
use Psr\Log\LoggerAwareInterface;
13
use Psr\Log\LoggerAwareTrait;
14
use WebSocket\Connection;
15
use WebSocket\Message\{
16
    Close,
17
    Message
18
};
19

20
/**
21
 * WebSocket\Middleware\CloseHandler class.
22
 * Handles close procedure.
23
 */
24
class CloseHandler implements LoggerAwareInterface, ProcessIncomingInterface, ProcessOutgoingInterface
25
{
26
    use LoggerAwareTrait;
27

28
    public function processIncoming(ProcessStack $stack, Connection $connection): Message
29
    {
30
        $message = $stack->handleIncoming(); // Proceed before logic
2✔
31
        if (!$message instanceof Close) {
2✔
32
            return $message;
×
33
        }
34
        if (!$connection->isWritable()) {
2✔
35
            // Remote sent Close/Ack: disconnect
36
            $this->logger->debug("[close-handler] Received 'close' ackowledge, disconnecting");
1✔
37
            $connection->disconnect();
1✔
38
        } else {
39
            // Remote sent Close; acknowledge and close for further reading
40
            $this->logger->debug("[close-handler] Received 'close', status: {$message->getCloseStatus()}");
1✔
41
            $ack =  "Close acknowledged: {$message->getCloseStatus()}";
1✔
42
            $connection->closeRead();
1✔
43
            $connection->pushMessage(new Close($message->getCloseStatus(), $ack));
1✔
44
        }
45
        return $message;
2✔
46
    }
47

48
    public function processOutgoing(ProcessStack $stack, Connection $connection, Message $message): Message
49
    {
50
        $message = $stack->handleOutgoing($message); // Proceed before logic
2✔
51
        if (!$message instanceof Close) {
2✔
52
            return $message;
×
53
        }
54
        if (!$connection->isReadable()) {
2✔
55
            // Local sent Close/Ack: disconnect
56
            $this->logger->debug("[close-handler] Sent 'close' ackowledge, disconnecting");
1✔
57
            $connection->disconnect();
1✔
58
        } else {
59
            // Local sent Close: close for further writing, expect remote ackowledge
60
            $this->logger->debug("[close-handler] Sent 'close', status: {$message->getCloseStatus()}");
1✔
61
            $connection->closeWrite();
1✔
62
        }
63
        return $message;
2✔
64
    }
65

66
    public function __toString(): string
67
    {
68
        return get_class($this);
2✔
69
    }
70
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc