Passed
Push — master ( b26d44...e096d1 )
by
unknown
01:42
created

Response   A

Complexity

Total Complexity 21

Size/Duplication

Total Lines 156
Duplicated Lines 0 %

Coupling/Cohesion

Components 0
Dependencies 4

Test Coverage

Coverage 3.77%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 21
c 2
b 0
f 0
lcom 0
cbo 4
dl 0
loc 156
ccs 2
cts 53
cp 0.0377
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A response() 0 3 1
A respond() 0 6 2
A output() 0 4 1
A template() 0 11 2
A json() 0 5 1
A redirect() 0 5 1
A sendHeaders() 0 16 3
C sendBody() 0 25 8
A error() 0 9 2
1
<?php
2
3
namespace CarbonFramework;
4
5
use GuzzleHttp\Psr7;
6
use GuzzleHttp\Psr7\Response as Psr7Response;
7
use Psr\Http\Message\ResponseInterface;
8
9
/**
10
 * A collection of tools for the creation of responses
11
 */
12
class Response {
13
	/**
14
	 * Create a new response object
15
	 * 
16
	 * @return Psr7Response
17
	 */
18 1
	public static function response() {
0 ignored issues
show
Coding Style Best Practice introduced by
Please use __construct() instead of a PHP4-style constructor that is named after the class.
Loading history...
19 1
		return new Psr7Response();
20
	}
21
22
	/**
23
	 * Send output based on a response object
24
	 * @credit modified version of slimphp/slim - Slim/App.php
25
	 *
26
	 * @codeCoverageIgnore
27
	 * @param  ResponseInterface $response
28
	 * @return null
29
	 */
30
	public static function respond( ResponseInterface $response ) {
31
		if ( ! headers_sent() ) {
32
			static::sendHeaders( $response );
33
		}
34
		static::sendBody( $response );
35
	}
36
37
	/**
38
	 * Send a request's headers to the client
39
	 *
40
	 * @param  ResponseInterface $response
41
	 * @return null
42
	 */
43
	protected static function sendHeaders( $response ) {
44
		// Status
45
		header( sprintf(
46
			'HTTP/%s %s %s',
47
			$response->getProtocolVersion(),
48
			$response->getStatusCode(),
49
			$response->getReasonPhrase()
50
		) );
51
52
		// Headers
53
		foreach ( $response->getHeaders() as $name => $values ) {
54
			foreach ( $values as $value ) {
55
				header( sprintf( '%s: %s', $name, $value ), false );
56
			}
57
		}
58
	}
59
60
	/**
61
	 * Send a request's body to the client
62
	 *
63
	 * @param  ResponseInterface $response
64
	 * @return null
65
	 */
66
	protected static function sendBody( $response, $chunk_size = 4096 ) {
67
		$body = $response->getBody();
68
		if ( $body->isSeekable() ) {
69
			$body->rewind();
70
		}
71
72
		$content_length = $response->getHeaderLine( 'Content-Length' );
73
		if ( ! $content_length ) {
74
			$content_length = $body->getSize();
75
		}
76
77
		$content_left = $content_length ? $content_length : -1;
78
		$amount_to_read = $content_left > -1 ? min( $chunk_size, $content_left ) : $chunk_size;
79
		while ( ! $body->eof() ) {
80
			echo $body->read( $amount_to_read );
81
82
			if ( $content_left > -1 ) {
83
				$content_left -= $amount_to_read;
84
			}
85
86
			if ( connection_status() != CONNECTION_NORMAL ) {
87
				break;
88
			}
89
		}
90
	}
91
92
	/**
93
	 * Return a cloned response with the passed string as the body
94
	 * 
95
	 * @param  Psr7Response $response
96
	 * @param  string       $output
97
	 * @return Psr7Response
98
	 */
99
	public static function output( Psr7Response $response, $output ) {
100
		$response = $response->withBody( Psr7\stream_for( $output ) );
101
		return $response;
102
	}
103
104
	/**
105
	 * Return a cloned response, resolving and rendering a template as the body
106
	 * 
107
	 * @param  Psr7Response    $response
108
	 * @param  string|string[] $templates
109
	 * @param  array           $context
110
	 * @return Psr7Response
111
	 */
112
	public static function template( Psr7Response $response, $templates, $context = array() ) {
113
		$templates = is_array( $templates ) ? $templates : [$templates];
114
		$template = locate_template( $templates, false );
115
116
		$engine = Framework::resolve( 'framework.templating.engine' );
117
		$html = $engine->render( $template, $context );
118
119
		$response = $response->withHeader( 'Content-Type', 'text/html' );
120
		$response = $response->withBody( Psr7\stream_for( $html ) );
121
		return $response;
122
	}
123
124
	/**
125
	 * Return a cloned response, json encoding the passed array as the body
126
	 * 
127
	 * @param  Psr7Response $response
128
	 * @param  array        $data
129
	 * @return Psr7Response
130
	 */
131
	public static function json( Psr7Response $response, $data ) {
132
		$response = $response->withHeader( 'Content-Type', 'application/json' );
133
		$response = $response->withBody( Psr7\stream_for( wp_json_encode( $data ) ) );
134
		return $response;
135
	}
136
137
	/**
138
	 * Return a cloned response, with location and status headers
139
	 * 
140
	 * @param  Psr7Response $response
141
	 * @param  string       $url
142
	 * @param  integer      $status
143
	 * @return Psr7Response
144
	 */
145
	public static function redirect( Psr7Response $response, $url, $status = 302 ) {
146
		$response = $response->withStatus( $status );
147
		$response = $response->withHeader( 'Location', $url );
148
		return $response;
149
	}
150
151
	/**
152
	 * Return a cloned response, with status headers and rendering a suitable template as the body
153
	 * 
154
	 * @param  Psr7Response $response
155
	 * @param  integer      $status
156
	 * @return Psr7Response
157
	 */
158
	public static function error( Psr7Response $response, $status ) {
159
		global $wp_query;
0 ignored issues
show
Compatibility Best Practice introduced by
Use of global functionality is not recommended; it makes your code harder to test, and less reusable.

Instead of relying on global state, we recommend one of these alternatives:

1. Pass all data via parameters

function myFunction($a, $b) {
    // Do something
}

2. Create a class that maintains your state

class MyClass {
    private $a;
    private $b;

    public function __construct($a, $b) {
        $this->a = $a;
        $this->b = $b;
    }

    public function myFunction() {
        // Do something
    }
}
Loading history...
160
		if ( $status === 404 ) {
161
			$wp_query->set_404();
162
		}
163
164
		$response = $response->withStatus( $status );
165
		return static::template( $response, array( $status . '.php', 'index.php' ) );
166
	}
167
}
168