98 lines
2.4 KiB
PHP
98 lines
2.4 KiB
PHP
|
<?php declare(strict_types = 1);
|
||
|
|
||
|
if ( ! defined( 'ABSPATH' ) ) {
|
||
|
exit;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @extends QM_DataCollector<QM_Data_Raw_Request>
|
||
|
*/
|
||
|
class QM_Collector_Raw_Request extends QM_DataCollector {
|
||
|
|
||
|
public $id = 'raw_request';
|
||
|
|
||
|
public function get_storage(): QM_Data {
|
||
|
return new QM_Data_Raw_Request();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Extracts headers from a PHP-style $_SERVER array.
|
||
|
*
|
||
|
* From WP_REST_Server::get_headers()
|
||
|
*
|
||
|
* @param array<string, string> $server Associative array similar to `$_SERVER`.
|
||
|
* @return array<string, string> Headers extracted from the input.
|
||
|
*/
|
||
|
protected function get_headers( array $server ) {
|
||
|
$headers = array();
|
||
|
|
||
|
// CONTENT_* headers are not prefixed with HTTP_.
|
||
|
$additional = array(
|
||
|
'CONTENT_LENGTH' => true,
|
||
|
'CONTENT_MD5' => true,
|
||
|
'CONTENT_TYPE' => true,
|
||
|
);
|
||
|
|
||
|
foreach ( $server as $key => $value ) {
|
||
|
if ( strpos( $key, 'HTTP_' ) === 0 ) {
|
||
|
$headers[ substr( $key, 5 ) ] = $value;
|
||
|
} elseif ( isset( $additional[ $key ] ) ) {
|
||
|
$headers[ $key ] = $value;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return $headers;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Process request and response data.
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
public function process() {
|
||
|
$request = array(
|
||
|
'ip' => $_SERVER['REMOTE_ADDR'],
|
||
|
'method' => strtoupper( wp_unslash( $_SERVER['REQUEST_METHOD'] ) ),
|
||
|
'scheme' => is_ssl() ? 'https' : 'http',
|
||
|
'host' => wp_unslash( $_SERVER['HTTP_HOST'] ),
|
||
|
'path' => wp_unslash( $_SERVER['REQUEST_URI'] ?? '/' ),
|
||
|
'query' => wp_unslash( $_SERVER['QUERY_STRING'] ?? '' ),
|
||
|
'headers' => $this->get_headers( wp_unslash( $_SERVER ) ),
|
||
|
);
|
||
|
|
||
|
ksort( $request['headers'] );
|
||
|
|
||
|
$request['url'] = sprintf( '%s://%s%s', $request['scheme'], $request['host'], $request['path'] );
|
||
|
|
||
|
$this->data->request = $request;
|
||
|
|
||
|
$headers = array();
|
||
|
$raw_headers = headers_list();
|
||
|
foreach ( $raw_headers as $row ) {
|
||
|
list( $key, $value ) = explode( ':', $row, 2 );
|
||
|
$headers[ trim( $key ) ] = trim( $value );
|
||
|
}
|
||
|
|
||
|
ksort( $headers );
|
||
|
|
||
|
$response = array(
|
||
|
'status' => http_response_code(),
|
||
|
'headers' => $headers,
|
||
|
);
|
||
|
|
||
|
$this->data->response = $response;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param array<string, QM_Collector> $collectors
|
||
|
* @param QueryMonitor $qm
|
||
|
* @return array<string, QM_Collector>
|
||
|
*/
|
||
|
function register_qm_collector_raw_request( array $collectors, QueryMonitor $qm ) {
|
||
|
$collectors['raw_request'] = new QM_Collector_Raw_Request();
|
||
|
return $collectors;
|
||
|
}
|
||
|
|
||
|
add_filter( 'qm/collectors', 'register_qm_collector_raw_request', 10, 2 );
|