Http::getProxy() method to get proxy configuration
[lhc/web/wiklou.git] / tests / phpunit / includes / HttpTest.php
1 <?php
2
3 /**
4 * @group Http
5 */
6 class HttpTest extends MediaWikiTestCase {
7 /**
8 * @dataProvider cookieDomains
9 * @covers Cookie::validateCookieDomain
10 */
11 public function testValidateCookieDomain( $expected, $domain, $origin = null ) {
12 if ( $origin ) {
13 $ok = Cookie::validateCookieDomain( $domain, $origin );
14 $msg = "$domain against origin $origin";
15 } else {
16 $ok = Cookie::validateCookieDomain( $domain );
17 $msg = "$domain";
18 }
19 $this->assertEquals( $expected, $ok, $msg );
20 }
21
22 public static function cookieDomains() {
23 return array(
24 array( false, "org" ),
25 array( false, ".org" ),
26 array( true, "wikipedia.org" ),
27 array( true, ".wikipedia.org" ),
28 array( false, "co.uk" ),
29 array( false, ".co.uk" ),
30 array( false, "gov.uk" ),
31 array( false, ".gov.uk" ),
32 array( true, "supermarket.uk" ),
33 array( false, "uk" ),
34 array( false, ".uk" ),
35 array( false, "127.0.0." ),
36 array( false, "127." ),
37 array( false, "127.0.0.1." ),
38 array( true, "127.0.0.1" ),
39 array( false, "333.0.0.1" ),
40 array( true, "example.com" ),
41 array( false, "example.com." ),
42 array( true, ".example.com" ),
43
44 array( true, ".example.com", "www.example.com" ),
45 array( false, "example.com", "www.example.com" ),
46 array( true, "127.0.0.1", "127.0.0.1" ),
47 array( false, "127.0.0.1", "localhost" ),
48 );
49 }
50
51 /**
52 * Test Http::isValidURI()
53 * @bug 27854 : Http::isValidURI is too lax
54 * @dataProvider provideURI
55 * @covers Http::isValidURI
56 */
57 public function testIsValidUri( $expect, $URI, $message = '' ) {
58 $this->assertEquals(
59 $expect,
60 (bool)Http::isValidURI( $URI ),
61 $message
62 );
63 }
64
65 /**
66 * @covers Http::getProxy
67 */
68 public function testGetProxy() {
69 $this->setMwGlobals( 'wgHTTPProxy', 'proxy.domain.tld' );
70 $this->assertEquals(
71 'proxy.domain.tld',
72 Http::getProxy()
73 );
74 }
75
76 /**
77 * Feeds URI to test a long regular expression in Http::isValidURI
78 */
79 public static function provideURI() {
80 /** Format: 'boolean expectation', 'URI to test', 'Optional message' */
81 return array(
82 array( false, '¿non sens before!! http://a', 'Allow anything before URI' ),
83
84 # (http|https) - only two schemes allowed
85 array( true, 'http://www.example.org/' ),
86 array( true, 'https://www.example.org/' ),
87 array( true, 'http://www.example.org', 'URI without directory' ),
88 array( true, 'http://a', 'Short name' ),
89 array( true, 'http://étoile', 'Allow UTF-8 in hostname' ), # 'étoile' is french for 'star'
90 array( false, '\\host\directory', 'CIFS share' ),
91 array( false, 'gopher://host/dir', 'Reject gopher scheme' ),
92 array( false, 'telnet://host', 'Reject telnet scheme' ),
93
94 # :\/\/ - double slashes
95 array( false, 'http//example.org', 'Reject missing colon in protocol' ),
96 array( false, 'http:/example.org', 'Reject missing slash in protocol' ),
97 array( false, 'http:example.org', 'Must have two slashes' ),
98 # Following fail since hostname can be made of anything
99 array( false, 'http:///example.org', 'Must have exactly two slashes, not three' ),
100
101 # (\w+:{0,1}\w*@)? - optional user:pass
102 array( true, 'http://user@host', 'Username provided' ),
103 array( true, 'http://user:@host', 'Username provided, no password' ),
104 array( true, 'http://user:pass@host', 'Username and password provided' ),
105
106 # (\S+) - host part is made of anything not whitespaces
107 // commented these out in order to remove @group Broken
108 // @todo are these valid tests? if so, fix Http::isValidURI so it can handle them
109 // array( false, 'http://!"èèè¿¿¿~~\'', 'hostname is made of any non whitespace' ),
110 // array( false, 'http://exam:ple.org/', 'hostname can not use colons!' ),
111
112 # (:[0-9]+)? - port number
113 array( true, 'http://example.org:80/' ),
114 array( true, 'https://example.org:80/' ),
115 array( true, 'http://example.org:443/' ),
116 array( true, 'https://example.org:443/' ),
117
118 # Part after the hostname is / or / with something else
119 array( true, 'http://example/#' ),
120 array( true, 'http://example/!' ),
121 array( true, 'http://example/:' ),
122 array( true, 'http://example/.' ),
123 array( true, 'http://example/?' ),
124 array( true, 'http://example/+' ),
125 array( true, 'http://example/=' ),
126 array( true, 'http://example/&' ),
127 array( true, 'http://example/%' ),
128 array( true, 'http://example/@' ),
129 array( true, 'http://example/-' ),
130 array( true, 'http://example//' ),
131 array( true, 'http://example/&' ),
132
133 # Fragment
134 array( true, 'http://exam#ple.org', ), # This one is valid, really!
135 array( true, 'http://example.org:80#anchor' ),
136 array( true, 'http://example.org/?id#anchor' ),
137 array( true, 'http://example.org/?#anchor' ),
138
139 array( false, 'http://a ¿non !!sens after', 'Allow anything after URI' ),
140 );
141 }
142
143 /**
144 * Warning:
145 *
146 * These tests are for code that makes use of an artifact of how CURL
147 * handles header reporting on redirect pages, and will need to be
148 * rewritten when bug 29232 is taken care of (high-level handling of
149 * HTTP redirects).
150 */
151 public function testRelativeRedirections() {
152 $h = MWHttpRequestTester::factory( 'http://oldsite/file.ext', array(), __METHOD__ );
153
154 # Forge a Location header
155 $h->setRespHeaders( 'location', array(
156 'http://newsite/file.ext',
157 '/newfile.ext',
158 )
159 );
160 # Verify we correctly fix the Location
161 $this->assertEquals(
162 'http://newsite/newfile.ext',
163 $h->getFinalUrl(),
164 "Relative file path Location: interpreted as full URL"
165 );
166
167 $h->setRespHeaders( 'location', array(
168 'https://oldsite/file.ext'
169 )
170 );
171 $this->assertEquals(
172 'https://oldsite/file.ext',
173 $h->getFinalUrl(),
174 "Location to the HTTPS version of the site"
175 );
176
177 $h->setRespHeaders( 'location', array(
178 '/anotherfile.ext',
179 'http://anotherfile/hoster.ext',
180 'https://anotherfile/hoster.ext'
181 )
182 );
183 $this->assertEquals(
184 'https://anotherfile/hoster.ext',
185 $h->getFinalUrl( "Relative file path Location: should keep the latest host and scheme!" )
186 );
187 }
188
189 /**
190 * Constant values are from PHP 5.3.28 using cURL 7.24.0
191 * @see http://php.net/manual/en/curl.constants.php
192 *
193 * All constant values are present so that developers don’t need to remember
194 * to add them if added at a later date. The commented out constants were
195 * not found anywhere in the MediaWiki core code.
196 *
197 * Commented out constants that were not available in:
198 * HipHop VM 3.3.0 (rel)
199 * Compiler: heads/master-0-g08810d920dfff59e0774cf2d651f92f13a637175
200 * Repo schema: 3214fc2c684a4520485f715ee45f33f2182324b1
201 * Extension API: 20140829
202 *
203 * Commented out constants that were removed in PHP 5.6.0
204 *
205 * @covers CurlHttpRequest::execute
206 */
207 public function provideCurlConstants() {
208 return array(
209 array( 'CURLAUTH_ANY' ),
210 array( 'CURLAUTH_ANYSAFE' ),
211 array( 'CURLAUTH_BASIC' ),
212 array( 'CURLAUTH_DIGEST' ),
213 array( 'CURLAUTH_GSSNEGOTIATE' ),
214 array( 'CURLAUTH_NTLM' ),
215 // array( 'CURLCLOSEPOLICY_CALLBACK' ), // removed in PHP 5.6.0
216 // array( 'CURLCLOSEPOLICY_LEAST_RECENTLY_USED' ), // removed in PHP 5.6.0
217 // array( 'CURLCLOSEPOLICY_LEAST_TRAFFIC' ), // removed in PHP 5.6.0
218 // array( 'CURLCLOSEPOLICY_OLDEST' ), // removed in PHP 5.6.0
219 // array( 'CURLCLOSEPOLICY_SLOWEST' ), // removed in PHP 5.6.0
220 array( 'CURLE_ABORTED_BY_CALLBACK' ),
221 array( 'CURLE_BAD_CALLING_ORDER' ),
222 array( 'CURLE_BAD_CONTENT_ENCODING' ),
223 array( 'CURLE_BAD_FUNCTION_ARGUMENT' ),
224 array( 'CURLE_BAD_PASSWORD_ENTERED' ),
225 array( 'CURLE_COULDNT_CONNECT' ),
226 array( 'CURLE_COULDNT_RESOLVE_HOST' ),
227 array( 'CURLE_COULDNT_RESOLVE_PROXY' ),
228 array( 'CURLE_FAILED_INIT' ),
229 array( 'CURLE_FILESIZE_EXCEEDED' ),
230 array( 'CURLE_FILE_COULDNT_READ_FILE' ),
231 array( 'CURLE_FTP_ACCESS_DENIED' ),
232 array( 'CURLE_FTP_BAD_DOWNLOAD_RESUME' ),
233 array( 'CURLE_FTP_CANT_GET_HOST' ),
234 array( 'CURLE_FTP_CANT_RECONNECT' ),
235 array( 'CURLE_FTP_COULDNT_GET_SIZE' ),
236 array( 'CURLE_FTP_COULDNT_RETR_FILE' ),
237 array( 'CURLE_FTP_COULDNT_SET_ASCII' ),
238 array( 'CURLE_FTP_COULDNT_SET_BINARY' ),
239 array( 'CURLE_FTP_COULDNT_STOR_FILE' ),
240 array( 'CURLE_FTP_COULDNT_USE_REST' ),
241 array( 'CURLE_FTP_PORT_FAILED' ),
242 array( 'CURLE_FTP_QUOTE_ERROR' ),
243 array( 'CURLE_FTP_SSL_FAILED' ),
244 array( 'CURLE_FTP_USER_PASSWORD_INCORRECT' ),
245 array( 'CURLE_FTP_WEIRD_227_FORMAT' ),
246 array( 'CURLE_FTP_WEIRD_PASS_REPLY' ),
247 array( 'CURLE_FTP_WEIRD_PASV_REPLY' ),
248 array( 'CURLE_FTP_WEIRD_SERVER_REPLY' ),
249 array( 'CURLE_FTP_WEIRD_USER_REPLY' ),
250 array( 'CURLE_FTP_WRITE_ERROR' ),
251 array( 'CURLE_FUNCTION_NOT_FOUND' ),
252 array( 'CURLE_GOT_NOTHING' ),
253 array( 'CURLE_HTTP_NOT_FOUND' ),
254 array( 'CURLE_HTTP_PORT_FAILED' ),
255 array( 'CURLE_HTTP_POST_ERROR' ),
256 array( 'CURLE_HTTP_RANGE_ERROR' ),
257 array( 'CURLE_LDAP_CANNOT_BIND' ),
258 array( 'CURLE_LDAP_INVALID_URL' ),
259 array( 'CURLE_LDAP_SEARCH_FAILED' ),
260 array( 'CURLE_LIBRARY_NOT_FOUND' ),
261 array( 'CURLE_MALFORMAT_USER' ),
262 array( 'CURLE_OBSOLETE' ),
263 array( 'CURLE_OK' ),
264 array( 'CURLE_OPERATION_TIMEOUTED' ),
265 array( 'CURLE_OUT_OF_MEMORY' ),
266 array( 'CURLE_PARTIAL_FILE' ),
267 array( 'CURLE_READ_ERROR' ),
268 array( 'CURLE_RECV_ERROR' ),
269 array( 'CURLE_SEND_ERROR' ),
270 array( 'CURLE_SHARE_IN_USE' ),
271 // array( 'CURLE_SSH' ), // not present in HHVM 3.3.0-dev
272 array( 'CURLE_SSL_CACERT' ),
273 array( 'CURLE_SSL_CERTPROBLEM' ),
274 array( 'CURLE_SSL_CIPHER' ),
275 array( 'CURLE_SSL_CONNECT_ERROR' ),
276 array( 'CURLE_SSL_ENGINE_NOTFOUND' ),
277 array( 'CURLE_SSL_ENGINE_SETFAILED' ),
278 array( 'CURLE_SSL_PEER_CERTIFICATE' ),
279 array( 'CURLE_TELNET_OPTION_SYNTAX' ),
280 array( 'CURLE_TOO_MANY_REDIRECTS' ),
281 array( 'CURLE_UNKNOWN_TELNET_OPTION' ),
282 array( 'CURLE_UNSUPPORTED_PROTOCOL' ),
283 array( 'CURLE_URL_MALFORMAT' ),
284 array( 'CURLE_URL_MALFORMAT_USER' ),
285 array( 'CURLE_WRITE_ERROR' ),
286 array( 'CURLFTPAUTH_DEFAULT' ),
287 array( 'CURLFTPAUTH_SSL' ),
288 array( 'CURLFTPAUTH_TLS' ),
289 // array( 'CURLFTPMETHOD_MULTICWD' ), // not present in HHVM 3.3.0-dev
290 // array( 'CURLFTPMETHOD_NOCWD' ), // not present in HHVM 3.3.0-dev
291 // array( 'CURLFTPMETHOD_SINGLECWD' ), // not present in HHVM 3.3.0-dev
292 array( 'CURLFTPSSL_ALL' ),
293 array( 'CURLFTPSSL_CONTROL' ),
294 array( 'CURLFTPSSL_NONE' ),
295 array( 'CURLFTPSSL_TRY' ),
296 // array( 'CURLINFO_CERTINFO' ), // not present in HHVM 3.3.0-dev
297 array( 'CURLINFO_CONNECT_TIME' ),
298 array( 'CURLINFO_CONTENT_LENGTH_DOWNLOAD' ),
299 array( 'CURLINFO_CONTENT_LENGTH_UPLOAD' ),
300 array( 'CURLINFO_CONTENT_TYPE' ),
301 array( 'CURLINFO_EFFECTIVE_URL' ),
302 array( 'CURLINFO_FILETIME' ),
303 array( 'CURLINFO_HEADER_OUT' ),
304 array( 'CURLINFO_HEADER_SIZE' ),
305 array( 'CURLINFO_HTTP_CODE' ),
306 array( 'CURLINFO_NAMELOOKUP_TIME' ),
307 array( 'CURLINFO_PRETRANSFER_TIME' ),
308 array( 'CURLINFO_PRIVATE' ),
309 array( 'CURLINFO_REDIRECT_COUNT' ),
310 array( 'CURLINFO_REDIRECT_TIME' ),
311 // array( 'CURLINFO_REDIRECT_URL' ), // not present in HHVM 3.3.0-dev
312 array( 'CURLINFO_REQUEST_SIZE' ),
313 array( 'CURLINFO_SIZE_DOWNLOAD' ),
314 array( 'CURLINFO_SIZE_UPLOAD' ),
315 array( 'CURLINFO_SPEED_DOWNLOAD' ),
316 array( 'CURLINFO_SPEED_UPLOAD' ),
317 array( 'CURLINFO_SSL_VERIFYRESULT' ),
318 array( 'CURLINFO_STARTTRANSFER_TIME' ),
319 array( 'CURLINFO_TOTAL_TIME' ),
320 array( 'CURLMSG_DONE' ),
321 array( 'CURLM_BAD_EASY_HANDLE' ),
322 array( 'CURLM_BAD_HANDLE' ),
323 array( 'CURLM_CALL_MULTI_PERFORM' ),
324 array( 'CURLM_INTERNAL_ERROR' ),
325 array( 'CURLM_OK' ),
326 array( 'CURLM_OUT_OF_MEMORY' ),
327 array( 'CURLOPT_AUTOREFERER' ),
328 array( 'CURLOPT_BINARYTRANSFER' ),
329 array( 'CURLOPT_BUFFERSIZE' ),
330 array( 'CURLOPT_CAINFO' ),
331 array( 'CURLOPT_CAPATH' ),
332 // array( 'CURLOPT_CERTINFO' ), // not present in HHVM 3.3.0-dev
333 // array( 'CURLOPT_CLOSEPOLICY' ), // removed in PHP 5.6.0
334 array( 'CURLOPT_CONNECTTIMEOUT' ),
335 array( 'CURLOPT_CONNECTTIMEOUT_MS' ),
336 array( 'CURLOPT_COOKIE' ),
337 array( 'CURLOPT_COOKIEFILE' ),
338 array( 'CURLOPT_COOKIEJAR' ),
339 array( 'CURLOPT_COOKIESESSION' ),
340 array( 'CURLOPT_CRLF' ),
341 array( 'CURLOPT_CUSTOMREQUEST' ),
342 array( 'CURLOPT_DNS_CACHE_TIMEOUT' ),
343 array( 'CURLOPT_DNS_USE_GLOBAL_CACHE' ),
344 array( 'CURLOPT_EGDSOCKET' ),
345 array( 'CURLOPT_ENCODING' ),
346 array( 'CURLOPT_FAILONERROR' ),
347 array( 'CURLOPT_FILE' ),
348 array( 'CURLOPT_FILETIME' ),
349 array( 'CURLOPT_FOLLOWLOCATION' ),
350 array( 'CURLOPT_FORBID_REUSE' ),
351 array( 'CURLOPT_FRESH_CONNECT' ),
352 array( 'CURLOPT_FTPAPPEND' ),
353 array( 'CURLOPT_FTPLISTONLY' ),
354 array( 'CURLOPT_FTPPORT' ),
355 array( 'CURLOPT_FTPSSLAUTH' ),
356 array( 'CURLOPT_FTP_CREATE_MISSING_DIRS' ),
357 // array( 'CURLOPT_FTP_FILEMETHOD' ), // not present in HHVM 3.3.0-dev
358 // array( 'CURLOPT_FTP_SKIP_PASV_IP' ), // not present in HHVM 3.3.0-dev
359 array( 'CURLOPT_FTP_SSL' ),
360 array( 'CURLOPT_FTP_USE_EPRT' ),
361 array( 'CURLOPT_FTP_USE_EPSV' ),
362 array( 'CURLOPT_HEADER' ),
363 array( 'CURLOPT_HEADERFUNCTION' ),
364 array( 'CURLOPT_HTTP200ALIASES' ),
365 array( 'CURLOPT_HTTPAUTH' ),
366 array( 'CURLOPT_HTTPGET' ),
367 array( 'CURLOPT_HTTPHEADER' ),
368 array( 'CURLOPT_HTTPPROXYTUNNEL' ),
369 array( 'CURLOPT_HTTP_VERSION' ),
370 array( 'CURLOPT_INFILE' ),
371 array( 'CURLOPT_INFILESIZE' ),
372 array( 'CURLOPT_INTERFACE' ),
373 array( 'CURLOPT_IPRESOLVE' ),
374 // array( 'CURLOPT_KEYPASSWD' ), // not present in HHVM 3.3.0-dev
375 array( 'CURLOPT_KRB4LEVEL' ),
376 array( 'CURLOPT_LOW_SPEED_LIMIT' ),
377 array( 'CURLOPT_LOW_SPEED_TIME' ),
378 array( 'CURLOPT_MAXCONNECTS' ),
379 array( 'CURLOPT_MAXREDIRS' ),
380 // array( 'CURLOPT_MAX_RECV_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
381 // array( 'CURLOPT_MAX_SEND_SPEED_LARGE' ), // not present in HHVM 3.3.0-dev
382 array( 'CURLOPT_NETRC' ),
383 array( 'CURLOPT_NOBODY' ),
384 array( 'CURLOPT_NOPROGRESS' ),
385 array( 'CURLOPT_NOSIGNAL' ),
386 array( 'CURLOPT_PORT' ),
387 array( 'CURLOPT_POST' ),
388 array( 'CURLOPT_POSTFIELDS' ),
389 array( 'CURLOPT_POSTQUOTE' ),
390 array( 'CURLOPT_POSTREDIR' ),
391 array( 'CURLOPT_PRIVATE' ),
392 array( 'CURLOPT_PROGRESSFUNCTION' ),
393 // array( 'CURLOPT_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
394 array( 'CURLOPT_PROXY' ),
395 array( 'CURLOPT_PROXYAUTH' ),
396 array( 'CURLOPT_PROXYPORT' ),
397 array( 'CURLOPT_PROXYTYPE' ),
398 array( 'CURLOPT_PROXYUSERPWD' ),
399 array( 'CURLOPT_PUT' ),
400 array( 'CURLOPT_QUOTE' ),
401 array( 'CURLOPT_RANDOM_FILE' ),
402 array( 'CURLOPT_RANGE' ),
403 array( 'CURLOPT_READDATA' ),
404 array( 'CURLOPT_READFUNCTION' ),
405 // array( 'CURLOPT_REDIR_PROTOCOLS' ), // not present in HHVM 3.3.0-dev
406 array( 'CURLOPT_REFERER' ),
407 array( 'CURLOPT_RESUME_FROM' ),
408 array( 'CURLOPT_RETURNTRANSFER' ),
409 // array( 'CURLOPT_SSH_AUTH_TYPES' ), // not present in HHVM 3.3.0-dev
410 // array( 'CURLOPT_SSH_HOST_PUBLIC_KEY_MD5' ), // not present in HHVM 3.3.0-dev
411 // array( 'CURLOPT_SSH_PRIVATE_KEYFILE' ), // not present in HHVM 3.3.0-dev
412 // array( 'CURLOPT_SSH_PUBLIC_KEYFILE' ), // not present in HHVM 3.3.0-dev
413 array( 'CURLOPT_SSLCERT' ),
414 array( 'CURLOPT_SSLCERTPASSWD' ),
415 array( 'CURLOPT_SSLCERTTYPE' ),
416 array( 'CURLOPT_SSLENGINE' ),
417 array( 'CURLOPT_SSLENGINE_DEFAULT' ),
418 array( 'CURLOPT_SSLKEY' ),
419 array( 'CURLOPT_SSLKEYPASSWD' ),
420 array( 'CURLOPT_SSLKEYTYPE' ),
421 array( 'CURLOPT_SSLVERSION' ),
422 array( 'CURLOPT_SSL_CIPHER_LIST' ),
423 array( 'CURLOPT_SSL_VERIFYHOST' ),
424 array( 'CURLOPT_SSL_VERIFYPEER' ),
425 array( 'CURLOPT_STDERR' ),
426 array( 'CURLOPT_TCP_NODELAY' ),
427 array( 'CURLOPT_TIMECONDITION' ),
428 array( 'CURLOPT_TIMEOUT' ),
429 array( 'CURLOPT_TIMEOUT_MS' ),
430 array( 'CURLOPT_TIMEVALUE' ),
431 array( 'CURLOPT_TRANSFERTEXT' ),
432 array( 'CURLOPT_UNRESTRICTED_AUTH' ),
433 array( 'CURLOPT_UPLOAD' ),
434 array( 'CURLOPT_URL' ),
435 array( 'CURLOPT_USERAGENT' ),
436 array( 'CURLOPT_USERPWD' ),
437 array( 'CURLOPT_VERBOSE' ),
438 array( 'CURLOPT_WRITEFUNCTION' ),
439 array( 'CURLOPT_WRITEHEADER' ),
440 // array( 'CURLPROTO_ALL' ), // not present in HHVM 3.3.0-dev
441 // array( 'CURLPROTO_DICT' ), // not present in HHVM 3.3.0-dev
442 // array( 'CURLPROTO_FILE' ), // not present in HHVM 3.3.0-dev
443 // array( 'CURLPROTO_FTP' ), // not present in HHVM 3.3.0-dev
444 // array( 'CURLPROTO_FTPS' ), // not present in HHVM 3.3.0-dev
445 // array( 'CURLPROTO_HTTP' ), // not present in HHVM 3.3.0-dev
446 // array( 'CURLPROTO_HTTPS' ), // not present in HHVM 3.3.0-dev
447 // array( 'CURLPROTO_LDAP' ), // not present in HHVM 3.3.0-dev
448 // array( 'CURLPROTO_LDAPS' ), // not present in HHVM 3.3.0-dev
449 // array( 'CURLPROTO_SCP' ), // not present in HHVM 3.3.0-dev
450 // array( 'CURLPROTO_SFTP' ), // not present in HHVM 3.3.0-dev
451 // array( 'CURLPROTO_TELNET' ), // not present in HHVM 3.3.0-dev
452 // array( 'CURLPROTO_TFTP' ), // not present in HHVM 3.3.0-dev
453 array( 'CURLPROXY_HTTP' ),
454 // array( 'CURLPROXY_SOCKS4' ), // not present in HHVM 3.3.0-dev
455 array( 'CURLPROXY_SOCKS5' ),
456 // array( 'CURLSSH_AUTH_DEFAULT' ), // not present in HHVM 3.3.0-dev
457 // array( 'CURLSSH_AUTH_HOST' ), // not present in HHVM 3.3.0-dev
458 // array( 'CURLSSH_AUTH_KEYBOARD' ), // not present in HHVM 3.3.0-dev
459 // array( 'CURLSSH_AUTH_NONE' ), // not present in HHVM 3.3.0-dev
460 // array( 'CURLSSH_AUTH_PASSWORD' ), // not present in HHVM 3.3.0-dev
461 // array( 'CURLSSH_AUTH_PUBLICKEY' ), // not present in HHVM 3.3.0-dev
462 array( 'CURLVERSION_NOW' ),
463 array( 'CURL_HTTP_VERSION_1_0' ),
464 array( 'CURL_HTTP_VERSION_1_1' ),
465 array( 'CURL_HTTP_VERSION_NONE' ),
466 array( 'CURL_IPRESOLVE_V4' ),
467 array( 'CURL_IPRESOLVE_V6' ),
468 array( 'CURL_IPRESOLVE_WHATEVER' ),
469 array( 'CURL_NETRC_IGNORED' ),
470 array( 'CURL_NETRC_OPTIONAL' ),
471 array( 'CURL_NETRC_REQUIRED' ),
472 array( 'CURL_TIMECOND_IFMODSINCE' ),
473 array( 'CURL_TIMECOND_IFUNMODSINCE' ),
474 array( 'CURL_TIMECOND_LASTMOD' ),
475 array( 'CURL_VERSION_IPV6' ),
476 array( 'CURL_VERSION_KERBEROS4' ),
477 array( 'CURL_VERSION_LIBZ' ),
478 array( 'CURL_VERSION_SSL' ),
479 );
480 }
481
482 /**
483 * Added this test based on an issue experienced with HHVM 3.3.0-dev
484 * where it did not define a cURL constant.
485 *
486 * @bug 70570
487 * @dataProvider provideCurlConstants
488 */
489 public function testCurlConstants( $value ) {
490 $this->assertTrue( defined( $value ), $value . ' not defined' );
491 }
492 }
493
494 /**
495 * Class to let us overwrite MWHttpRequest respHeaders variable
496 */
497 class MWHttpRequestTester extends MWHttpRequest {
498 // function derived from the MWHttpRequest factory function but
499 // returns appropriate tester class here
500 public static function factory( $url, $options = null, $caller = __METHOD__ ) {
501 if ( !Http::$httpEngine ) {
502 Http::$httpEngine = function_exists( 'curl_init' ) ? 'curl' : 'php';
503 } elseif ( Http::$httpEngine == 'curl' && !function_exists( 'curl_init' ) ) {
504 throw new MWException( __METHOD__ . ': curl (http://php.net/curl) is not installed, but' .
505 'Http::$httpEngine is set to "curl"' );
506 }
507
508 switch ( Http::$httpEngine ) {
509 case 'curl':
510 return new CurlHttpRequestTester( $url, $options, $caller );
511 case 'php':
512 if ( !wfIniGetBool( 'allow_url_fopen' ) ) {
513 throw new MWException( __METHOD__ .
514 ': allow_url_fopen needs to be enabled for pure PHP HTTP requests to work. '
515 . 'If possible, curl should be used instead. See http://php.net/curl.' );
516 }
517
518 return new PhpHttpRequestTester( $url, $options, $caller );
519 default:
520 }
521 }
522 }
523
524 class CurlHttpRequestTester extends CurlHttpRequest {
525 function setRespHeaders( $name, $value ) {
526 $this->respHeaders[$name] = $value;
527 }
528 }
529
530 class PhpHttpRequestTester extends PhpHttpRequest {
531 function setRespHeaders( $name, $value ) {
532 $this->respHeaders[$name] = $value;
533 }
534 }