Completed
Push — no-domain-sharding ( 5152dd...6ccc2d )
by
unknown
07:48
created

functions.photon.php ➔ jetpack_photon_url()   F

Complexity

Conditions 24
Paths 303

Size

Total Lines 177
Code Lines 51

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 24
eloc 51
nc 303
nop 3
dl 0
loc 177
rs 3.5633
c 0
b 0
f 0

How to fix   Long Method    Complexity   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * Generates a Photon URL.
5
 *
6
 * @see http://developer.wordpress.com/docs/photon/
7
 *
8
 * @param string $image_url URL to the publicly accessible image you want to manipulate
9
 * @param array|string $args An array of arguments, i.e. array( 'w' => '300', 'resize' => array( 123, 456 ) ), or in string form (w=123&h=456)
10
 * @return string The raw final URL. You should run this through esc_url() before displaying it.
11
 */
12
function jetpack_photon_url( $image_url, $args = array(), $scheme = null ) {
13
	$image_url = trim( $image_url );
14
15
	if ( class_exists( 'Jetpack') ) {
16
		/**
17
		 * Disables Photon URL processing for local development
18
	 	 *
19
	 	 * @module photon
20
	 	 *
21
	 	 * @since 4.1.0
22
	 	 *
23
	 	 * @param bool false Result of Jetpack::is_development_mode.
24
	 	 */
25
		if ( true === apply_filters( 'jetpack_photon_development_mode', Jetpack::is_development_mode() ) ) {
26
			return $image_url;
27
		}
28
	}
29
30
	/**
31
	 * Allow specific image URls to avoid going through Photon.
32
	 *
33
	 * @module photon
34
	 *
35
	 * @since 3.2.0
36
	 *
37
	 * @param bool false Should the image be returned as is, without going through Photon. Default to false.
38
	 * @param string $image_url Image URL.
39
	 * @param array|string $args Array of Photon arguments.
40
	 * @param string|null $scheme Image scheme. Default to null.
41
	 */
42
	if ( false !== apply_filters( 'jetpack_photon_skip_for_url', false, $image_url, $args, $scheme ) ) {
43
		return $image_url;
44
	}
45
46
	/**
47
	 * Filter the original image URL before it goes through Photon.
48
	 *
49
	 * @module photon
50
	 *
51
	 * @since 1.9.0
52
	 *
53
	 * @param string $image_url Image URL.
54
	 * @param array|string $args Array of Photon arguments.
55
	 * @param string|null $scheme Image scheme. Default to null.
56
	 */
57
	$image_url = apply_filters( 'jetpack_photon_pre_image_url', $image_url, $args, $scheme );
58
	/**
59
	 * Filter the original Photon image parameters before Photon is applied to an image.
60
	 *
61
	 * @module photon
62
	 *
63
	 * @since 1.9.0
64
	 *
65
	 * @param array|string $args Array of Photon arguments.
66
	 * @param string $image_url Image URL.
67
	 * @param string|null $scheme Image scheme. Default to null.
68
	 */
69
	$args = apply_filters( 'jetpack_photon_pre_args', $args, $image_url, $scheme );
70
71
	if ( empty( $image_url ) )
72
		return $image_url;
73
74
	$image_url_parts = @parse_url( $image_url );
75
76
	// Unable to parse
77
	if ( ! is_array( $image_url_parts ) || empty( $image_url_parts['host'] ) || empty( $image_url_parts['path'] ) )
78
		return $image_url;
79
80
	if ( is_array( $args ) ){
81
		// Convert values that are arrays into strings
82
		foreach ( $args as $arg => $value ) {
83
			if ( is_array( $value ) ) {
84
				$args[$arg] = implode( ',', $value );
85
			}
86
		}
87
88
		// Encode values
89
		// See http://core.trac.wordpress.org/ticket/17923
90
		$args = rawurlencode_deep( $args );
91
	}
92
93
	/** This filter is documented below. */
94
	$custom_photon_url = apply_filters( 'jetpack_photon_domain', '', $image_url );
95
	$custom_photon_url = esc_url( $custom_photon_url );
96
97
	// You can't run a Photon URL through Photon again because query strings are stripped.
98
	// So if the image is already a Photon URL, append the new arguments to the existing URL.
99
	if (
100
		in_array( $image_url_parts['host'], array( 'i0.wp.com', 'i1.wp.com', 'i2.wp.com' ) )
101
		|| $image_url_parts['host'] === parse_url( $custom_photon_url, PHP_URL_HOST )
102
	) {
103
		$photon_url = add_query_arg( $args, $image_url );
104
		return jetpack_photon_url_scheme( $photon_url, $scheme );
105
	}
106
107
	/**
108
	 * Allow Photon to use query strings as well.
109
	 * By default, Photon doesn't support query strings so we ignore them and look only at the path.
110
	 * This setting is Photon Server dependent.
111
	 *
112
	 * @module photon
113
	 *
114
	 * @since 1.9.0
115
	 *
116
	 * @param bool false Should images using query strings go through Photon. Default is false.
117
	 * @param string $image_url_parts['host'] Image URL's host.
118
	 */
119
	if ( ! apply_filters( 'jetpack_photon_any_extension_for_domain', false, $image_url_parts['host'] ) ) {
120
		// Photon doesn't support query strings so we ignore them and look only at the path.
121
		// However some source images are served via PHP so check the no-query-string extension.
122
		// For future proofing, this is a blacklist of common issues rather than a whitelist.
123
		$extension = pathinfo( $image_url_parts['path'], PATHINFO_EXTENSION );
124
		if ( empty( $extension ) || in_array( $extension, array( 'php' ) ) )
125
			return $image_url;
126
	}
127
128
	$image_host_path = $image_url_parts['host'] . $image_url_parts['path'];
129
130
	// Figure out which CDN subdomain to use for this site
131
	if ( class_exists( 'Jetpack_Server' ) ) {
132
		// Is WordPress.com
133
		$subdomain = get_current_blog_id();
134
	} elseif ( (int) Jetpack_Options::get_option( 'id' ) > 0 ) {
135
		// Is connected Jetpack
136
		$subdomain = Jetpack_Options::get_option( 'id' );
137
	} else {
138
		// Fallback to site domain
139
		$subdomain = crc32( (string) $_SERVER['HTTP_HOST'] );
140
	}
141
	// abs() for 32bit system CRCs
142
	$subdomain = abs( (int) $subdomain % 3 );
143
144
	/**
145
	 * Filters the domain used by the Photon module.
146
	 *
147
	 * @module photon
148
	 *
149
	 * @since 3.4.2
150
	 *
151
	 * @param string https://i{$subdomain}.wp.com Domain used by Photon. $subdomain is a random number between 0 and 2.
152
	 * @param string $image_url URL of the image to be photonized.
153
	 */
154
	$photon_domain = apply_filters( 'jetpack_photon_domain', "https://i{$subdomain}.wp.com", $image_url );
155
	$photon_domain = trailingslashit( esc_url( $photon_domain ) );
156
	$photon_url  = $photon_domain . $image_host_path;
157
158
	/**
159
	 * Add query strings to Photon URL.
160
	 * By default, Photon doesn't support query strings so we ignore them.
161
	 * This setting is Photon Server dependent.
162
	 *
163
	 * @module photon
164
	 *
165
	 * @since 1.9.0
166
	 *
167
	 * @param bool false Should query strings be added to the image URL. Default is false.
168
	 * @param string $image_url_parts['host'] Image URL's host.
169
	 */
170
	if ( isset( $image_url_parts['query'] ) && apply_filters( 'jetpack_photon_add_query_string_to_domain', false, $image_url_parts['host'] ) ) {
171
		$photon_url .= '?q=' . rawurlencode( $image_url_parts['query'] );
172
	}
173
174
	if ( $args ) {
175
		if ( is_array( $args ) ) {
176
			$photon_url = add_query_arg( $args, $photon_url );
177
		} else {
178
			// You can pass a query string for complicated requests but where you still want CDN subdomain help, etc.
179
			$photon_url .= '?' . $args;
180
		}
181
	}
182
183
	if ( isset( $image_url_parts['scheme'] ) && 'https' == $image_url_parts['scheme'] ) {
184
		$photon_url = add_query_arg( array( 'ssl' => 1 ), $photon_url );
185
	}
186
187
	return jetpack_photon_url_scheme( $photon_url, $scheme );
188
}
189
add_filter( 'jetpack_photon_url', 'jetpack_photon_url', 10, 3 );
190
191
/**
192
 * WordPress.com
193
 *
194
 * If a cropped WP.com-hosted image is the source image, have Photon replicate the crop.
195
 */
196
add_filter( 'jetpack_photon_pre_args', 'jetpack_photon_parse_wpcom_query_args', 10, 2 );
197
198
function jetpack_photon_parse_wpcom_query_args( $args, $image_url ) {
199
	$parsed_url = @parse_url( $image_url );
200
201
	if ( ! $parsed_url )
202
		return $args;
203
204
	$image_url_parts = wp_parse_args( $parsed_url, array(
205
		'host'  => '',
206
		'query' => ''
207
	) );
208
209
	if ( '.files.wordpress.com' != substr( $image_url_parts['host'], -20 ) )
210
		return $args;
211
212
	if ( empty( $image_url_parts['query'] ) )
213
		return $args;
214
215
	$wpcom_args = wp_parse_args( $image_url_parts['query'] );
216
217
	if ( empty( $wpcom_args['w'] ) || empty( $wpcom_args['h'] ) )
218
		return $args;
219
220
	// Keep the crop by using "resize"
221
	if ( ! empty( $wpcom_args['crop'] ) ) {
222 View Code Duplication
		if ( is_array( $args ) ) {
223
			$args = array_merge( array( 'resize' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
224
		} else {
225
			$args = 'resize=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
226
		}
227 View Code Duplication
	} else {
228
		if ( is_array( $args ) ) {
229
			$args = array_merge( array( 'fit' => array( $wpcom_args['w'], $wpcom_args['h'] ) ), $args );
230
		} else {
231
			$args = 'fit=' . rawurlencode( absint( $wpcom_args['w'] ) . ',' . absint( $wpcom_args['h'] ) ) . '&' . $args;
232
		}
233
	}
234
235
	return $args;
236
}
237
238
239
/**
240
 * Facebook
241
 */
242
add_filter( 'jetpack_photon_add_query_string_to_domain', 'jetpack_photon_allow_facebook_graph_domain', 10, 2 );
243
add_filter( 'jetpack_photon_any_extension_for_domain',   'jetpack_photon_allow_facebook_graph_domain', 10, 2 );
244
245
function jetpack_photon_url_scheme( $url, $scheme ) {
246
	if ( ! in_array( $scheme, array( 'http', 'https', 'network_path' ) ) ) {
247
		$scheme = 'https';
248
	}
249
250
	if ( 'network_path' == $scheme ) {
251
		$scheme_slashes = '//';
252
	} else {
253
		$scheme_slashes = "$scheme://";
254
	}
255
256
	return preg_replace( '#^[a-z:]+//#i', $scheme_slashes, $url );
257
}
258
259
function jetpack_photon_allow_facebook_graph_domain( $allow = false, $domain ) {
0 ignored issues
show
Coding Style introduced by
Parameters which have default values should be placed at the end.

If you place a parameter with a default value before a parameter with a default value, the default value of the first parameter will never be used as it will always need to be passed anyway:

// $a must always be passed; it's default value is never used.
function someFunction($a = 5, $b) { }
Loading history...
260
	switch ( $domain ) {
261
	case 'graph.facebook.com' :
262
		return true;
263
	}
264
265
	return $allow;
266
}
267
268
add_filter( 'jetpack_photon_skip_for_url', 'jetpack_photon_banned_domains', 9, 4 );
269
function jetpack_photon_banned_domains( $skip, $image_url, $args, $scheme ) {
0 ignored issues
show
Unused Code introduced by
The parameter $args is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
Unused Code introduced by
The parameter $scheme is not used and could be removed.

This check looks from parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
270
	$banned_domains = array(
271
		'http://chart.googleapis.com/',
272
		'https://chart.googleapis.com/',
273
		'http://chart.apis.google.com/',
274
	);
275
276
	foreach ( $banned_domains as $banned_domain ) {
277
		if ( wp_startswith( $image_url, $banned_domain ) )
278
			return true;
279
	}
280
281
	return $skip;
282
}
283