/var/www/html_it/wp-content/plugins/query-monitor/dispatchers/REST.php


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
<?php declare(strict_types 1);
/**
 * REST API request dispatcher.
 *
 * @package query-monitor
 */

if ( ! defined'ABSPATH' ) ) {
    exit;
}

class 
QM_Dispatcher_REST extends QM_Dispatcher {

    public 
$id 'rest';

    public function 
__constructQM_Plugin $qm ) {
        
parent::__construct$qm );

        
add_filter'rest_post_dispatch', array( $this'filter_rest_post_dispatch' ), );

    }

    
/**
     * Filters a REST API response in order to add QM's headers.
     *
     * @param WP_HTTP_Response $result  Result to send to the client. Usually a WP_REST_Response.
     * @return WP_HTTP_Response Result to send to the client.
     */
    
public function filter_rest_post_dispatchWP_HTTP_Response $result ) {

        if ( ! 
$this->should_dispatch() ) {
            return 
$result;
        }

        
$this->before_output();

        
/** @var array<string, QM_Output_Headers> $outputters */
        
$outputters $this->get_outputters'headers' );

        foreach ( 
$outputters as $output ) {
            
$output->output();
        }

        
$this->after_output();

        return 
$result;

    }

    
/**
     * @return void
     */
    
protected function before_output() {
        foreach ( (array) 
glob$this->qm->plugin_path'output/headers/*.php' ) ) as $file ) {
            include_once 
$file;
        }
    }

    
/**
     * @return bool
     */
    
public function is_active() {

        
# If the headers have already been sent then we can't do anything about it
        
if ( headers_sent() ) {
            return 
false;
        }

        if ( ! 
defined'REST_REQUEST' ) || ! REST_REQUEST ) {
            return 
false;
        }

        if ( ! 
self::user_can_view() ) {
            return 
false;
        }

        return 
true;

    }

    
/**
     * @param string $message
     * @param mixed[] $e
     * @phpstan-param array{
     *   message: string,
     *   file: string,
     *   line: int,
     *   type?: int,
     *   trace?: mixed|null,
     * } $e
     */
    
public function output_fatal$message, array $e ): void {
        if ( ! 
headers_sent() ) {
            
header'Content-Type: application/json; charset=' get_option'blog_charset' ) );
        }

        echo 
wp_json_encode(
            array(
                
'code' => 'qm_fatal',
                
'message' => $message,
                
'data' => $e,
            ),
            
JSON_UNESCAPED_SLASHES
        
);
    }
}

/**
 * @param array<string, QM_Dispatcher> $dispatchers
 * @param QM_Plugin $qm
 * @return array<string, QM_Dispatcher>
 */
function register_qm_dispatcher_rest( array $dispatchersQM_Plugin $qm ) {
    
$dispatchers['rest'] = new QM_Dispatcher_REST$qm );
    return 
$dispatchers;
}

add_filter'qm/dispatchers''register_qm_dispatcher_rest'10);