GitHub Access Token became invalid

It seems like the GitHub access token used for retrieving details about this repository from GitHub became invalid. This might prevent certain types of inspections from being run (in particular, everything related to pull requests).
Please ask an admin of your repository to re-new the access token on this website.
Completed
Push — master ( b119a5...2262ef )
by gyeong-won
19:32 queued 13:26
created
libs/PEAR.1.9.5/HTTP/Request2/Adapter/Socket.php 3 patches
Switch Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -732,34 +732,34 @@  discard block
 block discarded – undo
732 732
             return;
733 733
         }
734 734
         switch ($auth['scheme']) {
735
-        case HTTP_Request2::AUTH_BASIC:
736
-            $headers['authorization'] = 'Basic ' . base64_encode(
737
-                $auth['user'] . ':' . $auth['password']
738
-            );
739
-            break;
740
-
741
-        case HTTP_Request2::AUTH_DIGEST:
742
-            unset($this->serverChallenge);
743
-            $fullUrl = ('/' == $requestUrl[0])?
744
-                       $this->request->getUrl()->getScheme() . '://' .
745
-                        $requestHost . $requestUrl:
746
-                       $requestUrl;
747
-            foreach (array_keys(self::$challenges) as $key) {
748
-                if ($key == substr($fullUrl, 0, strlen($key))) {
749
-                    $headers['authorization'] = $this->createDigestResponse(
750
-                        $auth['user'], $auth['password'],
751
-                        $requestUrl, self::$challenges[$key]
752
-                    );
753
-                    $this->serverChallenge =& self::$challenges[$key];
754
-                    break;
755
-                }
756
-            }
757
-            break;
758
-
759
-        default:
760
-            throw new HTTP_Request2_NotImplementedException(
761
-                "Unknown HTTP authentication scheme '{$auth['scheme']}'"
762
-            );
735
+        	case HTTP_Request2::AUTH_BASIC:
736
+            	$headers['authorization'] = 'Basic ' . base64_encode(
737
+                	$auth['user'] . ':' . $auth['password']
738
+            	);
739
+            	break;
740
+
741
+        	case HTTP_Request2::AUTH_DIGEST:
742
+            	unset($this->serverChallenge);
743
+            	$fullUrl = ('/' == $requestUrl[0])?
744
+                       	$this->request->getUrl()->getScheme() . '://' .
745
+                        	$requestHost . $requestUrl:
746
+                       	$requestUrl;
747
+            	foreach (array_keys(self::$challenges) as $key) {
748
+                	if ($key == substr($fullUrl, 0, strlen($key))) {
749
+                    	$headers['authorization'] = $this->createDigestResponse(
750
+                        	$auth['user'], $auth['password'],
751
+                        	$requestUrl, self::$challenges[$key]
752
+                    	);
753
+                    	$this->serverChallenge =& self::$challenges[$key];
754
+                    	break;
755
+                	}
756
+            	}
757
+            	break;
758
+
759
+        	default:
760
+            	throw new HTTP_Request2_NotImplementedException(
761
+                	"Unknown HTTP authentication scheme '{$auth['scheme']}'"
762
+            	);
763 763
         }
764 764
     }
765 765
 
@@ -783,30 +783,30 @@  discard block
 block discarded – undo
783 783
 
784 784
         $password = $this->request->getConfig('proxy_password');
785 785
         switch ($this->request->getConfig('proxy_auth_scheme')) {
786
-        case HTTP_Request2::AUTH_BASIC:
787
-            $headers['proxy-authorization'] = 'Basic ' . base64_encode(
788
-                $user . ':' . $password
789
-            );
790
-            break;
791
-
792
-        case HTTP_Request2::AUTH_DIGEST:
793
-            unset($this->proxyChallenge);
794
-            $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') .
795
-                        ':' . $this->request->getConfig('proxy_port');
796
-            if (!empty(self::$challenges[$proxyUrl])) {
797
-                $headers['proxy-authorization'] = $this->createDigestResponse(
798
-                    $user, $password,
799
-                    $requestUrl, self::$challenges[$proxyUrl]
800
-                );
801
-                $this->proxyChallenge =& self::$challenges[$proxyUrl];
802
-            }
803
-            break;
804
-
805
-        default:
806
-            throw new HTTP_Request2_NotImplementedException(
807
-                "Unknown HTTP authentication scheme '" .
808
-                $this->request->getConfig('proxy_auth_scheme') . "'"
809
-            );
786
+        	case HTTP_Request2::AUTH_BASIC:
787
+            	$headers['proxy-authorization'] = 'Basic ' . base64_encode(
788
+                	$user . ':' . $password
789
+            	);
790
+            	break;
791
+
792
+        	case HTTP_Request2::AUTH_DIGEST:
793
+            	unset($this->proxyChallenge);
794
+            	$proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') .
795
+                        	':' . $this->request->getConfig('proxy_port');
796
+            	if (!empty(self::$challenges[$proxyUrl])) {
797
+                	$headers['proxy-authorization'] = $this->createDigestResponse(
798
+                    	$user, $password,
799
+                    	$requestUrl, self::$challenges[$proxyUrl]
800
+                	);
801
+                	$this->proxyChallenge =& self::$challenges[$proxyUrl];
802
+            	}
803
+            	break;
804
+
805
+        	default:
806
+            	throw new HTTP_Request2_NotImplementedException(
807
+                	"Unknown HTTP authentication scheme '" .
808
+                	$this->request->getConfig('proxy_auth_scheme') . "'"
809
+            	);
810 810
         }
811 811
     }
812 812
 
Please login to merge, or discard this patch.
Indentation   +1077 added lines, -1077 removed lines patch added patch discarded remove patch
@@ -39,1083 +39,1083 @@
 block discarded – undo
39 39
  */
40 40
 class HTTP_Request2_Adapter_Socket extends HTTP_Request2_Adapter
41 41
 {
42
-    /**
43
-     * Regular expression for 'token' rule from RFC 2616
44
-     */
45
-    const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+';
46
-
47
-    /**
48
-     * Regular expression for 'quoted-string' rule from RFC 2616
49
-     */
50
-    const REGEXP_QUOTED_STRING = '"(?>[^"\\\\]+|\\\\.)*"';
51
-
52
-    /**
53
-     * Connected sockets, needed for Keep-Alive support
54
-     * @var  array
55
-     * @see  connect()
56
-     */
57
-    protected static $sockets = array();
58
-
59
-    /**
60
-     * Data for digest authentication scheme
61
-     *
62
-     * The keys for the array are URL prefixes.
63
-     *
64
-     * The values are associative arrays with data (realm, nonce, nonce-count,
65
-     * opaque...) needed for digest authentication. Stored here to prevent making
66
-     * duplicate requests to digest-protected resources after we have already
67
-     * received the challenge.
68
-     *
69
-     * @var  array
70
-     */
71
-    protected static $challenges = array();
72
-
73
-    /**
74
-     * Connected socket
75
-     * @var  HTTP_Request2_SocketWrapper
76
-     * @see  connect()
77
-     */
78
-    protected $socket;
79
-
80
-    /**
81
-     * Challenge used for server digest authentication
82
-     * @var  array
83
-     */
84
-    protected $serverChallenge;
85
-
86
-    /**
87
-     * Challenge used for proxy digest authentication
88
-     * @var  array
89
-     */
90
-    protected $proxyChallenge;
91
-
92
-    /**
93
-     * Remaining length of the current chunk, when reading chunked response
94
-     * @var  integer
95
-     * @see  readChunked()
96
-     */
97
-    protected $chunkLength = 0;
98
-
99
-    /**
100
-     * Remaining amount of redirections to follow
101
-     *
102
-     * Starts at 'max_redirects' configuration parameter and is reduced on each
103
-     * subsequent redirect. An Exception will be thrown once it reaches zero.
104
-     *
105
-     * @var  integer
106
-     */
107
-    protected $redirectCountdown = null;
108
-
109
-    /**
110
-     * Whether to wait for "100 Continue" response before sending request body
111
-     * @var bool
112
-     */
113
-    protected $expect100Continue = false;
114
-
115
-    /**
116
-     * Sends request to the remote server and returns its response
117
-     *
118
-     * @param HTTP_Request2 $request HTTP request message
119
-     *
120
-     * @return   HTTP_Request2_Response
121
-     * @throws   HTTP_Request2_Exception
122
-     */
123
-    public function sendRequest(HTTP_Request2 $request)
124
-    {
125
-        $this->request = $request;
126
-
127
-        try {
128
-            $keepAlive = $this->connect();
129
-            $headers   = $this->prepareHeaders();
130
-            $this->socket->write($headers);
131
-            // provide request headers to the observer, see request #7633
132
-            $this->request->setLastEvent('sentHeaders', $headers);
133
-
134
-            if (!$this->expect100Continue) {
135
-                $this->writeBody();
136
-                $response = $this->readResponse();
137
-
138
-            } else {
139
-                $response = $this->readResponse();
140
-                if (!$response || 100 == $response->getStatus()) {
141
-                    $this->expect100Continue = false;
142
-                    // either got "100 Continue" or timed out -> send body
143
-                    $this->writeBody();
144
-                    $response = $this->readResponse();
145
-                }
146
-            }
147
-
148
-
149
-            if ($jar = $request->getCookieJar()) {
150
-                $jar->addCookiesFromResponse($response, $request->getUrl());
151
-            }
152
-
153
-            if (!$this->canKeepAlive($keepAlive, $response)) {
154
-                $this->disconnect();
155
-            }
156
-
157
-            if ($this->shouldUseProxyDigestAuth($response)) {
158
-                return $this->sendRequest($request);
159
-            }
160
-            if ($this->shouldUseServerDigestAuth($response)) {
161
-                return $this->sendRequest($request);
162
-            }
163
-            if ($authInfo = $response->getHeader('authentication-info')) {
164
-                $this->updateChallenge($this->serverChallenge, $authInfo);
165
-            }
166
-            if ($proxyInfo = $response->getHeader('proxy-authentication-info')) {
167
-                $this->updateChallenge($this->proxyChallenge, $proxyInfo);
168
-            }
169
-
170
-        } catch (Exception $e) {
171
-            $this->disconnect();
172
-        }
173
-
174
-        unset($this->request, $this->requestBody);
175
-
176
-        if (!empty($e)) {
177
-            $this->redirectCountdown = null;
178
-            throw $e;
179
-        }
180
-
181
-        if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) {
182
-            $this->redirectCountdown = null;
183
-            return $response;
184
-        } else {
185
-            return $this->handleRedirect($request, $response);
186
-        }
187
-    }
188
-
189
-    /**
190
-     * Connects to the remote server
191
-     *
192
-     * @return   bool    whether the connection can be persistent
193
-     * @throws   HTTP_Request2_Exception
194
-     */
195
-    protected function connect()
196
-    {
197
-        $secure  = 0 == strcasecmp($this->request->getUrl()->getScheme(), 'https');
198
-        $tunnel  = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod();
199
-        $headers = $this->request->getHeaders();
200
-        $reqHost = $this->request->getUrl()->getHost();
201
-        if (!($reqPort = $this->request->getUrl()->getPort())) {
202
-            $reqPort = $secure? 443: 80;
203
-        }
204
-
205
-        $httpProxy = $socksProxy = false;
206
-        if (!($host = $this->request->getConfig('proxy_host'))) {
207
-            $host = $reqHost;
208
-            $port = $reqPort;
209
-        } else {
210
-            if (!($port = $this->request->getConfig('proxy_port'))) {
211
-                throw new HTTP_Request2_LogicException(
212
-                    'Proxy port not provided',
213
-                    HTTP_Request2_Exception::MISSING_VALUE
214
-                );
215
-            }
216
-            if ('http' == ($type = $this->request->getConfig('proxy_type'))) {
217
-                $httpProxy = true;
218
-            } elseif ('socks5' == $type) {
219
-                $socksProxy = true;
220
-            } else {
221
-                throw new HTTP_Request2_NotImplementedException(
222
-                    "Proxy type '{$type}' is not supported"
223
-                );
224
-            }
225
-        }
226
-
227
-        if ($tunnel && !$httpProxy) {
228
-            throw new HTTP_Request2_LogicException(
229
-                "Trying to perform CONNECT request without proxy",
230
-                HTTP_Request2_Exception::MISSING_VALUE
231
-            );
232
-        }
233
-        if ($secure && !in_array('ssl', stream_get_transports())) {
234
-            throw new HTTP_Request2_LogicException(
235
-                'Need OpenSSL support for https:// requests',
236
-                HTTP_Request2_Exception::MISCONFIGURATION
237
-            );
238
-        }
239
-
240
-        // RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
241
-        // connection token to a proxy server...
242
-        if ($httpProxy && !$secure && !empty($headers['connection'])
243
-            && 'Keep-Alive' == $headers['connection']
244
-        ) {
245
-            $this->request->setHeader('connection');
246
-        }
247
-
248
-        $keepAlive = ('1.1' == $this->request->getConfig('protocol_version') &&
249
-                      empty($headers['connection'])) ||
250
-                     (!empty($headers['connection']) &&
251
-                      'Keep-Alive' == $headers['connection']);
252
-
253
-        $options = array();
254
-        if ($ip = $this->request->getConfig('local_ip')) {
255
-            $options['socket'] = array(
256
-                'bindto' => (false === strpos($ip, ':') ? $ip : '[' . $ip . ']') . ':0'
257
-            );
258
-        }
259
-        if ($secure || $tunnel) {
260
-            $options['ssl'] = array();
261
-            foreach ($this->request->getConfig() as $name => $value) {
262
-                if ('ssl_' == substr($name, 0, 4) && null !== $value) {
263
-                    if ('ssl_verify_host' == $name) {
264
-                        if ($value) {
265
-                            $options['ssl']['CN_match'] = $reqHost;
266
-                        }
267
-                    } else {
268
-                        $options['ssl'][substr($name, 4)] = $value;
269
-                    }
270
-                }
271
-            }
272
-            ksort($options['ssl']);
273
-        }
274
-
275
-        // Use global request timeout if given, see feature requests #5735, #8964
276
-        if ($timeout = $this->request->getConfig('timeout')) {
277
-            $deadline = time() + $timeout;
278
-        } else {
279
-            $deadline = null;
280
-        }
281
-
282
-        // Changing SSL context options after connection is established does *not*
283
-        // work, we need a new connection if options change
284
-        $remote    = ((!$secure || $httpProxy || $socksProxy)? 'tcp://': 'ssl://')
285
-                     . $host . ':' . $port;
286
-        $socketKey = $remote . (
287
-                        ($secure && $httpProxy || $socksProxy)
288
-                        ? "->{$reqHost}:{$reqPort}" : ''
289
-                     ) . (empty($options)? '': ':' . serialize($options));
290
-        unset($this->socket);
291
-
292
-        // We use persistent connections and have a connected socket?
293
-        // Ensure that the socket is still connected, see bug #16149
294
-        if ($keepAlive && !empty(self::$sockets[$socketKey])
295
-            && !self::$sockets[$socketKey]->eof()
296
-        ) {
297
-            $this->socket =& self::$sockets[$socketKey];
298
-
299
-        } else {
300
-            if ($socksProxy) {
301
-                require_once 'HTTP/Request2/SOCKS5.php';
302
-
303
-                $this->socket = new HTTP_Request2_SOCKS5(
304
-                    $remote, $this->request->getConfig('connect_timeout'),
305
-                    $options, $this->request->getConfig('proxy_user'),
306
-                    $this->request->getConfig('proxy_password')
307
-                );
308
-                // handle request timeouts ASAP
309
-                $this->socket->setDeadline($deadline, $this->request->getConfig('timeout'));
310
-                $this->socket->connect($reqHost, $reqPort);
311
-                if (!$secure) {
312
-                    $conninfo = "tcp://{$reqHost}:{$reqPort} via {$remote}";
313
-                } else {
314
-                    $this->socket->enableCrypto();
315
-                    $conninfo = "ssl://{$reqHost}:{$reqPort} via {$remote}";
316
-                }
317
-
318
-            } elseif ($secure && $httpProxy && !$tunnel) {
319
-                $this->establishTunnel();
320
-                $conninfo = "ssl://{$reqHost}:{$reqPort} via {$remote}";
321
-
322
-            } else {
323
-                $this->socket = new HTTP_Request2_SocketWrapper(
324
-                    $remote, $this->request->getConfig('connect_timeout'), $options
325
-                );
326
-            }
327
-            $this->request->setLastEvent('connect', empty($conninfo)? $remote: $conninfo);
328
-            self::$sockets[$socketKey] =& $this->socket;
329
-        }
330
-        $this->socket->setDeadline($deadline, $this->request->getConfig('timeout'));
331
-        return $keepAlive;
332
-    }
333
-
334
-    /**
335
-     * Establishes a tunnel to a secure remote server via HTTP CONNECT request
336
-     *
337
-     * This method will fail if 'ssl_verify_peer' is enabled. Probably because PHP
338
-     * sees that we are connected to a proxy server (duh!) rather than the server
339
-     * that presents its certificate.
340
-     *
341
-     * @link     http://tools.ietf.org/html/rfc2817#section-5.2
342
-     * @throws   HTTP_Request2_Exception
343
-     */
344
-    protected function establishTunnel()
345
-    {
346
-        $donor   = new self;
347
-        $connect = new HTTP_Request2(
348
-            $this->request->getUrl(), HTTP_Request2::METHOD_CONNECT,
349
-            array_merge($this->request->getConfig(), array('adapter' => $donor))
350
-        );
351
-        $response = $connect->send();
352
-        // Need any successful (2XX) response
353
-        if (200 > $response->getStatus() || 300 <= $response->getStatus()) {
354
-            throw new HTTP_Request2_ConnectionException(
355
-                'Failed to connect via HTTPS proxy. Proxy response: ' .
356
-                $response->getStatus() . ' ' . $response->getReasonPhrase()
357
-            );
358
-        }
359
-        $this->socket = $donor->socket;
360
-        $this->socket->enableCrypto();
361
-    }
362
-
363
-    /**
364
-     * Checks whether current connection may be reused or should be closed
365
-     *
366
-     * @param boolean                $requestKeepAlive whether connection could
367
-     *                               be persistent in the first place
368
-     * @param HTTP_Request2_Response $response         response object to check
369
-     *
370
-     * @return   boolean
371
-     */
372
-    protected function canKeepAlive($requestKeepAlive, HTTP_Request2_Response $response)
373
-    {
374
-        // Do not close socket on successful CONNECT request
375
-        if (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod()
376
-            && 200 <= $response->getStatus() && 300 > $response->getStatus()
377
-        ) {
378
-            return true;
379
-        }
380
-
381
-        $lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding'))
382
-                       || null !== $response->getHeader('content-length')
383
-                       // no body possible for such responses, see also request #17031
384
-                       || HTTP_Request2::METHOD_HEAD == $this->request->getMethod()
385
-                       || in_array($response->getStatus(), array(204, 304));
386
-        $persistent  = 'keep-alive' == strtolower($response->getHeader('connection')) ||
387
-                       (null === $response->getHeader('connection') &&
388
-                        '1.1' == $response->getVersion());
389
-        return $requestKeepAlive && $lengthKnown && $persistent;
390
-    }
391
-
392
-    /**
393
-     * Disconnects from the remote server
394
-     */
395
-    protected function disconnect()
396
-    {
397
-        if (!empty($this->socket)) {
398
-            $this->socket = null;
399
-            $this->request->setLastEvent('disconnect');
400
-        }
401
-    }
402
-
403
-    /**
404
-     * Handles HTTP redirection
405
-     *
406
-     * This method will throw an Exception if redirect to a non-HTTP(S) location
407
-     * is attempted, also if number of redirects performed already is equal to
408
-     * 'max_redirects' configuration parameter.
409
-     *
410
-     * @param HTTP_Request2          $request  Original request
411
-     * @param HTTP_Request2_Response $response Response containing redirect
412
-     *
413
-     * @return   HTTP_Request2_Response      Response from a new location
414
-     * @throws   HTTP_Request2_Exception
415
-     */
416
-    protected function handleRedirect(
417
-        HTTP_Request2 $request, HTTP_Request2_Response $response
418
-    ) {
419
-        if (is_null($this->redirectCountdown)) {
420
-            $this->redirectCountdown = $request->getConfig('max_redirects');
421
-        }
422
-        if (0 == $this->redirectCountdown) {
423
-            $this->redirectCountdown = null;
424
-            // Copying cURL behaviour
425
-            throw new HTTP_Request2_MessageException(
426
-                'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed',
427
-                HTTP_Request2_Exception::TOO_MANY_REDIRECTS
428
-            );
429
-        }
430
-        $redirectUrl = new Net_URL2(
431
-            $response->getHeader('location'),
432
-            array(Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets'))
433
-        );
434
-        // refuse non-HTTP redirect
435
-        if ($redirectUrl->isAbsolute()
436
-            && !in_array($redirectUrl->getScheme(), array('http', 'https'))
437
-        ) {
438
-            $this->redirectCountdown = null;
439
-            throw new HTTP_Request2_MessageException(
440
-                'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString(),
441
-                HTTP_Request2_Exception::NON_HTTP_REDIRECT
442
-            );
443
-        }
444
-        // Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30),
445
-        // but in practice it is often not
446
-        if (!$redirectUrl->isAbsolute()) {
447
-            $redirectUrl = $request->getUrl()->resolve($redirectUrl);
448
-        }
449
-        $redirect = clone $request;
450
-        $redirect->setUrl($redirectUrl);
451
-        if (303 == $response->getStatus()
452
-            || (!$request->getConfig('strict_redirects')
453
-                && in_array($response->getStatus(), array(301, 302)))
454
-        ) {
455
-            $redirect->setMethod(HTTP_Request2::METHOD_GET);
456
-            $redirect->setBody('');
457
-        }
458
-
459
-        if (0 < $this->redirectCountdown) {
460
-            $this->redirectCountdown--;
461
-        }
462
-        return $this->sendRequest($redirect);
463
-    }
464
-
465
-    /**
466
-     * Checks whether another request should be performed with server digest auth
467
-     *
468
-     * Several conditions should be satisfied for it to return true:
469
-     *   - response status should be 401
470
-     *   - auth credentials should be set in the request object
471
-     *   - response should contain WWW-Authenticate header with digest challenge
472
-     *   - there is either no challenge stored for this URL or new challenge
473
-     *     contains stale=true parameter (in other case we probably just failed
474
-     *     due to invalid username / password)
475
-     *
476
-     * The method stores challenge values in $challenges static property
477
-     *
478
-     * @param HTTP_Request2_Response $response response to check
479
-     *
480
-     * @return   boolean whether another request should be performed
481
-     * @throws   HTTP_Request2_Exception in case of unsupported challenge parameters
482
-     */
483
-    protected function shouldUseServerDigestAuth(HTTP_Request2_Response $response)
484
-    {
485
-        // no sense repeating a request if we don't have credentials
486
-        if (401 != $response->getStatus() || !$this->request->getAuth()) {
487
-            return false;
488
-        }
489
-        if (!$challenge = $this->parseDigestChallenge($response->getHeader('www-authenticate'))) {
490
-            return false;
491
-        }
492
-
493
-        $url    = $this->request->getUrl();
494
-        $scheme = $url->getScheme();
495
-        $host   = $scheme . '://' . $url->getHost();
496
-        if ($port = $url->getPort()) {
497
-            if ((0 == strcasecmp($scheme, 'http') && 80 != $port)
498
-                || (0 == strcasecmp($scheme, 'https') && 443 != $port)
499
-            ) {
500
-                $host .= ':' . $port;
501
-            }
502
-        }
503
-
504
-        if (!empty($challenge['domain'])) {
505
-            $prefixes = array();
506
-            foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) {
507
-                // don't bother with different servers
508
-                if ('/' == substr($prefix, 0, 1)) {
509
-                    $prefixes[] = $host . $prefix;
510
-                }
511
-            }
512
-        }
513
-        if (empty($prefixes)) {
514
-            $prefixes = array($host . '/');
515
-        }
516
-
517
-        $ret = true;
518
-        foreach ($prefixes as $prefix) {
519
-            if (!empty(self::$challenges[$prefix])
520
-                && (empty($challenge['stale']) || strcasecmp('true', $challenge['stale']))
521
-            ) {
522
-                // probably credentials are invalid
523
-                $ret = false;
524
-            }
525
-            self::$challenges[$prefix] =& $challenge;
526
-        }
527
-        return $ret;
528
-    }
529
-
530
-    /**
531
-     * Checks whether another request should be performed with proxy digest auth
532
-     *
533
-     * Several conditions should be satisfied for it to return true:
534
-     *   - response status should be 407
535
-     *   - proxy auth credentials should be set in the request object
536
-     *   - response should contain Proxy-Authenticate header with digest challenge
537
-     *   - there is either no challenge stored for this proxy or new challenge
538
-     *     contains stale=true parameter (in other case we probably just failed
539
-     *     due to invalid username / password)
540
-     *
541
-     * The method stores challenge values in $challenges static property
542
-     *
543
-     * @param HTTP_Request2_Response $response response to check
544
-     *
545
-     * @return   boolean whether another request should be performed
546
-     * @throws   HTTP_Request2_Exception in case of unsupported challenge parameters
547
-     */
548
-    protected function shouldUseProxyDigestAuth(HTTP_Request2_Response $response)
549
-    {
550
-        if (407 != $response->getStatus() || !$this->request->getConfig('proxy_user')) {
551
-            return false;
552
-        }
553
-        if (!($challenge = $this->parseDigestChallenge($response->getHeader('proxy-authenticate')))) {
554
-            return false;
555
-        }
556
-
557
-        $key = 'proxy://' . $this->request->getConfig('proxy_host') .
558
-               ':' . $this->request->getConfig('proxy_port');
559
-
560
-        if (!empty(self::$challenges[$key])
561
-            && (empty($challenge['stale']) || strcasecmp('true', $challenge['stale']))
562
-        ) {
563
-            $ret = false;
564
-        } else {
565
-            $ret = true;
566
-        }
567
-        self::$challenges[$key] = $challenge;
568
-        return $ret;
569
-    }
570
-
571
-    /**
572
-     * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value
573
-     *
574
-     * There is a problem with implementation of RFC 2617: several of the parameters
575
-     * are defined as quoted-string there and thus may contain backslash escaped
576
-     * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as
577
-     * just value of quoted-string X without surrounding quotes, it doesn't speak
578
-     * about removing backslash escaping.
579
-     *
580
-     * Now realm parameter is user-defined and human-readable, strange things
581
-     * happen when it contains quotes:
582
-     *   - Apache allows quotes in realm, but apparently uses realm value without
583
-     *     backslashes for digest computation
584
-     *   - Squid allows (manually escaped) quotes there, but it is impossible to
585
-     *     authorize with either escaped or unescaped quotes used in digest,
586
-     *     probably it can't parse the response (?)
587
-     *   - Both IE and Firefox display realm value with backslashes in
588
-     *     the password popup and apparently use the same value for digest
589
-     *
590
-     * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in
591
-     * quoted-string handling, unfortunately that means failure to authorize
592
-     * sometimes
593
-     *
594
-     * @param string $headerValue value of WWW-Authenticate or Proxy-Authenticate header
595
-     *
596
-     * @return   mixed   associative array with challenge parameters, false if
597
-     *                   no challenge is present in header value
598
-     * @throws   HTTP_Request2_NotImplementedException in case of unsupported challenge parameters
599
-     */
600
-    protected function parseDigestChallenge($headerValue)
601
-    {
602
-        $authParam   = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
603
-                       self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')';
604
-        $challenge   = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!";
605
-        if (!preg_match($challenge, $headerValue, $matches)) {
606
-            return false;
607
-        }
608
-
609
-        preg_match_all('!' . $authParam . '!', $matches[0], $params);
610
-        $paramsAry   = array();
611
-        $knownParams = array('realm', 'domain', 'nonce', 'opaque', 'stale',
612
-                             'algorithm', 'qop');
613
-        for ($i = 0; $i < count($params[0]); $i++) {
614
-            // section 3.2.1: Any unrecognized directive MUST be ignored.
615
-            if (in_array($params[1][$i], $knownParams)) {
616
-                if ('"' == substr($params[2][$i], 0, 1)) {
617
-                    $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1);
618
-                } else {
619
-                    $paramsAry[$params[1][$i]] = $params[2][$i];
620
-                }
621
-            }
622
-        }
623
-        // we only support qop=auth
624
-        if (!empty($paramsAry['qop'])
625
-            && !in_array('auth', array_map('trim', explode(',', $paramsAry['qop'])))
626
-        ) {
627
-            throw new HTTP_Request2_NotImplementedException(
628
-                "Only 'auth' qop is currently supported in digest authentication, " .
629
-                "server requested '{$paramsAry['qop']}'"
630
-            );
631
-        }
632
-        // we only support algorithm=MD5
633
-        if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) {
634
-            throw new HTTP_Request2_NotImplementedException(
635
-                "Only 'MD5' algorithm is currently supported in digest authentication, " .
636
-                "server requested '{$paramsAry['algorithm']}'"
637
-            );
638
-        }
639
-
640
-        return $paramsAry;
641
-    }
642
-
643
-    /**
644
-     * Parses [Proxy-]Authentication-Info header value and updates challenge
645
-     *
646
-     * @param array  &$challenge  challenge to update
647
-     * @param string $headerValue value of [Proxy-]Authentication-Info header
648
-     *
649
-     * @todo     validate server rspauth response
650
-     */
651
-    protected function updateChallenge(&$challenge, $headerValue)
652
-    {
653
-        $authParam   = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
654
-                       self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!';
655
-        $paramsAry   = array();
656
-
657
-        preg_match_all($authParam, $headerValue, $params);
658
-        for ($i = 0; $i < count($params[0]); $i++) {
659
-            if ('"' == substr($params[2][$i], 0, 1)) {
660
-                $paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1);
661
-            } else {
662
-                $paramsAry[$params[1][$i]] = $params[2][$i];
663
-            }
664
-        }
665
-        // for now, just update the nonce value
666
-        if (!empty($paramsAry['nextnonce'])) {
667
-            $challenge['nonce'] = $paramsAry['nextnonce'];
668
-            $challenge['nc']    = 1;
669
-        }
670
-    }
671
-
672
-    /**
673
-     * Creates a value for [Proxy-]Authorization header when using digest authentication
674
-     *
675
-     * @param string $user       user name
676
-     * @param string $password   password
677
-     * @param string $url        request URL
678
-     * @param array  &$challenge digest challenge parameters
679
-     *
680
-     * @return   string  value of [Proxy-]Authorization request header
681
-     * @link     http://tools.ietf.org/html/rfc2617#section-3.2.2
682
-     */
683
-    protected function createDigestResponse($user, $password, $url, &$challenge)
684
-    {
685
-        if (false !== ($q = strpos($url, '?'))
686
-            && $this->request->getConfig('digest_compat_ie')
687
-        ) {
688
-            $url = substr($url, 0, $q);
689
-        }
690
-
691
-        $a1 = md5($user . ':' . $challenge['realm'] . ':' . $password);
692
-        $a2 = md5($this->request->getMethod() . ':' . $url);
693
-
694
-        if (empty($challenge['qop'])) {
695
-            $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2);
696
-        } else {
697
-            $challenge['cnonce'] = 'Req2.' . rand();
698
-            if (empty($challenge['nc'])) {
699
-                $challenge['nc'] = 1;
700
-            }
701
-            $nc     = sprintf('%08x', $challenge['nc']++);
702
-            $digest = md5(
703
-                $a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' .
704
-                $challenge['cnonce'] . ':auth:' . $a2
705
-            );
706
-        }
707
-        return 'Digest username="' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $user) . '", ' .
708
-               'realm="' . $challenge['realm'] . '", ' .
709
-               'nonce="' . $challenge['nonce'] . '", ' .
710
-               'uri="' . $url . '", ' .
711
-               'response="' . $digest . '"' .
712
-               (!empty($challenge['opaque'])?
713
-                ', opaque="' . $challenge['opaque'] . '"':
714
-                '') .
715
-               (!empty($challenge['qop'])?
716
-                ', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"':
717
-                '');
718
-    }
719
-
720
-    /**
721
-     * Adds 'Authorization' header (if needed) to request headers array
722
-     *
723
-     * @param array  &$headers    request headers
724
-     * @param string $requestHost request host (needed for digest authentication)
725
-     * @param string $requestUrl  request URL (needed for digest authentication)
726
-     *
727
-     * @throws   HTTP_Request2_NotImplementedException
728
-     */
729
-    protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl)
730
-    {
731
-        if (!($auth = $this->request->getAuth())) {
732
-            return;
733
-        }
734
-        switch ($auth['scheme']) {
735
-        case HTTP_Request2::AUTH_BASIC:
736
-            $headers['authorization'] = 'Basic ' . base64_encode(
737
-                $auth['user'] . ':' . $auth['password']
738
-            );
739
-            break;
740
-
741
-        case HTTP_Request2::AUTH_DIGEST:
742
-            unset($this->serverChallenge);
743
-            $fullUrl = ('/' == $requestUrl[0])?
744
-                       $this->request->getUrl()->getScheme() . '://' .
745
-                        $requestHost . $requestUrl:
746
-                       $requestUrl;
747
-            foreach (array_keys(self::$challenges) as $key) {
748
-                if ($key == substr($fullUrl, 0, strlen($key))) {
749
-                    $headers['authorization'] = $this->createDigestResponse(
750
-                        $auth['user'], $auth['password'],
751
-                        $requestUrl, self::$challenges[$key]
752
-                    );
753
-                    $this->serverChallenge =& self::$challenges[$key];
754
-                    break;
755
-                }
756
-            }
757
-            break;
758
-
759
-        default:
760
-            throw new HTTP_Request2_NotImplementedException(
761
-                "Unknown HTTP authentication scheme '{$auth['scheme']}'"
762
-            );
763
-        }
764
-    }
765
-
766
-    /**
767
-     * Adds 'Proxy-Authorization' header (if needed) to request headers array
768
-     *
769
-     * @param array  &$headers   request headers
770
-     * @param string $requestUrl request URL (needed for digest authentication)
771
-     *
772
-     * @throws   HTTP_Request2_NotImplementedException
773
-     */
774
-    protected function addProxyAuthorizationHeader(&$headers, $requestUrl)
775
-    {
776
-        if (!$this->request->getConfig('proxy_host')
777
-            || !($user = $this->request->getConfig('proxy_user'))
778
-            || (0 == strcasecmp('https', $this->request->getUrl()->getScheme())
779
-                && HTTP_Request2::METHOD_CONNECT != $this->request->getMethod())
780
-        ) {
781
-            return;
782
-        }
783
-
784
-        $password = $this->request->getConfig('proxy_password');
785
-        switch ($this->request->getConfig('proxy_auth_scheme')) {
786
-        case HTTP_Request2::AUTH_BASIC:
787
-            $headers['proxy-authorization'] = 'Basic ' . base64_encode(
788
-                $user . ':' . $password
789
-            );
790
-            break;
791
-
792
-        case HTTP_Request2::AUTH_DIGEST:
793
-            unset($this->proxyChallenge);
794
-            $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') .
795
-                        ':' . $this->request->getConfig('proxy_port');
796
-            if (!empty(self::$challenges[$proxyUrl])) {
797
-                $headers['proxy-authorization'] = $this->createDigestResponse(
798
-                    $user, $password,
799
-                    $requestUrl, self::$challenges[$proxyUrl]
800
-                );
801
-                $this->proxyChallenge =& self::$challenges[$proxyUrl];
802
-            }
803
-            break;
804
-
805
-        default:
806
-            throw new HTTP_Request2_NotImplementedException(
807
-                "Unknown HTTP authentication scheme '" .
808
-                $this->request->getConfig('proxy_auth_scheme') . "'"
809
-            );
810
-        }
811
-    }
812
-
813
-
814
-    /**
815
-     * Creates the string with the Request-Line and request headers
816
-     *
817
-     * @return   string
818
-     * @throws   HTTP_Request2_Exception
819
-     */
820
-    protected function prepareHeaders()
821
-    {
822
-        $headers = $this->request->getHeaders();
823
-        $url     = $this->request->getUrl();
824
-        $connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod();
825
-        $host    = $url->getHost();
826
-
827
-        $defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80;
828
-        if (($port = $url->getPort()) && $port != $defaultPort || $connect) {
829
-            $host .= ':' . (empty($port)? $defaultPort: $port);
830
-        }
831
-        // Do not overwrite explicitly set 'Host' header, see bug #16146
832
-        if (!isset($headers['host'])) {
833
-            $headers['host'] = $host;
834
-        }
835
-
836
-        if ($connect) {
837
-            $requestUrl = $host;
838
-
839
-        } else {
840
-            if (!$this->request->getConfig('proxy_host')
841
-                || 'http' != $this->request->getConfig('proxy_type')
842
-                || 0 == strcasecmp($url->getScheme(), 'https')
843
-            ) {
844
-                $requestUrl = '';
845
-            } else {
846
-                $requestUrl = $url->getScheme() . '://' . $host;
847
-            }
848
-            $path        = $url->getPath();
849
-            $query       = $url->getQuery();
850
-            $requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query);
851
-        }
852
-
853
-        if ('1.1' == $this->request->getConfig('protocol_version')
854
-            && extension_loaded('zlib') && !isset($headers['accept-encoding'])
855
-        ) {
856
-            $headers['accept-encoding'] = 'gzip, deflate';
857
-        }
858
-        if (($jar = $this->request->getCookieJar())
859
-            && ($cookies = $jar->getMatching($this->request->getUrl(), true))
860
-        ) {
861
-            $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies;
862
-        }
863
-
864
-        $this->addAuthorizationHeader($headers, $host, $requestUrl);
865
-        $this->addProxyAuthorizationHeader($headers, $requestUrl);
866
-        $this->calculateRequestLength($headers);
867
-        if ('1.1' == $this->request->getConfig('protocol_version')) {
868
-            $this->updateExpectHeader($headers);
869
-        } else {
870
-            $this->expect100Continue = false;
871
-        }
872
-
873
-        $headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' .
874
-                      $this->request->getConfig('protocol_version') . "\r\n";
875
-        foreach ($headers as $name => $value) {
876
-            $canonicalName = implode('-', array_map('ucfirst', explode('-', $name)));
877
-            $headersStr   .= $canonicalName . ': ' . $value . "\r\n";
878
-        }
879
-        return $headersStr . "\r\n";
880
-    }
881
-
882
-    /**
883
-     * Adds or removes 'Expect: 100-continue' header from request headers
884
-     *
885
-     * Also sets the $expect100Continue property. Parsing of existing header
886
-     * is somewhat needed due to its complex structure and due to the
887
-     * requirement in section 8.2.3 of RFC 2616:
888
-     * > A client MUST NOT send an Expect request-header field (section
889
-     * > 14.20) with the "100-continue" expectation if it does not intend
890
-     * > to send a request body.
891
-     *
892
-     * @param array &$headers Array of headers prepared for the request
893
-     *
894
-     * @throws HTTP_Request2_LogicException
895
-     * @link http://pear.php.net/bugs/bug.php?id=19233
896
-     * @link http://tools.ietf.org/html/rfc2616#section-8.2.3
897
-     */
898
-    protected function updateExpectHeader(&$headers)
899
-    {
900
-        $this->expect100Continue = false;
901
-        $expectations = array();
902
-        if (isset($headers['expect'])) {
903
-            if ('' === $headers['expect']) {
904
-                // empty 'Expect' header is technically invalid, so just get rid of it
905
-                unset($headers['expect']);
906
-                return;
907
-            }
908
-            // build regexp to parse the value of existing Expect header
909
-            $expectParam     = ';\s*' . self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
910
-                               . self::REGEXP_TOKEN . '|'
911
-                               . self::REGEXP_QUOTED_STRING . '))?\s*';
912
-            $expectExtension = self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
913
-                               . self::REGEXP_TOKEN . '|'
914
-                               . self::REGEXP_QUOTED_STRING . ')\s*(?:'
915
-                               . $expectParam . ')*)?';
916
-            $expectItem      = '!(100-continue|' . $expectExtension . ')!A';
917
-
918
-            $pos    = 0;
919
-            $length = strlen($headers['expect']);
920
-
921
-            while ($pos < $length) {
922
-                $pos += strspn($headers['expect'], " \t", $pos);
923
-                if (',' === substr($headers['expect'], $pos, 1)) {
924
-                    $pos++;
925
-                    continue;
926
-
927
-                } elseif (!preg_match($expectItem, $headers['expect'], $m, 0, $pos)) {
928
-                    throw new HTTP_Request2_LogicException(
929
-                        "Cannot parse value '{$headers['expect']}' of Expect header",
930
-                        HTTP_Request2_Exception::INVALID_ARGUMENT
931
-                    );
932
-
933
-                } else {
934
-                    $pos += strlen($m[0]);
935
-                    if (strcasecmp('100-continue', $m[0])) {
936
-                        $expectations[]  = $m[0];
937
-                    }
938
-                }
939
-            }
940
-        }
941
-
942
-        if (1024 < $this->contentLength) {
943
-            $expectations[] = '100-continue';
944
-            $this->expect100Continue = true;
945
-        }
946
-
947
-        if (empty($expectations)) {
948
-            unset($headers['expect']);
949
-        } else {
950
-            $headers['expect'] = implode(',', $expectations);
951
-        }
952
-    }
953
-
954
-    /**
955
-     * Sends the request body
956
-     *
957
-     * @throws   HTTP_Request2_MessageException
958
-     */
959
-    protected function writeBody()
960
-    {
961
-        if (in_array($this->request->getMethod(), self::$bodyDisallowed)
962
-            || 0 == $this->contentLength
963
-        ) {
964
-            return;
965
-        }
966
-
967
-        $position   = 0;
968
-        $bufferSize = $this->request->getConfig('buffer_size');
969
-        $headers    = $this->request->getHeaders();
970
-        $chunked    = isset($headers['transfer-encoding']);
971
-        while ($position < $this->contentLength) {
972
-            if (is_string($this->requestBody)) {
973
-                $str = substr($this->requestBody, $position, $bufferSize);
974
-            } elseif (is_resource($this->requestBody)) {
975
-                $str = fread($this->requestBody, $bufferSize);
976
-            } else {
977
-                $str = $this->requestBody->read($bufferSize);
978
-            }
979
-            if (!$chunked) {
980
-                $this->socket->write($str);
981
-            } else {
982
-                $this->socket->write(dechex(strlen($str)) . "\r\n{$str}\r\n");
983
-            }
984
-            // Provide the length of written string to the observer, request #7630
985
-            $this->request->setLastEvent('sentBodyPart', strlen($str));
986
-            $position += strlen($str);
987
-        }
988
-
989
-        // write zero-length chunk
990
-        if ($chunked) {
991
-            $this->socket->write("0\r\n\r\n");
992
-        }
993
-        $this->request->setLastEvent('sentBody', $this->contentLength);
994
-    }
995
-
996
-    /**
997
-     * Reads the remote server's response
998
-     *
999
-     * @return   HTTP_Request2_Response
1000
-     * @throws   HTTP_Request2_Exception
1001
-     */
1002
-    protected function readResponse()
1003
-    {
1004
-        $bufferSize = $this->request->getConfig('buffer_size');
1005
-        // http://tools.ietf.org/html/rfc2616#section-8.2.3
1006
-        // ...the client SHOULD NOT wait for an indefinite period before sending the request body
1007
-        $timeout    = $this->expect100Continue ? 1 : null;
1008
-
1009
-        do {
1010
-            try {
1011
-                $response = new HTTP_Request2_Response(
1012
-                    $this->socket->readLine($bufferSize, $timeout), true, $this->request->getUrl()
1013
-                );
1014
-                do {
1015
-                    $headerLine = $this->socket->readLine($bufferSize);
1016
-                    $response->parseHeaderLine($headerLine);
1017
-                } while ('' != $headerLine);
1018
-
1019
-            } catch (HTTP_Request2_MessageException $e) {
1020
-                if (HTTP_Request2_Exception::TIMEOUT === $e->getCode()
1021
-                    && $this->expect100Continue
1022
-                ) {
1023
-                    return null;
1024
-                }
1025
-                throw $e;
1026
-            }
1027
-            if ($this->expect100Continue && 100 == $response->getStatus()) {
1028
-                return $response;
1029
-            }
1030
-        } while (in_array($response->getStatus(), array(100, 101)));
1031
-
1032
-        $this->request->setLastEvent('receivedHeaders', $response);
1033
-
1034
-        // No body possible in such responses
1035
-        if (HTTP_Request2::METHOD_HEAD == $this->request->getMethod()
1036
-            || (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod()
1037
-                && 200 <= $response->getStatus() && 300 > $response->getStatus())
1038
-            || in_array($response->getStatus(), array(204, 304))
1039
-        ) {
1040
-            return $response;
1041
-        }
1042
-
1043
-        $chunked = 'chunked' == $response->getHeader('transfer-encoding');
1044
-        $length  = $response->getHeader('content-length');
1045
-        $hasBody = false;
1046
-        if ($chunked || null === $length || 0 < intval($length)) {
1047
-            // RFC 2616, section 4.4:
1048
-            // 3. ... If a message is received with both a
1049
-            // Transfer-Encoding header field and a Content-Length header field,
1050
-            // the latter MUST be ignored.
1051
-            $toRead = ($chunked || null === $length)? null: $length;
1052
-            $this->chunkLength = 0;
1053
-
1054
-            while (!$this->socket->eof() && (is_null($toRead) || 0 < $toRead)) {
1055
-                if ($chunked) {
1056
-                    $data = $this->readChunked($bufferSize);
1057
-                } elseif (is_null($toRead)) {
1058
-                    $data = $this->socket->read($bufferSize);
1059
-                } else {
1060
-                    $data    = $this->socket->read(min($toRead, $bufferSize));
1061
-                    $toRead -= strlen($data);
1062
-                }
1063
-                if ('' == $data && (!$this->chunkLength || $this->socket->eof())) {
1064
-                    break;
1065
-                }
1066
-
1067
-                $hasBody = true;
1068
-                if ($this->request->getConfig('store_body')) {
1069
-                    $response->appendBody($data);
1070
-                }
1071
-                if (!in_array($response->getHeader('content-encoding'), array('identity', null))) {
1072
-                    $this->request->setLastEvent('receivedEncodedBodyPart', $data);
1073
-                } else {
1074
-                    $this->request->setLastEvent('receivedBodyPart', $data);
1075
-                }
1076
-            }
1077
-        }
1078
-
1079
-        if ($hasBody) {
1080
-            $this->request->setLastEvent('receivedBody', $response);
1081
-        }
1082
-        return $response;
1083
-    }
1084
-
1085
-    /**
1086
-     * Reads a part of response body encoded with chunked Transfer-Encoding
1087
-     *
1088
-     * @param int $bufferSize buffer size to use for reading
1089
-     *
1090
-     * @return   string
1091
-     * @throws   HTTP_Request2_MessageException
1092
-     */
1093
-    protected function readChunked($bufferSize)
1094
-    {
1095
-        // at start of the next chunk?
1096
-        if (0 == $this->chunkLength) {
1097
-            $line = $this->socket->readLine($bufferSize);
1098
-            if (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) {
1099
-                throw new HTTP_Request2_MessageException(
1100
-                    "Cannot decode chunked response, invalid chunk length '{$line}'",
1101
-                    HTTP_Request2_Exception::DECODE_ERROR
1102
-                );
1103
-            } else {
1104
-                $this->chunkLength = hexdec($matches[1]);
1105
-                // Chunk with zero length indicates the end
1106
-                if (0 == $this->chunkLength) {
1107
-                    $this->socket->readLine($bufferSize);
1108
-                    return '';
1109
-                }
1110
-            }
1111
-        }
1112
-        $data = $this->socket->read(min($this->chunkLength, $bufferSize));
1113
-        $this->chunkLength -= strlen($data);
1114
-        if (0 == $this->chunkLength) {
1115
-            $this->socket->readLine($bufferSize); // Trailing CRLF
1116
-        }
1117
-        return $data;
1118
-    }
42
+	/**
43
+	 * Regular expression for 'token' rule from RFC 2616
44
+	 */
45
+	const REGEXP_TOKEN = '[^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+';
46
+
47
+	/**
48
+	 * Regular expression for 'quoted-string' rule from RFC 2616
49
+	 */
50
+	const REGEXP_QUOTED_STRING = '"(?>[^"\\\\]+|\\\\.)*"';
51
+
52
+	/**
53
+	 * Connected sockets, needed for Keep-Alive support
54
+	 * @var  array
55
+	 * @see  connect()
56
+	 */
57
+	protected static $sockets = array();
58
+
59
+	/**
60
+	 * Data for digest authentication scheme
61
+	 *
62
+	 * The keys for the array are URL prefixes.
63
+	 *
64
+	 * The values are associative arrays with data (realm, nonce, nonce-count,
65
+	 * opaque...) needed for digest authentication. Stored here to prevent making
66
+	 * duplicate requests to digest-protected resources after we have already
67
+	 * received the challenge.
68
+	 *
69
+	 * @var  array
70
+	 */
71
+	protected static $challenges = array();
72
+
73
+	/**
74
+	 * Connected socket
75
+	 * @var  HTTP_Request2_SocketWrapper
76
+	 * @see  connect()
77
+	 */
78
+	protected $socket;
79
+
80
+	/**
81
+	 * Challenge used for server digest authentication
82
+	 * @var  array
83
+	 */
84
+	protected $serverChallenge;
85
+
86
+	/**
87
+	 * Challenge used for proxy digest authentication
88
+	 * @var  array
89
+	 */
90
+	protected $proxyChallenge;
91
+
92
+	/**
93
+	 * Remaining length of the current chunk, when reading chunked response
94
+	 * @var  integer
95
+	 * @see  readChunked()
96
+	 */
97
+	protected $chunkLength = 0;
98
+
99
+	/**
100
+	 * Remaining amount of redirections to follow
101
+	 *
102
+	 * Starts at 'max_redirects' configuration parameter and is reduced on each
103
+	 * subsequent redirect. An Exception will be thrown once it reaches zero.
104
+	 *
105
+	 * @var  integer
106
+	 */
107
+	protected $redirectCountdown = null;
108
+
109
+	/**
110
+	 * Whether to wait for "100 Continue" response before sending request body
111
+	 * @var bool
112
+	 */
113
+	protected $expect100Continue = false;
114
+
115
+	/**
116
+	 * Sends request to the remote server and returns its response
117
+	 *
118
+	 * @param HTTP_Request2 $request HTTP request message
119
+	 *
120
+	 * @return   HTTP_Request2_Response
121
+	 * @throws   HTTP_Request2_Exception
122
+	 */
123
+	public function sendRequest(HTTP_Request2 $request)
124
+	{
125
+		$this->request = $request;
126
+
127
+		try {
128
+			$keepAlive = $this->connect();
129
+			$headers   = $this->prepareHeaders();
130
+			$this->socket->write($headers);
131
+			// provide request headers to the observer, see request #7633
132
+			$this->request->setLastEvent('sentHeaders', $headers);
133
+
134
+			if (!$this->expect100Continue) {
135
+				$this->writeBody();
136
+				$response = $this->readResponse();
137
+
138
+			} else {
139
+				$response = $this->readResponse();
140
+				if (!$response || 100 == $response->getStatus()) {
141
+					$this->expect100Continue = false;
142
+					// either got "100 Continue" or timed out -> send body
143
+					$this->writeBody();
144
+					$response = $this->readResponse();
145
+				}
146
+			}
147
+
148
+
149
+			if ($jar = $request->getCookieJar()) {
150
+				$jar->addCookiesFromResponse($response, $request->getUrl());
151
+			}
152
+
153
+			if (!$this->canKeepAlive($keepAlive, $response)) {
154
+				$this->disconnect();
155
+			}
156
+
157
+			if ($this->shouldUseProxyDigestAuth($response)) {
158
+				return $this->sendRequest($request);
159
+			}
160
+			if ($this->shouldUseServerDigestAuth($response)) {
161
+				return $this->sendRequest($request);
162
+			}
163
+			if ($authInfo = $response->getHeader('authentication-info')) {
164
+				$this->updateChallenge($this->serverChallenge, $authInfo);
165
+			}
166
+			if ($proxyInfo = $response->getHeader('proxy-authentication-info')) {
167
+				$this->updateChallenge($this->proxyChallenge, $proxyInfo);
168
+			}
169
+
170
+		} catch (Exception $e) {
171
+			$this->disconnect();
172
+		}
173
+
174
+		unset($this->request, $this->requestBody);
175
+
176
+		if (!empty($e)) {
177
+			$this->redirectCountdown = null;
178
+			throw $e;
179
+		}
180
+
181
+		if (!$request->getConfig('follow_redirects') || !$response->isRedirect()) {
182
+			$this->redirectCountdown = null;
183
+			return $response;
184
+		} else {
185
+			return $this->handleRedirect($request, $response);
186
+		}
187
+	}
188
+
189
+	/**
190
+	 * Connects to the remote server
191
+	 *
192
+	 * @return   bool    whether the connection can be persistent
193
+	 * @throws   HTTP_Request2_Exception
194
+	 */
195
+	protected function connect()
196
+	{
197
+		$secure  = 0 == strcasecmp($this->request->getUrl()->getScheme(), 'https');
198
+		$tunnel  = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod();
199
+		$headers = $this->request->getHeaders();
200
+		$reqHost = $this->request->getUrl()->getHost();
201
+		if (!($reqPort = $this->request->getUrl()->getPort())) {
202
+			$reqPort = $secure? 443: 80;
203
+		}
204
+
205
+		$httpProxy = $socksProxy = false;
206
+		if (!($host = $this->request->getConfig('proxy_host'))) {
207
+			$host = $reqHost;
208
+			$port = $reqPort;
209
+		} else {
210
+			if (!($port = $this->request->getConfig('proxy_port'))) {
211
+				throw new HTTP_Request2_LogicException(
212
+					'Proxy port not provided',
213
+					HTTP_Request2_Exception::MISSING_VALUE
214
+				);
215
+			}
216
+			if ('http' == ($type = $this->request->getConfig('proxy_type'))) {
217
+				$httpProxy = true;
218
+			} elseif ('socks5' == $type) {
219
+				$socksProxy = true;
220
+			} else {
221
+				throw new HTTP_Request2_NotImplementedException(
222
+					"Proxy type '{$type}' is not supported"
223
+				);
224
+			}
225
+		}
226
+
227
+		if ($tunnel && !$httpProxy) {
228
+			throw new HTTP_Request2_LogicException(
229
+				"Trying to perform CONNECT request without proxy",
230
+				HTTP_Request2_Exception::MISSING_VALUE
231
+			);
232
+		}
233
+		if ($secure && !in_array('ssl', stream_get_transports())) {
234
+			throw new HTTP_Request2_LogicException(
235
+				'Need OpenSSL support for https:// requests',
236
+				HTTP_Request2_Exception::MISCONFIGURATION
237
+			);
238
+		}
239
+
240
+		// RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
241
+		// connection token to a proxy server...
242
+		if ($httpProxy && !$secure && !empty($headers['connection'])
243
+			&& 'Keep-Alive' == $headers['connection']
244
+		) {
245
+			$this->request->setHeader('connection');
246
+		}
247
+
248
+		$keepAlive = ('1.1' == $this->request->getConfig('protocol_version') &&
249
+					  empty($headers['connection'])) ||
250
+					 (!empty($headers['connection']) &&
251
+					  'Keep-Alive' == $headers['connection']);
252
+
253
+		$options = array();
254
+		if ($ip = $this->request->getConfig('local_ip')) {
255
+			$options['socket'] = array(
256
+				'bindto' => (false === strpos($ip, ':') ? $ip : '[' . $ip . ']') . ':0'
257
+			);
258
+		}
259
+		if ($secure || $tunnel) {
260
+			$options['ssl'] = array();
261
+			foreach ($this->request->getConfig() as $name => $value) {
262
+				if ('ssl_' == substr($name, 0, 4) && null !== $value) {
263
+					if ('ssl_verify_host' == $name) {
264
+						if ($value) {
265
+							$options['ssl']['CN_match'] = $reqHost;
266
+						}
267
+					} else {
268
+						$options['ssl'][substr($name, 4)] = $value;
269
+					}
270
+				}
271
+			}
272
+			ksort($options['ssl']);
273
+		}
274
+
275
+		// Use global request timeout if given, see feature requests #5735, #8964
276
+		if ($timeout = $this->request->getConfig('timeout')) {
277
+			$deadline = time() + $timeout;
278
+		} else {
279
+			$deadline = null;
280
+		}
281
+
282
+		// Changing SSL context options after connection is established does *not*
283
+		// work, we need a new connection if options change
284
+		$remote    = ((!$secure || $httpProxy || $socksProxy)? 'tcp://': 'ssl://')
285
+					 . $host . ':' . $port;
286
+		$socketKey = $remote . (
287
+						($secure && $httpProxy || $socksProxy)
288
+						? "->{$reqHost}:{$reqPort}" : ''
289
+					 ) . (empty($options)? '': ':' . serialize($options));
290
+		unset($this->socket);
291
+
292
+		// We use persistent connections and have a connected socket?
293
+		// Ensure that the socket is still connected, see bug #16149
294
+		if ($keepAlive && !empty(self::$sockets[$socketKey])
295
+			&& !self::$sockets[$socketKey]->eof()
296
+		) {
297
+			$this->socket =& self::$sockets[$socketKey];
298
+
299
+		} else {
300
+			if ($socksProxy) {
301
+				require_once 'HTTP/Request2/SOCKS5.php';
302
+
303
+				$this->socket = new HTTP_Request2_SOCKS5(
304
+					$remote, $this->request->getConfig('connect_timeout'),
305
+					$options, $this->request->getConfig('proxy_user'),
306
+					$this->request->getConfig('proxy_password')
307
+				);
308
+				// handle request timeouts ASAP
309
+				$this->socket->setDeadline($deadline, $this->request->getConfig('timeout'));
310
+				$this->socket->connect($reqHost, $reqPort);
311
+				if (!$secure) {
312
+					$conninfo = "tcp://{$reqHost}:{$reqPort} via {$remote}";
313
+				} else {
314
+					$this->socket->enableCrypto();
315
+					$conninfo = "ssl://{$reqHost}:{$reqPort} via {$remote}";
316
+				}
317
+
318
+			} elseif ($secure && $httpProxy && !$tunnel) {
319
+				$this->establishTunnel();
320
+				$conninfo = "ssl://{$reqHost}:{$reqPort} via {$remote}";
321
+
322
+			} else {
323
+				$this->socket = new HTTP_Request2_SocketWrapper(
324
+					$remote, $this->request->getConfig('connect_timeout'), $options
325
+				);
326
+			}
327
+			$this->request->setLastEvent('connect', empty($conninfo)? $remote: $conninfo);
328
+			self::$sockets[$socketKey] =& $this->socket;
329
+		}
330
+		$this->socket->setDeadline($deadline, $this->request->getConfig('timeout'));
331
+		return $keepAlive;
332
+	}
333
+
334
+	/**
335
+	 * Establishes a tunnel to a secure remote server via HTTP CONNECT request
336
+	 *
337
+	 * This method will fail if 'ssl_verify_peer' is enabled. Probably because PHP
338
+	 * sees that we are connected to a proxy server (duh!) rather than the server
339
+	 * that presents its certificate.
340
+	 *
341
+	 * @link     http://tools.ietf.org/html/rfc2817#section-5.2
342
+	 * @throws   HTTP_Request2_Exception
343
+	 */
344
+	protected function establishTunnel()
345
+	{
346
+		$donor   = new self;
347
+		$connect = new HTTP_Request2(
348
+			$this->request->getUrl(), HTTP_Request2::METHOD_CONNECT,
349
+			array_merge($this->request->getConfig(), array('adapter' => $donor))
350
+		);
351
+		$response = $connect->send();
352
+		// Need any successful (2XX) response
353
+		if (200 > $response->getStatus() || 300 <= $response->getStatus()) {
354
+			throw new HTTP_Request2_ConnectionException(
355
+				'Failed to connect via HTTPS proxy. Proxy response: ' .
356
+				$response->getStatus() . ' ' . $response->getReasonPhrase()
357
+			);
358
+		}
359
+		$this->socket = $donor->socket;
360
+		$this->socket->enableCrypto();
361
+	}
362
+
363
+	/**
364
+	 * Checks whether current connection may be reused or should be closed
365
+	 *
366
+	 * @param boolean                $requestKeepAlive whether connection could
367
+	 *                               be persistent in the first place
368
+	 * @param HTTP_Request2_Response $response         response object to check
369
+	 *
370
+	 * @return   boolean
371
+	 */
372
+	protected function canKeepAlive($requestKeepAlive, HTTP_Request2_Response $response)
373
+	{
374
+		// Do not close socket on successful CONNECT request
375
+		if (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod()
376
+			&& 200 <= $response->getStatus() && 300 > $response->getStatus()
377
+		) {
378
+			return true;
379
+		}
380
+
381
+		$lengthKnown = 'chunked' == strtolower($response->getHeader('transfer-encoding'))
382
+					   || null !== $response->getHeader('content-length')
383
+					   // no body possible for such responses, see also request #17031
384
+					   || HTTP_Request2::METHOD_HEAD == $this->request->getMethod()
385
+					   || in_array($response->getStatus(), array(204, 304));
386
+		$persistent  = 'keep-alive' == strtolower($response->getHeader('connection')) ||
387
+					   (null === $response->getHeader('connection') &&
388
+						'1.1' == $response->getVersion());
389
+		return $requestKeepAlive && $lengthKnown && $persistent;
390
+	}
391
+
392
+	/**
393
+	 * Disconnects from the remote server
394
+	 */
395
+	protected function disconnect()
396
+	{
397
+		if (!empty($this->socket)) {
398
+			$this->socket = null;
399
+			$this->request->setLastEvent('disconnect');
400
+		}
401
+	}
402
+
403
+	/**
404
+	 * Handles HTTP redirection
405
+	 *
406
+	 * This method will throw an Exception if redirect to a non-HTTP(S) location
407
+	 * is attempted, also if number of redirects performed already is equal to
408
+	 * 'max_redirects' configuration parameter.
409
+	 *
410
+	 * @param HTTP_Request2          $request  Original request
411
+	 * @param HTTP_Request2_Response $response Response containing redirect
412
+	 *
413
+	 * @return   HTTP_Request2_Response      Response from a new location
414
+	 * @throws   HTTP_Request2_Exception
415
+	 */
416
+	protected function handleRedirect(
417
+		HTTP_Request2 $request, HTTP_Request2_Response $response
418
+	) {
419
+		if (is_null($this->redirectCountdown)) {
420
+			$this->redirectCountdown = $request->getConfig('max_redirects');
421
+		}
422
+		if (0 == $this->redirectCountdown) {
423
+			$this->redirectCountdown = null;
424
+			// Copying cURL behaviour
425
+			throw new HTTP_Request2_MessageException(
426
+				'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed',
427
+				HTTP_Request2_Exception::TOO_MANY_REDIRECTS
428
+			);
429
+		}
430
+		$redirectUrl = new Net_URL2(
431
+			$response->getHeader('location'),
432
+			array(Net_URL2::OPTION_USE_BRACKETS => $request->getConfig('use_brackets'))
433
+		);
434
+		// refuse non-HTTP redirect
435
+		if ($redirectUrl->isAbsolute()
436
+			&& !in_array($redirectUrl->getScheme(), array('http', 'https'))
437
+		) {
438
+			$this->redirectCountdown = null;
439
+			throw new HTTP_Request2_MessageException(
440
+				'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString(),
441
+				HTTP_Request2_Exception::NON_HTTP_REDIRECT
442
+			);
443
+		}
444
+		// Theoretically URL should be absolute (see http://tools.ietf.org/html/rfc2616#section-14.30),
445
+		// but in practice it is often not
446
+		if (!$redirectUrl->isAbsolute()) {
447
+			$redirectUrl = $request->getUrl()->resolve($redirectUrl);
448
+		}
449
+		$redirect = clone $request;
450
+		$redirect->setUrl($redirectUrl);
451
+		if (303 == $response->getStatus()
452
+			|| (!$request->getConfig('strict_redirects')
453
+				&& in_array($response->getStatus(), array(301, 302)))
454
+		) {
455
+			$redirect->setMethod(HTTP_Request2::METHOD_GET);
456
+			$redirect->setBody('');
457
+		}
458
+
459
+		if (0 < $this->redirectCountdown) {
460
+			$this->redirectCountdown--;
461
+		}
462
+		return $this->sendRequest($redirect);
463
+	}
464
+
465
+	/**
466
+	 * Checks whether another request should be performed with server digest auth
467
+	 *
468
+	 * Several conditions should be satisfied for it to return true:
469
+	 *   - response status should be 401
470
+	 *   - auth credentials should be set in the request object
471
+	 *   - response should contain WWW-Authenticate header with digest challenge
472
+	 *   - there is either no challenge stored for this URL or new challenge
473
+	 *     contains stale=true parameter (in other case we probably just failed
474
+	 *     due to invalid username / password)
475
+	 *
476
+	 * The method stores challenge values in $challenges static property
477
+	 *
478
+	 * @param HTTP_Request2_Response $response response to check
479
+	 *
480
+	 * @return   boolean whether another request should be performed
481
+	 * @throws   HTTP_Request2_Exception in case of unsupported challenge parameters
482
+	 */
483
+	protected function shouldUseServerDigestAuth(HTTP_Request2_Response $response)
484
+	{
485
+		// no sense repeating a request if we don't have credentials
486
+		if (401 != $response->getStatus() || !$this->request->getAuth()) {
487
+			return false;
488
+		}
489
+		if (!$challenge = $this->parseDigestChallenge($response->getHeader('www-authenticate'))) {
490
+			return false;
491
+		}
492
+
493
+		$url    = $this->request->getUrl();
494
+		$scheme = $url->getScheme();
495
+		$host   = $scheme . '://' . $url->getHost();
496
+		if ($port = $url->getPort()) {
497
+			if ((0 == strcasecmp($scheme, 'http') && 80 != $port)
498
+				|| (0 == strcasecmp($scheme, 'https') && 443 != $port)
499
+			) {
500
+				$host .= ':' . $port;
501
+			}
502
+		}
503
+
504
+		if (!empty($challenge['domain'])) {
505
+			$prefixes = array();
506
+			foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) {
507
+				// don't bother with different servers
508
+				if ('/' == substr($prefix, 0, 1)) {
509
+					$prefixes[] = $host . $prefix;
510
+				}
511
+			}
512
+		}
513
+		if (empty($prefixes)) {
514
+			$prefixes = array($host . '/');
515
+		}
516
+
517
+		$ret = true;
518
+		foreach ($prefixes as $prefix) {
519
+			if (!empty(self::$challenges[$prefix])
520
+				&& (empty($challenge['stale']) || strcasecmp('true', $challenge['stale']))
521
+			) {
522
+				// probably credentials are invalid
523
+				$ret = false;
524
+			}
525
+			self::$challenges[$prefix] =& $challenge;
526
+		}
527
+		return $ret;
528
+	}
529
+
530
+	/**
531
+	 * Checks whether another request should be performed with proxy digest auth
532
+	 *
533
+	 * Several conditions should be satisfied for it to return true:
534
+	 *   - response status should be 407
535
+	 *   - proxy auth credentials should be set in the request object
536
+	 *   - response should contain Proxy-Authenticate header with digest challenge
537
+	 *   - there is either no challenge stored for this proxy or new challenge
538
+	 *     contains stale=true parameter (in other case we probably just failed
539
+	 *     due to invalid username / password)
540
+	 *
541
+	 * The method stores challenge values in $challenges static property
542
+	 *
543
+	 * @param HTTP_Request2_Response $response response to check
544
+	 *
545
+	 * @return   boolean whether another request should be performed
546
+	 * @throws   HTTP_Request2_Exception in case of unsupported challenge parameters
547
+	 */
548
+	protected function shouldUseProxyDigestAuth(HTTP_Request2_Response $response)
549
+	{
550
+		if (407 != $response->getStatus() || !$this->request->getConfig('proxy_user')) {
551
+			return false;
552
+		}
553
+		if (!($challenge = $this->parseDigestChallenge($response->getHeader('proxy-authenticate')))) {
554
+			return false;
555
+		}
556
+
557
+		$key = 'proxy://' . $this->request->getConfig('proxy_host') .
558
+			   ':' . $this->request->getConfig('proxy_port');
559
+
560
+		if (!empty(self::$challenges[$key])
561
+			&& (empty($challenge['stale']) || strcasecmp('true', $challenge['stale']))
562
+		) {
563
+			$ret = false;
564
+		} else {
565
+			$ret = true;
566
+		}
567
+		self::$challenges[$key] = $challenge;
568
+		return $ret;
569
+	}
570
+
571
+	/**
572
+	 * Extracts digest method challenge from (WWW|Proxy)-Authenticate header value
573
+	 *
574
+	 * There is a problem with implementation of RFC 2617: several of the parameters
575
+	 * are defined as quoted-string there and thus may contain backslash escaped
576
+	 * double quotes (RFC 2616, section 2.2). However, RFC 2617 defines unq(X) as
577
+	 * just value of quoted-string X without surrounding quotes, it doesn't speak
578
+	 * about removing backslash escaping.
579
+	 *
580
+	 * Now realm parameter is user-defined and human-readable, strange things
581
+	 * happen when it contains quotes:
582
+	 *   - Apache allows quotes in realm, but apparently uses realm value without
583
+	 *     backslashes for digest computation
584
+	 *   - Squid allows (manually escaped) quotes there, but it is impossible to
585
+	 *     authorize with either escaped or unescaped quotes used in digest,
586
+	 *     probably it can't parse the response (?)
587
+	 *   - Both IE and Firefox display realm value with backslashes in
588
+	 *     the password popup and apparently use the same value for digest
589
+	 *
590
+	 * HTTP_Request2 follows IE and Firefox (and hopefully RFC 2617) in
591
+	 * quoted-string handling, unfortunately that means failure to authorize
592
+	 * sometimes
593
+	 *
594
+	 * @param string $headerValue value of WWW-Authenticate or Proxy-Authenticate header
595
+	 *
596
+	 * @return   mixed   associative array with challenge parameters, false if
597
+	 *                   no challenge is present in header value
598
+	 * @throws   HTTP_Request2_NotImplementedException in case of unsupported challenge parameters
599
+	 */
600
+	protected function parseDigestChallenge($headerValue)
601
+	{
602
+		$authParam   = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
603
+					   self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')';
604
+		$challenge   = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!";
605
+		if (!preg_match($challenge, $headerValue, $matches)) {
606
+			return false;
607
+		}
608
+
609
+		preg_match_all('!' . $authParam . '!', $matches[0], $params);
610
+		$paramsAry   = array();
611
+		$knownParams = array('realm', 'domain', 'nonce', 'opaque', 'stale',
612
+							 'algorithm', 'qop');
613
+		for ($i = 0; $i < count($params[0]); $i++) {
614
+			// section 3.2.1: Any unrecognized directive MUST be ignored.
615
+			if (in_array($params[1][$i], $knownParams)) {
616
+				if ('"' == substr($params[2][$i], 0, 1)) {
617
+					$paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1);
618
+				} else {
619
+					$paramsAry[$params[1][$i]] = $params[2][$i];
620
+				}
621
+			}
622
+		}
623
+		// we only support qop=auth
624
+		if (!empty($paramsAry['qop'])
625
+			&& !in_array('auth', array_map('trim', explode(',', $paramsAry['qop'])))
626
+		) {
627
+			throw new HTTP_Request2_NotImplementedException(
628
+				"Only 'auth' qop is currently supported in digest authentication, " .
629
+				"server requested '{$paramsAry['qop']}'"
630
+			);
631
+		}
632
+		// we only support algorithm=MD5
633
+		if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) {
634
+			throw new HTTP_Request2_NotImplementedException(
635
+				"Only 'MD5' algorithm is currently supported in digest authentication, " .
636
+				"server requested '{$paramsAry['algorithm']}'"
637
+			);
638
+		}
639
+
640
+		return $paramsAry;
641
+	}
642
+
643
+	/**
644
+	 * Parses [Proxy-]Authentication-Info header value and updates challenge
645
+	 *
646
+	 * @param array  &$challenge  challenge to update
647
+	 * @param string $headerValue value of [Proxy-]Authentication-Info header
648
+	 *
649
+	 * @todo     validate server rspauth response
650
+	 */
651
+	protected function updateChallenge(&$challenge, $headerValue)
652
+	{
653
+		$authParam   = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
654
+					   self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!';
655
+		$paramsAry   = array();
656
+
657
+		preg_match_all($authParam, $headerValue, $params);
658
+		for ($i = 0; $i < count($params[0]); $i++) {
659
+			if ('"' == substr($params[2][$i], 0, 1)) {
660
+				$paramsAry[$params[1][$i]] = substr($params[2][$i], 1, -1);
661
+			} else {
662
+				$paramsAry[$params[1][$i]] = $params[2][$i];
663
+			}
664
+		}
665
+		// for now, just update the nonce value
666
+		if (!empty($paramsAry['nextnonce'])) {
667
+			$challenge['nonce'] = $paramsAry['nextnonce'];
668
+			$challenge['nc']    = 1;
669
+		}
670
+	}
671
+
672
+	/**
673
+	 * Creates a value for [Proxy-]Authorization header when using digest authentication
674
+	 *
675
+	 * @param string $user       user name
676
+	 * @param string $password   password
677
+	 * @param string $url        request URL
678
+	 * @param array  &$challenge digest challenge parameters
679
+	 *
680
+	 * @return   string  value of [Proxy-]Authorization request header
681
+	 * @link     http://tools.ietf.org/html/rfc2617#section-3.2.2
682
+	 */
683
+	protected function createDigestResponse($user, $password, $url, &$challenge)
684
+	{
685
+		if (false !== ($q = strpos($url, '?'))
686
+			&& $this->request->getConfig('digest_compat_ie')
687
+		) {
688
+			$url = substr($url, 0, $q);
689
+		}
690
+
691
+		$a1 = md5($user . ':' . $challenge['realm'] . ':' . $password);
692
+		$a2 = md5($this->request->getMethod() . ':' . $url);
693
+
694
+		if (empty($challenge['qop'])) {
695
+			$digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2);
696
+		} else {
697
+			$challenge['cnonce'] = 'Req2.' . rand();
698
+			if (empty($challenge['nc'])) {
699
+				$challenge['nc'] = 1;
700
+			}
701
+			$nc     = sprintf('%08x', $challenge['nc']++);
702
+			$digest = md5(
703
+				$a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' .
704
+				$challenge['cnonce'] . ':auth:' . $a2
705
+			);
706
+		}
707
+		return 'Digest username="' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $user) . '", ' .
708
+			   'realm="' . $challenge['realm'] . '", ' .
709
+			   'nonce="' . $challenge['nonce'] . '", ' .
710
+			   'uri="' . $url . '", ' .
711
+			   'response="' . $digest . '"' .
712
+			   (!empty($challenge['opaque'])?
713
+				', opaque="' . $challenge['opaque'] . '"':
714
+				'') .
715
+			   (!empty($challenge['qop'])?
716
+				', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"':
717
+				'');
718
+	}
719
+
720
+	/**
721
+	 * Adds 'Authorization' header (if needed) to request headers array
722
+	 *
723
+	 * @param array  &$headers    request headers
724
+	 * @param string $requestHost request host (needed for digest authentication)
725
+	 * @param string $requestUrl  request URL (needed for digest authentication)
726
+	 *
727
+	 * @throws   HTTP_Request2_NotImplementedException
728
+	 */
729
+	protected function addAuthorizationHeader(&$headers, $requestHost, $requestUrl)
730
+	{
731
+		if (!($auth = $this->request->getAuth())) {
732
+			return;
733
+		}
734
+		switch ($auth['scheme']) {
735
+		case HTTP_Request2::AUTH_BASIC:
736
+			$headers['authorization'] = 'Basic ' . base64_encode(
737
+				$auth['user'] . ':' . $auth['password']
738
+			);
739
+			break;
740
+
741
+		case HTTP_Request2::AUTH_DIGEST:
742
+			unset($this->serverChallenge);
743
+			$fullUrl = ('/' == $requestUrl[0])?
744
+					   $this->request->getUrl()->getScheme() . '://' .
745
+						$requestHost . $requestUrl:
746
+					   $requestUrl;
747
+			foreach (array_keys(self::$challenges) as $key) {
748
+				if ($key == substr($fullUrl, 0, strlen($key))) {
749
+					$headers['authorization'] = $this->createDigestResponse(
750
+						$auth['user'], $auth['password'],
751
+						$requestUrl, self::$challenges[$key]
752
+					);
753
+					$this->serverChallenge =& self::$challenges[$key];
754
+					break;
755
+				}
756
+			}
757
+			break;
758
+
759
+		default:
760
+			throw new HTTP_Request2_NotImplementedException(
761
+				"Unknown HTTP authentication scheme '{$auth['scheme']}'"
762
+			);
763
+		}
764
+	}
765
+
766
+	/**
767
+	 * Adds 'Proxy-Authorization' header (if needed) to request headers array
768
+	 *
769
+	 * @param array  &$headers   request headers
770
+	 * @param string $requestUrl request URL (needed for digest authentication)
771
+	 *
772
+	 * @throws   HTTP_Request2_NotImplementedException
773
+	 */
774
+	protected function addProxyAuthorizationHeader(&$headers, $requestUrl)
775
+	{
776
+		if (!$this->request->getConfig('proxy_host')
777
+			|| !($user = $this->request->getConfig('proxy_user'))
778
+			|| (0 == strcasecmp('https', $this->request->getUrl()->getScheme())
779
+				&& HTTP_Request2::METHOD_CONNECT != $this->request->getMethod())
780
+		) {
781
+			return;
782
+		}
783
+
784
+		$password = $this->request->getConfig('proxy_password');
785
+		switch ($this->request->getConfig('proxy_auth_scheme')) {
786
+		case HTTP_Request2::AUTH_BASIC:
787
+			$headers['proxy-authorization'] = 'Basic ' . base64_encode(
788
+				$user . ':' . $password
789
+			);
790
+			break;
791
+
792
+		case HTTP_Request2::AUTH_DIGEST:
793
+			unset($this->proxyChallenge);
794
+			$proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') .
795
+						':' . $this->request->getConfig('proxy_port');
796
+			if (!empty(self::$challenges[$proxyUrl])) {
797
+				$headers['proxy-authorization'] = $this->createDigestResponse(
798
+					$user, $password,
799
+					$requestUrl, self::$challenges[$proxyUrl]
800
+				);
801
+				$this->proxyChallenge =& self::$challenges[$proxyUrl];
802
+			}
803
+			break;
804
+
805
+		default:
806
+			throw new HTTP_Request2_NotImplementedException(
807
+				"Unknown HTTP authentication scheme '" .
808
+				$this->request->getConfig('proxy_auth_scheme') . "'"
809
+			);
810
+		}
811
+	}
812
+
813
+
814
+	/**
815
+	 * Creates the string with the Request-Line and request headers
816
+	 *
817
+	 * @return   string
818
+	 * @throws   HTTP_Request2_Exception
819
+	 */
820
+	protected function prepareHeaders()
821
+	{
822
+		$headers = $this->request->getHeaders();
823
+		$url     = $this->request->getUrl();
824
+		$connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod();
825
+		$host    = $url->getHost();
826
+
827
+		$defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80;
828
+		if (($port = $url->getPort()) && $port != $defaultPort || $connect) {
829
+			$host .= ':' . (empty($port)? $defaultPort: $port);
830
+		}
831
+		// Do not overwrite explicitly set 'Host' header, see bug #16146
832
+		if (!isset($headers['host'])) {
833
+			$headers['host'] = $host;
834
+		}
835
+
836
+		if ($connect) {
837
+			$requestUrl = $host;
838
+
839
+		} else {
840
+			if (!$this->request->getConfig('proxy_host')
841
+				|| 'http' != $this->request->getConfig('proxy_type')
842
+				|| 0 == strcasecmp($url->getScheme(), 'https')
843
+			) {
844
+				$requestUrl = '';
845
+			} else {
846
+				$requestUrl = $url->getScheme() . '://' . $host;
847
+			}
848
+			$path        = $url->getPath();
849
+			$query       = $url->getQuery();
850
+			$requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query);
851
+		}
852
+
853
+		if ('1.1' == $this->request->getConfig('protocol_version')
854
+			&& extension_loaded('zlib') && !isset($headers['accept-encoding'])
855
+		) {
856
+			$headers['accept-encoding'] = 'gzip, deflate';
857
+		}
858
+		if (($jar = $this->request->getCookieJar())
859
+			&& ($cookies = $jar->getMatching($this->request->getUrl(), true))
860
+		) {
861
+			$headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies;
862
+		}
863
+
864
+		$this->addAuthorizationHeader($headers, $host, $requestUrl);
865
+		$this->addProxyAuthorizationHeader($headers, $requestUrl);
866
+		$this->calculateRequestLength($headers);
867
+		if ('1.1' == $this->request->getConfig('protocol_version')) {
868
+			$this->updateExpectHeader($headers);
869
+		} else {
870
+			$this->expect100Continue = false;
871
+		}
872
+
873
+		$headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' .
874
+					  $this->request->getConfig('protocol_version') . "\r\n";
875
+		foreach ($headers as $name => $value) {
876
+			$canonicalName = implode('-', array_map('ucfirst', explode('-', $name)));
877
+			$headersStr   .= $canonicalName . ': ' . $value . "\r\n";
878
+		}
879
+		return $headersStr . "\r\n";
880
+	}
881
+
882
+	/**
883
+	 * Adds or removes 'Expect: 100-continue' header from request headers
884
+	 *
885
+	 * Also sets the $expect100Continue property. Parsing of existing header
886
+	 * is somewhat needed due to its complex structure and due to the
887
+	 * requirement in section 8.2.3 of RFC 2616:
888
+	 * > A client MUST NOT send an Expect request-header field (section
889
+	 * > 14.20) with the "100-continue" expectation if it does not intend
890
+	 * > to send a request body.
891
+	 *
892
+	 * @param array &$headers Array of headers prepared for the request
893
+	 *
894
+	 * @throws HTTP_Request2_LogicException
895
+	 * @link http://pear.php.net/bugs/bug.php?id=19233
896
+	 * @link http://tools.ietf.org/html/rfc2616#section-8.2.3
897
+	 */
898
+	protected function updateExpectHeader(&$headers)
899
+	{
900
+		$this->expect100Continue = false;
901
+		$expectations = array();
902
+		if (isset($headers['expect'])) {
903
+			if ('' === $headers['expect']) {
904
+				// empty 'Expect' header is technically invalid, so just get rid of it
905
+				unset($headers['expect']);
906
+				return;
907
+			}
908
+			// build regexp to parse the value of existing Expect header
909
+			$expectParam     = ';\s*' . self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
910
+							   . self::REGEXP_TOKEN . '|'
911
+							   . self::REGEXP_QUOTED_STRING . '))?\s*';
912
+			$expectExtension = self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
913
+							   . self::REGEXP_TOKEN . '|'
914
+							   . self::REGEXP_QUOTED_STRING . ')\s*(?:'
915
+							   . $expectParam . ')*)?';
916
+			$expectItem      = '!(100-continue|' . $expectExtension . ')!A';
917
+
918
+			$pos    = 0;
919
+			$length = strlen($headers['expect']);
920
+
921
+			while ($pos < $length) {
922
+				$pos += strspn($headers['expect'], " \t", $pos);
923
+				if (',' === substr($headers['expect'], $pos, 1)) {
924
+					$pos++;
925
+					continue;
926
+
927
+				} elseif (!preg_match($expectItem, $headers['expect'], $m, 0, $pos)) {
928
+					throw new HTTP_Request2_LogicException(
929
+						"Cannot parse value '{$headers['expect']}' of Expect header",
930
+						HTTP_Request2_Exception::INVALID_ARGUMENT
931
+					);
932
+
933
+				} else {
934
+					$pos += strlen($m[0]);
935
+					if (strcasecmp('100-continue', $m[0])) {
936
+						$expectations[]  = $m[0];
937
+					}
938
+				}
939
+			}
940
+		}
941
+
942
+		if (1024 < $this->contentLength) {
943
+			$expectations[] = '100-continue';
944
+			$this->expect100Continue = true;
945
+		}
946
+
947
+		if (empty($expectations)) {
948
+			unset($headers['expect']);
949
+		} else {
950
+			$headers['expect'] = implode(',', $expectations);
951
+		}
952
+	}
953
+
954
+	/**
955
+	 * Sends the request body
956
+	 *
957
+	 * @throws   HTTP_Request2_MessageException
958
+	 */
959
+	protected function writeBody()
960
+	{
961
+		if (in_array($this->request->getMethod(), self::$bodyDisallowed)
962
+			|| 0 == $this->contentLength
963
+		) {
964
+			return;
965
+		}
966
+
967
+		$position   = 0;
968
+		$bufferSize = $this->request->getConfig('buffer_size');
969
+		$headers    = $this->request->getHeaders();
970
+		$chunked    = isset($headers['transfer-encoding']);
971
+		while ($position < $this->contentLength) {
972
+			if (is_string($this->requestBody)) {
973
+				$str = substr($this->requestBody, $position, $bufferSize);
974
+			} elseif (is_resource($this->requestBody)) {
975
+				$str = fread($this->requestBody, $bufferSize);
976
+			} else {
977
+				$str = $this->requestBody->read($bufferSize);
978
+			}
979
+			if (!$chunked) {
980
+				$this->socket->write($str);
981
+			} else {
982
+				$this->socket->write(dechex(strlen($str)) . "\r\n{$str}\r\n");
983
+			}
984
+			// Provide the length of written string to the observer, request #7630
985
+			$this->request->setLastEvent('sentBodyPart', strlen($str));
986
+			$position += strlen($str);
987
+		}
988
+
989
+		// write zero-length chunk
990
+		if ($chunked) {
991
+			$this->socket->write("0\r\n\r\n");
992
+		}
993
+		$this->request->setLastEvent('sentBody', $this->contentLength);
994
+	}
995
+
996
+	/**
997
+	 * Reads the remote server's response
998
+	 *
999
+	 * @return   HTTP_Request2_Response
1000
+	 * @throws   HTTP_Request2_Exception
1001
+	 */
1002
+	protected function readResponse()
1003
+	{
1004
+		$bufferSize = $this->request->getConfig('buffer_size');
1005
+		// http://tools.ietf.org/html/rfc2616#section-8.2.3
1006
+		// ...the client SHOULD NOT wait for an indefinite period before sending the request body
1007
+		$timeout    = $this->expect100Continue ? 1 : null;
1008
+
1009
+		do {
1010
+			try {
1011
+				$response = new HTTP_Request2_Response(
1012
+					$this->socket->readLine($bufferSize, $timeout), true, $this->request->getUrl()
1013
+				);
1014
+				do {
1015
+					$headerLine = $this->socket->readLine($bufferSize);
1016
+					$response->parseHeaderLine($headerLine);
1017
+				} while ('' != $headerLine);
1018
+
1019
+			} catch (HTTP_Request2_MessageException $e) {
1020
+				if (HTTP_Request2_Exception::TIMEOUT === $e->getCode()
1021
+					&& $this->expect100Continue
1022
+				) {
1023
+					return null;
1024
+				}
1025
+				throw $e;
1026
+			}
1027
+			if ($this->expect100Continue && 100 == $response->getStatus()) {
1028
+				return $response;
1029
+			}
1030
+		} while (in_array($response->getStatus(), array(100, 101)));
1031
+
1032
+		$this->request->setLastEvent('receivedHeaders', $response);
1033
+
1034
+		// No body possible in such responses
1035
+		if (HTTP_Request2::METHOD_HEAD == $this->request->getMethod()
1036
+			|| (HTTP_Request2::METHOD_CONNECT == $this->request->getMethod()
1037
+				&& 200 <= $response->getStatus() && 300 > $response->getStatus())
1038
+			|| in_array($response->getStatus(), array(204, 304))
1039
+		) {
1040
+			return $response;
1041
+		}
1042
+
1043
+		$chunked = 'chunked' == $response->getHeader('transfer-encoding');
1044
+		$length  = $response->getHeader('content-length');
1045
+		$hasBody = false;
1046
+		if ($chunked || null === $length || 0 < intval($length)) {
1047
+			// RFC 2616, section 4.4:
1048
+			// 3. ... If a message is received with both a
1049
+			// Transfer-Encoding header field and a Content-Length header field,
1050
+			// the latter MUST be ignored.
1051
+			$toRead = ($chunked || null === $length)? null: $length;
1052
+			$this->chunkLength = 0;
1053
+
1054
+			while (!$this->socket->eof() && (is_null($toRead) || 0 < $toRead)) {
1055
+				if ($chunked) {
1056
+					$data = $this->readChunked($bufferSize);
1057
+				} elseif (is_null($toRead)) {
1058
+					$data = $this->socket->read($bufferSize);
1059
+				} else {
1060
+					$data    = $this->socket->read(min($toRead, $bufferSize));
1061
+					$toRead -= strlen($data);
1062
+				}
1063
+				if ('' == $data && (!$this->chunkLength || $this->socket->eof())) {
1064
+					break;
1065
+				}
1066
+
1067
+				$hasBody = true;
1068
+				if ($this->request->getConfig('store_body')) {
1069
+					$response->appendBody($data);
1070
+				}
1071
+				if (!in_array($response->getHeader('content-encoding'), array('identity', null))) {
1072
+					$this->request->setLastEvent('receivedEncodedBodyPart', $data);
1073
+				} else {
1074
+					$this->request->setLastEvent('receivedBodyPart', $data);
1075
+				}
1076
+			}
1077
+		}
1078
+
1079
+		if ($hasBody) {
1080
+			$this->request->setLastEvent('receivedBody', $response);
1081
+		}
1082
+		return $response;
1083
+	}
1084
+
1085
+	/**
1086
+	 * Reads a part of response body encoded with chunked Transfer-Encoding
1087
+	 *
1088
+	 * @param int $bufferSize buffer size to use for reading
1089
+	 *
1090
+	 * @return   string
1091
+	 * @throws   HTTP_Request2_MessageException
1092
+	 */
1093
+	protected function readChunked($bufferSize)
1094
+	{
1095
+		// at start of the next chunk?
1096
+		if (0 == $this->chunkLength) {
1097
+			$line = $this->socket->readLine($bufferSize);
1098
+			if (!preg_match('/^([0-9a-f]+)/i', $line, $matches)) {
1099
+				throw new HTTP_Request2_MessageException(
1100
+					"Cannot decode chunked response, invalid chunk length '{$line}'",
1101
+					HTTP_Request2_Exception::DECODE_ERROR
1102
+				);
1103
+			} else {
1104
+				$this->chunkLength = hexdec($matches[1]);
1105
+				// Chunk with zero length indicates the end
1106
+				if (0 == $this->chunkLength) {
1107
+					$this->socket->readLine($bufferSize);
1108
+					return '';
1109
+				}
1110
+			}
1111
+		}
1112
+		$data = $this->socket->read(min($this->chunkLength, $bufferSize));
1113
+		$this->chunkLength -= strlen($data);
1114
+		if (0 == $this->chunkLength) {
1115
+			$this->socket->readLine($bufferSize); // Trailing CRLF
1116
+		}
1117
+		return $data;
1118
+	}
1119 1119
 }
1120 1120
 
1121 1121
 ?>
1122 1122
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +76 added lines, -79 removed lines patch added patch discarded remove patch
@@ -199,7 +199,7 @@  discard block
 block discarded – undo
199 199
         $headers = $this->request->getHeaders();
200 200
         $reqHost = $this->request->getUrl()->getHost();
201 201
         if (!($reqPort = $this->request->getUrl()->getPort())) {
202
-            $reqPort = $secure? 443: 80;
202
+            $reqPort = $secure ? 443 : 80;
203 203
         }
204 204
 
205 205
         $httpProxy = $socksProxy = false;
@@ -253,7 +253,7 @@  discard block
 block discarded – undo
253 253
         $options = array();
254 254
         if ($ip = $this->request->getConfig('local_ip')) {
255 255
             $options['socket'] = array(
256
-                'bindto' => (false === strpos($ip, ':') ? $ip : '[' . $ip . ']') . ':0'
256
+                'bindto' => (false === strpos($ip, ':') ? $ip : '['.$ip.']').':0'
257 257
             );
258 258
         }
259 259
         if ($secure || $tunnel) {
@@ -281,12 +281,12 @@  discard block
 block discarded – undo
281 281
 
282 282
         // Changing SSL context options after connection is established does *not*
283 283
         // work, we need a new connection if options change
284
-        $remote    = ((!$secure || $httpProxy || $socksProxy)? 'tcp://': 'ssl://')
285
-                     . $host . ':' . $port;
286
-        $socketKey = $remote . (
284
+        $remote    = ((!$secure || $httpProxy || $socksProxy) ? 'tcp://' : 'ssl://')
285
+                     . $host.':'.$port;
286
+        $socketKey = $remote.(
287 287
                         ($secure && $httpProxy || $socksProxy)
288 288
                         ? "->{$reqHost}:{$reqPort}" : ''
289
-                     ) . (empty($options)? '': ':' . serialize($options));
289
+                     ).(empty($options) ? '' : ':'.serialize($options));
290 290
         unset($this->socket);
291 291
 
292 292
         // We use persistent connections and have a connected socket?
@@ -294,7 +294,7 @@  discard block
 block discarded – undo
294 294
         if ($keepAlive && !empty(self::$sockets[$socketKey])
295 295
             && !self::$sockets[$socketKey]->eof()
296 296
         ) {
297
-            $this->socket =& self::$sockets[$socketKey];
297
+            $this->socket = & self::$sockets[$socketKey];
298 298
 
299 299
         } else {
300 300
             if ($socksProxy) {
@@ -324,8 +324,8 @@  discard block
 block discarded – undo
324 324
                     $remote, $this->request->getConfig('connect_timeout'), $options
325 325
                 );
326 326
             }
327
-            $this->request->setLastEvent('connect', empty($conninfo)? $remote: $conninfo);
328
-            self::$sockets[$socketKey] =& $this->socket;
327
+            $this->request->setLastEvent('connect', empty($conninfo) ? $remote : $conninfo);
328
+            self::$sockets[$socketKey] = & $this->socket;
329 329
         }
330 330
         $this->socket->setDeadline($deadline, $this->request->getConfig('timeout'));
331 331
         return $keepAlive;
@@ -352,8 +352,8 @@  discard block
 block discarded – undo
352 352
         // Need any successful (2XX) response
353 353
         if (200 > $response->getStatus() || 300 <= $response->getStatus()) {
354 354
             throw new HTTP_Request2_ConnectionException(
355
-                'Failed to connect via HTTPS proxy. Proxy response: ' .
356
-                $response->getStatus() . ' ' . $response->getReasonPhrase()
355
+                'Failed to connect via HTTPS proxy. Proxy response: '.
356
+                $response->getStatus().' '.$response->getReasonPhrase()
357 357
             );
358 358
         }
359 359
         $this->socket = $donor->socket;
@@ -383,7 +383,7 @@  discard block
 block discarded – undo
383 383
                        // no body possible for such responses, see also request #17031
384 384
                        || HTTP_Request2::METHOD_HEAD == $this->request->getMethod()
385 385
                        || in_array($response->getStatus(), array(204, 304));
386
-        $persistent  = 'keep-alive' == strtolower($response->getHeader('connection')) ||
386
+        $persistent = 'keep-alive' == strtolower($response->getHeader('connection')) ||
387 387
                        (null === $response->getHeader('connection') &&
388 388
                         '1.1' == $response->getVersion());
389 389
         return $requestKeepAlive && $lengthKnown && $persistent;
@@ -423,7 +423,7 @@  discard block
 block discarded – undo
423 423
             $this->redirectCountdown = null;
424 424
             // Copying cURL behaviour
425 425
             throw new HTTP_Request2_MessageException(
426
-                'Maximum (' . $request->getConfig('max_redirects') . ') redirects followed',
426
+                'Maximum ('.$request->getConfig('max_redirects').') redirects followed',
427 427
                 HTTP_Request2_Exception::TOO_MANY_REDIRECTS
428 428
             );
429 429
         }
@@ -437,7 +437,7 @@  discard block
 block discarded – undo
437 437
         ) {
438 438
             $this->redirectCountdown = null;
439 439
             throw new HTTP_Request2_MessageException(
440
-                'Refusing to redirect to a non-HTTP URL ' . $redirectUrl->__toString(),
440
+                'Refusing to redirect to a non-HTTP URL '.$redirectUrl->__toString(),
441 441
                 HTTP_Request2_Exception::NON_HTTP_REDIRECT
442 442
             );
443 443
         }
@@ -492,12 +492,12 @@  discard block
 block discarded – undo
492 492
 
493 493
         $url    = $this->request->getUrl();
494 494
         $scheme = $url->getScheme();
495
-        $host   = $scheme . '://' . $url->getHost();
495
+        $host   = $scheme.'://'.$url->getHost();
496 496
         if ($port = $url->getPort()) {
497 497
             if ((0 == strcasecmp($scheme, 'http') && 80 != $port)
498 498
                 || (0 == strcasecmp($scheme, 'https') && 443 != $port)
499 499
             ) {
500
-                $host .= ':' . $port;
500
+                $host .= ':'.$port;
501 501
             }
502 502
         }
503 503
 
@@ -506,12 +506,12 @@  discard block
 block discarded – undo
506 506
             foreach (preg_split('/\\s+/', $challenge['domain']) as $prefix) {
507 507
                 // don't bother with different servers
508 508
                 if ('/' == substr($prefix, 0, 1)) {
509
-                    $prefixes[] = $host . $prefix;
509
+                    $prefixes[] = $host.$prefix;
510 510
                 }
511 511
             }
512 512
         }
513 513
         if (empty($prefixes)) {
514
-            $prefixes = array($host . '/');
514
+            $prefixes = array($host.'/');
515 515
         }
516 516
 
517 517
         $ret = true;
@@ -522,7 +522,7 @@  discard block
 block discarded – undo
522 522
                 // probably credentials are invalid
523 523
                 $ret = false;
524 524
             }
525
-            self::$challenges[$prefix] =& $challenge;
525
+            self::$challenges[$prefix] = & $challenge;
526 526
         }
527 527
         return $ret;
528 528
     }
@@ -554,8 +554,8 @@  discard block
 block discarded – undo
554 554
             return false;
555 555
         }
556 556
 
557
-        $key = 'proxy://' . $this->request->getConfig('proxy_host') .
558
-               ':' . $this->request->getConfig('proxy_port');
557
+        $key = 'proxy://'.$this->request->getConfig('proxy_host').
558
+               ':'.$this->request->getConfig('proxy_port');
559 559
 
560 560
         if (!empty(self::$challenges[$key])
561 561
             && (empty($challenge['stale']) || strcasecmp('true', $challenge['stale']))
@@ -599,14 +599,14 @@  discard block
 block discarded – undo
599 599
      */
600 600
     protected function parseDigestChallenge($headerValue)
601 601
     {
602
-        $authParam   = '(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
603
-                       self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')';
602
+        $authParam   = '('.self::REGEXP_TOKEN.')\\s*=\\s*('.
603
+                       self::REGEXP_TOKEN.'|'.self::REGEXP_QUOTED_STRING.')';
604 604
         $challenge   = "!(?<=^|\\s|,)Digest ({$authParam}\\s*(,\\s*|$))+!";
605 605
         if (!preg_match($challenge, $headerValue, $matches)) {
606 606
             return false;
607 607
         }
608 608
 
609
-        preg_match_all('!' . $authParam . '!', $matches[0], $params);
609
+        preg_match_all('!'.$authParam.'!', $matches[0], $params);
610 610
         $paramsAry   = array();
611 611
         $knownParams = array('realm', 'domain', 'nonce', 'opaque', 'stale',
612 612
                              'algorithm', 'qop');
@@ -625,14 +625,14 @@  discard block
 block discarded – undo
625 625
             && !in_array('auth', array_map('trim', explode(',', $paramsAry['qop'])))
626 626
         ) {
627 627
             throw new HTTP_Request2_NotImplementedException(
628
-                "Only 'auth' qop is currently supported in digest authentication, " .
628
+                "Only 'auth' qop is currently supported in digest authentication, ".
629 629
                 "server requested '{$paramsAry['qop']}'"
630 630
             );
631 631
         }
632 632
         // we only support algorithm=MD5
633 633
         if (!empty($paramsAry['algorithm']) && 'MD5' != $paramsAry['algorithm']) {
634 634
             throw new HTTP_Request2_NotImplementedException(
635
-                "Only 'MD5' algorithm is currently supported in digest authentication, " .
635
+                "Only 'MD5' algorithm is currently supported in digest authentication, ".
636 636
                 "server requested '{$paramsAry['algorithm']}'"
637 637
             );
638 638
         }
@@ -650,8 +650,8 @@  discard block
 block discarded – undo
650 650
      */
651 651
     protected function updateChallenge(&$challenge, $headerValue)
652 652
     {
653
-        $authParam   = '!(' . self::REGEXP_TOKEN . ')\\s*=\\s*(' .
654
-                       self::REGEXP_TOKEN . '|' . self::REGEXP_QUOTED_STRING . ')!';
653
+        $authParam   = '!('.self::REGEXP_TOKEN.')\\s*=\\s*('.
654
+                       self::REGEXP_TOKEN.'|'.self::REGEXP_QUOTED_STRING.')!';
655 655
         $paramsAry   = array();
656 656
 
657 657
         preg_match_all($authParam, $headerValue, $params);
@@ -688,33 +688,31 @@  discard block
 block discarded – undo
688 688
             $url = substr($url, 0, $q);
689 689
         }
690 690
 
691
-        $a1 = md5($user . ':' . $challenge['realm'] . ':' . $password);
692
-        $a2 = md5($this->request->getMethod() . ':' . $url);
691
+        $a1 = md5($user.':'.$challenge['realm'].':'.$password);
692
+        $a2 = md5($this->request->getMethod().':'.$url);
693 693
 
694 694
         if (empty($challenge['qop'])) {
695
-            $digest = md5($a1 . ':' . $challenge['nonce'] . ':' . $a2);
695
+            $digest = md5($a1.':'.$challenge['nonce'].':'.$a2);
696 696
         } else {
697
-            $challenge['cnonce'] = 'Req2.' . rand();
697
+            $challenge['cnonce'] = 'Req2.'.rand();
698 698
             if (empty($challenge['nc'])) {
699 699
                 $challenge['nc'] = 1;
700 700
             }
701 701
             $nc     = sprintf('%08x', $challenge['nc']++);
702 702
             $digest = md5(
703
-                $a1 . ':' . $challenge['nonce'] . ':' . $nc . ':' .
704
-                $challenge['cnonce'] . ':auth:' . $a2
703
+                $a1.':'.$challenge['nonce'].':'.$nc.':'.
704
+                $challenge['cnonce'].':auth:'.$a2
705 705
             );
706 706
         }
707
-        return 'Digest username="' . str_replace(array('\\', '"'), array('\\\\', '\\"'), $user) . '", ' .
708
-               'realm="' . $challenge['realm'] . '", ' .
709
-               'nonce="' . $challenge['nonce'] . '", ' .
710
-               'uri="' . $url . '", ' .
711
-               'response="' . $digest . '"' .
712
-               (!empty($challenge['opaque'])?
713
-                ', opaque="' . $challenge['opaque'] . '"':
714
-                '') .
715
-               (!empty($challenge['qop'])?
716
-                ', qop="auth", nc=' . $nc . ', cnonce="' . $challenge['cnonce'] . '"':
717
-                '');
707
+        return 'Digest username="'.str_replace(array('\\', '"'), array('\\\\', '\\"'), $user).'", '.
708
+               'realm="'.$challenge['realm'].'", '.
709
+               'nonce="'.$challenge['nonce'].'", '.
710
+               'uri="'.$url.'", '.
711
+               'response="'.$digest.'"'.
712
+               (!empty($challenge['opaque']) ?
713
+                ', opaque="'.$challenge['opaque'].'"' : '').
714
+               (!empty($challenge['qop']) ?
715
+                ', qop="auth", nc='.$nc.', cnonce="'.$challenge['cnonce'].'"' : '');
718 716
     }
719 717
 
720 718
     /**
@@ -733,24 +731,23 @@  discard block
 block discarded – undo
733 731
         }
734 732
         switch ($auth['scheme']) {
735 733
         case HTTP_Request2::AUTH_BASIC:
736
-            $headers['authorization'] = 'Basic ' . base64_encode(
737
-                $auth['user'] . ':' . $auth['password']
734
+            $headers['authorization'] = 'Basic '.base64_encode(
735
+                $auth['user'].':'.$auth['password']
738 736
             );
739 737
             break;
740 738
 
741 739
         case HTTP_Request2::AUTH_DIGEST:
742 740
             unset($this->serverChallenge);
743
-            $fullUrl = ('/' == $requestUrl[0])?
744
-                       $this->request->getUrl()->getScheme() . '://' .
745
-                        $requestHost . $requestUrl:
746
-                       $requestUrl;
741
+            $fullUrl = ('/' == $requestUrl[0]) ?
742
+                       $this->request->getUrl()->getScheme().'://'.
743
+                        $requestHost.$requestUrl : $requestUrl;
747 744
             foreach (array_keys(self::$challenges) as $key) {
748 745
                 if ($key == substr($fullUrl, 0, strlen($key))) {
749 746
                     $headers['authorization'] = $this->createDigestResponse(
750 747
                         $auth['user'], $auth['password'],
751 748
                         $requestUrl, self::$challenges[$key]
752 749
                     );
753
-                    $this->serverChallenge =& self::$challenges[$key];
750
+                    $this->serverChallenge = & self::$challenges[$key];
754 751
                     break;
755 752
                 }
756 753
             }
@@ -784,28 +781,28 @@  discard block
 block discarded – undo
784 781
         $password = $this->request->getConfig('proxy_password');
785 782
         switch ($this->request->getConfig('proxy_auth_scheme')) {
786 783
         case HTTP_Request2::AUTH_BASIC:
787
-            $headers['proxy-authorization'] = 'Basic ' . base64_encode(
788
-                $user . ':' . $password
784
+            $headers['proxy-authorization'] = 'Basic '.base64_encode(
785
+                $user.':'.$password
789 786
             );
790 787
             break;
791 788
 
792 789
         case HTTP_Request2::AUTH_DIGEST:
793 790
             unset($this->proxyChallenge);
794
-            $proxyUrl = 'proxy://' . $this->request->getConfig('proxy_host') .
795
-                        ':' . $this->request->getConfig('proxy_port');
791
+            $proxyUrl = 'proxy://'.$this->request->getConfig('proxy_host').
792
+                        ':'.$this->request->getConfig('proxy_port');
796 793
             if (!empty(self::$challenges[$proxyUrl])) {
797 794
                 $headers['proxy-authorization'] = $this->createDigestResponse(
798 795
                     $user, $password,
799 796
                     $requestUrl, self::$challenges[$proxyUrl]
800 797
                 );
801
-                $this->proxyChallenge =& self::$challenges[$proxyUrl];
798
+                $this->proxyChallenge = & self::$challenges[$proxyUrl];
802 799
             }
803 800
             break;
804 801
 
805 802
         default:
806 803
             throw new HTTP_Request2_NotImplementedException(
807
-                "Unknown HTTP authentication scheme '" .
808
-                $this->request->getConfig('proxy_auth_scheme') . "'"
804
+                "Unknown HTTP authentication scheme '".
805
+                $this->request->getConfig('proxy_auth_scheme')."'"
809 806
             );
810 807
         }
811 808
     }
@@ -824,9 +821,9 @@  discard block
 block discarded – undo
824 821
         $connect = HTTP_Request2::METHOD_CONNECT == $this->request->getMethod();
825 822
         $host    = $url->getHost();
826 823
 
827
-        $defaultPort = 0 == strcasecmp($url->getScheme(), 'https')? 443: 80;
824
+        $defaultPort = 0 == strcasecmp($url->getScheme(), 'https') ? 443 : 80;
828 825
         if (($port = $url->getPort()) && $port != $defaultPort || $connect) {
829
-            $host .= ':' . (empty($port)? $defaultPort: $port);
826
+            $host .= ':'.(empty($port) ? $defaultPort : $port);
830 827
         }
831 828
         // Do not overwrite explicitly set 'Host' header, see bug #16146
832 829
         if (!isset($headers['host'])) {
@@ -843,11 +840,11 @@  discard block
 block discarded – undo
843 840
             ) {
844 841
                 $requestUrl = '';
845 842
             } else {
846
-                $requestUrl = $url->getScheme() . '://' . $host;
843
+                $requestUrl = $url->getScheme().'://'.$host;
847 844
             }
848 845
             $path        = $url->getPath();
849 846
             $query       = $url->getQuery();
850
-            $requestUrl .= (empty($path)? '/': $path) . (empty($query)? '': '?' . $query);
847
+            $requestUrl .= (empty($path) ? '/' : $path).(empty($query) ? '' : '?'.$query);
851 848
         }
852 849
 
853 850
         if ('1.1' == $this->request->getConfig('protocol_version')
@@ -858,7 +855,7 @@  discard block
 block discarded – undo
858 855
         if (($jar = $this->request->getCookieJar())
859 856
             && ($cookies = $jar->getMatching($this->request->getUrl(), true))
860 857
         ) {
861
-            $headers['cookie'] = (empty($headers['cookie'])? '': $headers['cookie'] . '; ') . $cookies;
858
+            $headers['cookie'] = (empty($headers['cookie']) ? '' : $headers['cookie'].'; ').$cookies;
862 859
         }
863 860
 
864 861
         $this->addAuthorizationHeader($headers, $host, $requestUrl);
@@ -870,13 +867,13 @@  discard block
 block discarded – undo
870 867
             $this->expect100Continue = false;
871 868
         }
872 869
 
873
-        $headersStr = $this->request->getMethod() . ' ' . $requestUrl . ' HTTP/' .
874
-                      $this->request->getConfig('protocol_version') . "\r\n";
870
+        $headersStr = $this->request->getMethod().' '.$requestUrl.' HTTP/'.
871
+                      $this->request->getConfig('protocol_version')."\r\n";
875 872
         foreach ($headers as $name => $value) {
876 873
             $canonicalName = implode('-', array_map('ucfirst', explode('-', $name)));
877
-            $headersStr   .= $canonicalName . ': ' . $value . "\r\n";
874
+            $headersStr   .= $canonicalName.': '.$value."\r\n";
878 875
         }
879
-        return $headersStr . "\r\n";
876
+        return $headersStr."\r\n";
880 877
     }
881 878
 
882 879
     /**
@@ -906,14 +903,14 @@  discard block
 block discarded – undo
906 903
                 return;
907 904
             }
908 905
             // build regexp to parse the value of existing Expect header
909
-            $expectParam     = ';\s*' . self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
910
-                               . self::REGEXP_TOKEN . '|'
911
-                               . self::REGEXP_QUOTED_STRING . '))?\s*';
912
-            $expectExtension = self::REGEXP_TOKEN . '(?:\s*=\s*(?:'
913
-                               . self::REGEXP_TOKEN . '|'
914
-                               . self::REGEXP_QUOTED_STRING . ')\s*(?:'
915
-                               . $expectParam . ')*)?';
916
-            $expectItem      = '!(100-continue|' . $expectExtension . ')!A';
906
+            $expectParam     = ';\s*'.self::REGEXP_TOKEN.'(?:\s*=\s*(?:'
907
+                               . self::REGEXP_TOKEN.'|'
908
+                               . self::REGEXP_QUOTED_STRING.'))?\s*';
909
+            $expectExtension = self::REGEXP_TOKEN.'(?:\s*=\s*(?:'
910
+                               . self::REGEXP_TOKEN.'|'
911
+                               . self::REGEXP_QUOTED_STRING.')\s*(?:'
912
+                               . $expectParam.')*)?';
913
+            $expectItem = '!(100-continue|'.$expectExtension.')!A';
917 914
 
918 915
             $pos    = 0;
919 916
             $length = strlen($headers['expect']);
@@ -933,7 +930,7 @@  discard block
 block discarded – undo
933 930
                 } else {
934 931
                     $pos += strlen($m[0]);
935 932
                     if (strcasecmp('100-continue', $m[0])) {
936
-                        $expectations[]  = $m[0];
933
+                        $expectations[] = $m[0];
937 934
                     }
938 935
                 }
939 936
             }
@@ -979,7 +976,7 @@  discard block
 block discarded – undo
979 976
             if (!$chunked) {
980 977
                 $this->socket->write($str);
981 978
             } else {
982
-                $this->socket->write(dechex(strlen($str)) . "\r\n{$str}\r\n");
979
+                $this->socket->write(dechex(strlen($str))."\r\n{$str}\r\n");
983 980
             }
984 981
             // Provide the length of written string to the observer, request #7630
985 982
             $this->request->setLastEvent('sentBodyPart', strlen($str));
@@ -1048,7 +1045,7 @@  discard block
 block discarded – undo
1048 1045
             // 3. ... If a message is received with both a
1049 1046
             // Transfer-Encoding header field and a Content-Length header field,
1050 1047
             // the latter MUST be ignored.
1051
-            $toRead = ($chunked || null === $length)? null: $length;
1048
+            $toRead = ($chunked || null === $length) ? null: $length;
1052 1049
             $this->chunkLength = 0;
1053 1050
 
1054 1051
             while (!$this->socket->eof() && (is_null($toRead) || 0 < $toRead)) {
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/MultipartBody.php 2 patches
Indentation   +211 added lines, -211 removed lines patch added patch discarded remove patch
@@ -37,232 +37,232 @@
 block discarded – undo
37 37
  */
38 38
 class HTTP_Request2_MultipartBody
39 39
 {
40
-    /**
41
-     * MIME boundary
42
-     * @var  string
43
-     */
44
-    private $_boundary;
40
+	/**
41
+	 * MIME boundary
42
+	 * @var  string
43
+	 */
44
+	private $_boundary;
45 45
 
46
-    /**
47
-     * Form parameters added via {@link HTTP_Request2::addPostParameter()}
48
-     * @var  array
49
-     */
50
-    private $_params = array();
46
+	/**
47
+	 * Form parameters added via {@link HTTP_Request2::addPostParameter()}
48
+	 * @var  array
49
+	 */
50
+	private $_params = array();
51 51
 
52
-    /**
53
-     * File uploads added via {@link HTTP_Request2::addUpload()}
54
-     * @var  array
55
-     */
56
-    private $_uploads = array();
52
+	/**
53
+	 * File uploads added via {@link HTTP_Request2::addUpload()}
54
+	 * @var  array
55
+	 */
56
+	private $_uploads = array();
57 57
 
58
-    /**
59
-     * Header for parts with parameters
60
-     * @var  string
61
-     */
62
-    private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n";
58
+	/**
59
+	 * Header for parts with parameters
60
+	 * @var  string
61
+	 */
62
+	private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n";
63 63
 
64
-    /**
65
-     * Header for parts with uploads
66
-     * @var  string
67
-     */
68
-    private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n";
64
+	/**
65
+	 * Header for parts with uploads
66
+	 * @var  string
67
+	 */
68
+	private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n";
69 69
 
70
-    /**
71
-     * Current position in parameter and upload arrays
72
-     *
73
-     * First number is index of "current" part, second number is position within
74
-     * "current" part
75
-     *
76
-     * @var  array
77
-     */
78
-    private $_pos = array(0, 0);
70
+	/**
71
+	 * Current position in parameter and upload arrays
72
+	 *
73
+	 * First number is index of "current" part, second number is position within
74
+	 * "current" part
75
+	 *
76
+	 * @var  array
77
+	 */
78
+	private $_pos = array(0, 0);
79 79
 
80 80
 
81
-    /**
82
-     * Constructor. Sets the arrays with POST data.
83
-     *
84
-     * @param array $params      values of form fields set via
85
-     *                           {@link HTTP_Request2::addPostParameter()}
86
-     * @param array $uploads     file uploads set via
87
-     *                           {@link HTTP_Request2::addUpload()}
88
-     * @param bool  $useBrackets whether to append brackets to array variable names
89
-     */
90
-    public function __construct(array $params, array $uploads, $useBrackets = true)
91
-    {
92
-        $this->_params = self::_flattenArray('', $params, $useBrackets);
93
-        foreach ($uploads as $fieldName => $f) {
94
-            if (!is_array($f['fp'])) {
95
-                $this->_uploads[] = $f + array('name' => $fieldName);
96
-            } else {
97
-                for ($i = 0; $i < count($f['fp']); $i++) {
98
-                    $upload = array(
99
-                        'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
100
-                    );
101
-                    foreach (array('fp', 'filename', 'size', 'type') as $key) {
102
-                        $upload[$key] = $f[$key][$i];
103
-                    }
104
-                    $this->_uploads[] = $upload;
105
-                }
106
-            }
107
-        }
108
-    }
81
+	/**
82
+	 * Constructor. Sets the arrays with POST data.
83
+	 *
84
+	 * @param array $params      values of form fields set via
85
+	 *                           {@link HTTP_Request2::addPostParameter()}
86
+	 * @param array $uploads     file uploads set via
87
+	 *                           {@link HTTP_Request2::addUpload()}
88
+	 * @param bool  $useBrackets whether to append brackets to array variable names
89
+	 */
90
+	public function __construct(array $params, array $uploads, $useBrackets = true)
91
+	{
92
+		$this->_params = self::_flattenArray('', $params, $useBrackets);
93
+		foreach ($uploads as $fieldName => $f) {
94
+			if (!is_array($f['fp'])) {
95
+				$this->_uploads[] = $f + array('name' => $fieldName);
96
+			} else {
97
+				for ($i = 0; $i < count($f['fp']); $i++) {
98
+					$upload = array(
99
+						'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
100
+					);
101
+					foreach (array('fp', 'filename', 'size', 'type') as $key) {
102
+						$upload[$key] = $f[$key][$i];
103
+					}
104
+					$this->_uploads[] = $upload;
105
+				}
106
+			}
107
+		}
108
+	}
109 109
 
110
-    /**
111
-     * Returns the length of the body to use in Content-Length header
112
-     *
113
-     * @return   integer
114
-     */
115
-    public function getLength()
116
-    {
117
-        $boundaryLength     = strlen($this->getBoundary());
118
-        $headerParamLength  = strlen($this->_headerParam) - 4 + $boundaryLength;
119
-        $headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength;
120
-        $length             = $boundaryLength + 6;
121
-        foreach ($this->_params as $p) {
122
-            $length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2;
123
-        }
124
-        foreach ($this->_uploads as $u) {
125
-            $length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) +
126
-                       strlen($u['filename']) + $u['size'] + 2;
127
-        }
128
-        return $length;
129
-    }
110
+	/**
111
+	 * Returns the length of the body to use in Content-Length header
112
+	 *
113
+	 * @return   integer
114
+	 */
115
+	public function getLength()
116
+	{
117
+		$boundaryLength     = strlen($this->getBoundary());
118
+		$headerParamLength  = strlen($this->_headerParam) - 4 + $boundaryLength;
119
+		$headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength;
120
+		$length             = $boundaryLength + 6;
121
+		foreach ($this->_params as $p) {
122
+			$length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2;
123
+		}
124
+		foreach ($this->_uploads as $u) {
125
+			$length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) +
126
+					   strlen($u['filename']) + $u['size'] + 2;
127
+		}
128
+		return $length;
129
+	}
130 130
 
131
-    /**
132
-     * Returns the boundary to use in Content-Type header
133
-     *
134
-     * @return   string
135
-     */
136
-    public function getBoundary()
137
-    {
138
-        if (empty($this->_boundary)) {
139
-            $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
140
-        }
141
-        return $this->_boundary;
142
-    }
131
+	/**
132
+	 * Returns the boundary to use in Content-Type header
133
+	 *
134
+	 * @return   string
135
+	 */
136
+	public function getBoundary()
137
+	{
138
+		if (empty($this->_boundary)) {
139
+			$this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
140
+		}
141
+		return $this->_boundary;
142
+	}
143 143
 
144
-    /**
145
-     * Returns next chunk of request body
146
-     *
147
-     * @param integer $length Number of bytes to read
148
-     *
149
-     * @return   string  Up to $length bytes of data, empty string if at end
150
-     * @throws   HTTP_Request2_LogicException
151
-     */
152
-    public function read($length)
153
-    {
154
-        $ret         = '';
155
-        $boundary    = $this->getBoundary();
156
-        $paramCount  = count($this->_params);
157
-        $uploadCount = count($this->_uploads);
158
-        while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) {
159
-            $oldLength = $length;
160
-            if ($this->_pos[0] < $paramCount) {
161
-                $param = sprintf(
162
-                    $this->_headerParam, $boundary, $this->_params[$this->_pos[0]][0]
163
-                ) . $this->_params[$this->_pos[0]][1] . "\r\n";
164
-                $ret    .= substr($param, $this->_pos[1], $length);
165
-                $length -= min(strlen($param) - $this->_pos[1], $length);
144
+	/**
145
+	 * Returns next chunk of request body
146
+	 *
147
+	 * @param integer $length Number of bytes to read
148
+	 *
149
+	 * @return   string  Up to $length bytes of data, empty string if at end
150
+	 * @throws   HTTP_Request2_LogicException
151
+	 */
152
+	public function read($length)
153
+	{
154
+		$ret         = '';
155
+		$boundary    = $this->getBoundary();
156
+		$paramCount  = count($this->_params);
157
+		$uploadCount = count($this->_uploads);
158
+		while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) {
159
+			$oldLength = $length;
160
+			if ($this->_pos[0] < $paramCount) {
161
+				$param = sprintf(
162
+					$this->_headerParam, $boundary, $this->_params[$this->_pos[0]][0]
163
+				) . $this->_params[$this->_pos[0]][1] . "\r\n";
164
+				$ret    .= substr($param, $this->_pos[1], $length);
165
+				$length -= min(strlen($param) - $this->_pos[1], $length);
166 166
 
167
-            } elseif ($this->_pos[0] < $paramCount + $uploadCount) {
168
-                $pos    = $this->_pos[0] - $paramCount;
169
-                $header = sprintf(
170
-                    $this->_headerUpload, $boundary, $this->_uploads[$pos]['name'],
171
-                    $this->_uploads[$pos]['filename'], $this->_uploads[$pos]['type']
172
-                );
173
-                if ($this->_pos[1] < strlen($header)) {
174
-                    $ret    .= substr($header, $this->_pos[1], $length);
175
-                    $length -= min(strlen($header) - $this->_pos[1], $length);
176
-                }
177
-                $filePos  = max(0, $this->_pos[1] - strlen($header));
178
-                if ($filePos < $this->_uploads[$pos]['size']) {
179
-                    while ($length > 0 && !feof($this->_uploads[$pos]['fp'])) {
180
-                        if (false === ($chunk = fread($this->_uploads[$pos]['fp'], $length))) {
181
-                            throw new HTTP_Request2_LogicException(
182
-                                'Failed reading file upload', HTTP_Request2_Exception::READ_ERROR
183
-                            );
184
-                        }
185
-                        $ret    .= $chunk;
186
-                        $length -= strlen($chunk);
187
-                    }
188
-                }
189
-                if ($length > 0) {
190
-                    $start   = $this->_pos[1] + ($oldLength - $length) -
191
-                               strlen($header) - $this->_uploads[$pos]['size'];
192
-                    $ret    .= substr("\r\n", $start, $length);
193
-                    $length -= min(2 - $start, $length);
194
-                }
167
+			} elseif ($this->_pos[0] < $paramCount + $uploadCount) {
168
+				$pos    = $this->_pos[0] - $paramCount;
169
+				$header = sprintf(
170
+					$this->_headerUpload, $boundary, $this->_uploads[$pos]['name'],
171
+					$this->_uploads[$pos]['filename'], $this->_uploads[$pos]['type']
172
+				);
173
+				if ($this->_pos[1] < strlen($header)) {
174
+					$ret    .= substr($header, $this->_pos[1], $length);
175
+					$length -= min(strlen($header) - $this->_pos[1], $length);
176
+				}
177
+				$filePos  = max(0, $this->_pos[1] - strlen($header));
178
+				if ($filePos < $this->_uploads[$pos]['size']) {
179
+					while ($length > 0 && !feof($this->_uploads[$pos]['fp'])) {
180
+						if (false === ($chunk = fread($this->_uploads[$pos]['fp'], $length))) {
181
+							throw new HTTP_Request2_LogicException(
182
+								'Failed reading file upload', HTTP_Request2_Exception::READ_ERROR
183
+							);
184
+						}
185
+						$ret    .= $chunk;
186
+						$length -= strlen($chunk);
187
+					}
188
+				}
189
+				if ($length > 0) {
190
+					$start   = $this->_pos[1] + ($oldLength - $length) -
191
+							   strlen($header) - $this->_uploads[$pos]['size'];
192
+					$ret    .= substr("\r\n", $start, $length);
193
+					$length -= min(2 - $start, $length);
194
+				}
195 195
 
196
-            } else {
197
-                $closing  = '--' . $boundary . "--\r\n";
198
-                $ret     .= substr($closing, $this->_pos[1], $length);
199
-                $length  -= min(strlen($closing) - $this->_pos[1], $length);
200
-            }
201
-            if ($length > 0) {
202
-                $this->_pos     = array($this->_pos[0] + 1, 0);
203
-            } else {
204
-                $this->_pos[1] += $oldLength;
205
-            }
206
-        }
207
-        return $ret;
208
-    }
196
+			} else {
197
+				$closing  = '--' . $boundary . "--\r\n";
198
+				$ret     .= substr($closing, $this->_pos[1], $length);
199
+				$length  -= min(strlen($closing) - $this->_pos[1], $length);
200
+			}
201
+			if ($length > 0) {
202
+				$this->_pos     = array($this->_pos[0] + 1, 0);
203
+			} else {
204
+				$this->_pos[1] += $oldLength;
205
+			}
206
+		}
207
+		return $ret;
208
+	}
209 209
 
210
-    /**
211
-     * Sets the current position to the start of the body
212
-     *
213
-     * This allows reusing the same body in another request
214
-     */
215
-    public function rewind()
216
-    {
217
-        $this->_pos = array(0, 0);
218
-        foreach ($this->_uploads as $u) {
219
-            rewind($u['fp']);
220
-        }
221
-    }
210
+	/**
211
+	 * Sets the current position to the start of the body
212
+	 *
213
+	 * This allows reusing the same body in another request
214
+	 */
215
+	public function rewind()
216
+	{
217
+		$this->_pos = array(0, 0);
218
+		foreach ($this->_uploads as $u) {
219
+			rewind($u['fp']);
220
+		}
221
+	}
222 222
 
223
-    /**
224
-     * Returns the body as string
225
-     *
226
-     * Note that it reads all file uploads into memory so it is a good idea not
227
-     * to use this method with large file uploads and rely on read() instead.
228
-     *
229
-     * @return   string
230
-     */
231
-    public function __toString()
232
-    {
233
-        $this->rewind();
234
-        return $this->read($this->getLength());
235
-    }
223
+	/**
224
+	 * Returns the body as string
225
+	 *
226
+	 * Note that it reads all file uploads into memory so it is a good idea not
227
+	 * to use this method with large file uploads and rely on read() instead.
228
+	 *
229
+	 * @return   string
230
+	 */
231
+	public function __toString()
232
+	{
233
+		$this->rewind();
234
+		return $this->read($this->getLength());
235
+	}
236 236
 
237 237
 
238
-    /**
239
-     * Helper function to change the (probably multidimensional) associative array
240
-     * into the simple one.
241
-     *
242
-     * @param string $name        name for item
243
-     * @param mixed  $values      item's values
244
-     * @param bool   $useBrackets whether to append [] to array variables' names
245
-     *
246
-     * @return   array   array with the following items: array('item name', 'item value');
247
-     */
248
-    private static function _flattenArray($name, $values, $useBrackets)
249
-    {
250
-        if (!is_array($values)) {
251
-            return array(array($name, $values));
252
-        } else {
253
-            $ret = array();
254
-            foreach ($values as $k => $v) {
255
-                if (empty($name)) {
256
-                    $newName = $k;
257
-                } elseif ($useBrackets) {
258
-                    $newName = $name . '[' . $k . ']';
259
-                } else {
260
-                    $newName = $name;
261
-                }
262
-                $ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets));
263
-            }
264
-            return $ret;
265
-        }
266
-    }
238
+	/**
239
+	 * Helper function to change the (probably multidimensional) associative array
240
+	 * into the simple one.
241
+	 *
242
+	 * @param string $name        name for item
243
+	 * @param mixed  $values      item's values
244
+	 * @param bool   $useBrackets whether to append [] to array variables' names
245
+	 *
246
+	 * @return   array   array with the following items: array('item name', 'item value');
247
+	 */
248
+	private static function _flattenArray($name, $values, $useBrackets)
249
+	{
250
+		if (!is_array($values)) {
251
+			return array(array($name, $values));
252
+		} else {
253
+			$ret = array();
254
+			foreach ($values as $k => $v) {
255
+				if (empty($name)) {
256
+					$newName = $k;
257
+				} elseif ($useBrackets) {
258
+					$newName = $name . '[' . $k . ']';
259
+				} else {
260
+					$newName = $name;
261
+				}
262
+				$ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets));
263
+			}
264
+			return $ret;
265
+		}
266
+	}
267 267
 }
268 268
 ?>
Please login to merge, or discard this patch.
Spacing   +6 added lines, -6 removed lines patch added patch discarded remove patch
@@ -96,7 +96,7 @@  discard block
 block discarded – undo
96 96
             } else {
97 97
                 for ($i = 0; $i < count($f['fp']); $i++) {
98 98
                     $upload = array(
99
-                        'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
99
+                        'name' => ($useBrackets ? $fieldName.'['.$i.']' : $fieldName)
100 100
                     );
101 101
                     foreach (array('fp', 'filename', 'size', 'type') as $key) {
102 102
                         $upload[$key] = $f[$key][$i];
@@ -136,7 +136,7 @@  discard block
 block discarded – undo
136 136
     public function getBoundary()
137 137
     {
138 138
         if (empty($this->_boundary)) {
139
-            $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
139
+            $this->_boundary = '--'.md5('PEAR-HTTP_Request2-'.microtime());
140 140
         }
141 141
         return $this->_boundary;
142 142
     }
@@ -160,7 +160,7 @@  discard block
 block discarded – undo
160 160
             if ($this->_pos[0] < $paramCount) {
161 161
                 $param = sprintf(
162 162
                     $this->_headerParam, $boundary, $this->_params[$this->_pos[0]][0]
163
-                ) . $this->_params[$this->_pos[0]][1] . "\r\n";
163
+                ).$this->_params[$this->_pos[0]][1]."\r\n";
164 164
                 $ret    .= substr($param, $this->_pos[1], $length);
165 165
                 $length -= min(strlen($param) - $this->_pos[1], $length);
166 166
 
@@ -174,7 +174,7 @@  discard block
 block discarded – undo
174 174
                     $ret    .= substr($header, $this->_pos[1], $length);
175 175
                     $length -= min(strlen($header) - $this->_pos[1], $length);
176 176
                 }
177
-                $filePos  = max(0, $this->_pos[1] - strlen($header));
177
+                $filePos = max(0, $this->_pos[1] - strlen($header));
178 178
                 if ($filePos < $this->_uploads[$pos]['size']) {
179 179
                     while ($length > 0 && !feof($this->_uploads[$pos]['fp'])) {
180 180
                         if (false === ($chunk = fread($this->_uploads[$pos]['fp'], $length))) {
@@ -194,7 +194,7 @@  discard block
 block discarded – undo
194 194
                 }
195 195
 
196 196
             } else {
197
-                $closing  = '--' . $boundary . "--\r\n";
197
+                $closing  = '--'.$boundary."--\r\n";
198 198
                 $ret     .= substr($closing, $this->_pos[1], $length);
199 199
                 $length  -= min(strlen($closing) - $this->_pos[1], $length);
200 200
             }
@@ -255,7 +255,7 @@  discard block
 block discarded – undo
255 255
                 if (empty($name)) {
256 256
                     $newName = $k;
257 257
                 } elseif ($useBrackets) {
258
-                    $newName = $name . '[' . $k . ']';
258
+                    $newName = $name.'['.$k.']';
259 259
                 } else {
260 260
                     $newName = $name;
261 261
                 }
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/Observer/Log.php 3 patches
Switch Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -134,36 +134,36 @@
 block discarded – undo
134 134
         }
135 135
 
136 136
         switch ($event['name']) {
137
-        case 'connect':
138
-            $this->log('* Connected to ' . $event['data']);
139
-            break;
140
-        case 'sentHeaders':
141
-            $headers = explode("\r\n", $event['data']);
142
-            array_pop($headers);
143
-            foreach ($headers as $header) {
144
-                $this->log('> ' . $header);
145
-            }
146
-            break;
147
-        case 'sentBody':
148
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
149
-            break;
150
-        case 'receivedHeaders':
151
-            $this->log(sprintf(
152
-                '< HTTP/%s %s %s', $event['data']->getVersion(),
153
-                $event['data']->getStatus(), $event['data']->getReasonPhrase()
154
-            ));
155
-            $headers = $event['data']->getHeader();
156
-            foreach ($headers as $key => $val) {
157
-                $this->log('< ' . $key . ': ' . $val);
158
-            }
159
-            $this->log('< ');
160
-            break;
161
-        case 'receivedBody':
162
-            $this->log($event['data']->getBody());
163
-            break;
164
-        case 'disconnect':
165
-            $this->log('* Disconnected');
166
-            break;
137
+        	case 'connect':
138
+            	$this->log('* Connected to ' . $event['data']);
139
+            	break;
140
+        	case 'sentHeaders':
141
+            	$headers = explode("\r\n", $event['data']);
142
+            	array_pop($headers);
143
+            	foreach ($headers as $header) {
144
+                	$this->log('> ' . $header);
145
+            	}
146
+            	break;
147
+        	case 'sentBody':
148
+            	$this->log('> ' . $event['data'] . ' byte(s) sent');
149
+            	break;
150
+        	case 'receivedHeaders':
151
+            	$this->log(sprintf(
152
+                	'< HTTP/%s %s %s', $event['data']->getVersion(),
153
+                	$event['data']->getStatus(), $event['data']->getReasonPhrase()
154
+            	));
155
+            	$headers = $event['data']->getHeader();
156
+            	foreach ($headers as $key => $val) {
157
+                	$this->log('< ' . $key . ': ' . $val);
158
+            	}
159
+            	$this->log('< ');
160
+            	break;
161
+        	case 'receivedBody':
162
+            	$this->log($event['data']->getBody());
163
+            	break;
164
+        	case 'disconnect':
165
+            	$this->log('* Disconnected');
166
+            	break;
167 167
         }
168 168
     }
169 169
 
Please login to merge, or discard this patch.
Indentation   +108 added lines, -108 removed lines patch added patch discarded remove patch
@@ -69,124 +69,124 @@
 block discarded – undo
69 69
  */
70 70
 class HTTP_Request2_Observer_Log implements SplObserver
71 71
 {
72
-    // properties {{{
72
+	// properties {{{
73 73
 
74
-    /**
75
-     * The log target, it can be a a resource or a PEAR Log instance.
76
-     *
77
-     * @var resource|Log $target
78
-     */
79
-    protected $target = null;
74
+	/**
75
+	 * The log target, it can be a a resource or a PEAR Log instance.
76
+	 *
77
+	 * @var resource|Log $target
78
+	 */
79
+	protected $target = null;
80 80
 
81
-    /**
82
-     * The events to log.
83
-     *
84
-     * @var array $events
85
-     */
86
-    public $events = array(
87
-        'connect',
88
-        'sentHeaders',
89
-        'sentBody',
90
-        'receivedHeaders',
91
-        'receivedBody',
92
-        'disconnect',
93
-    );
81
+	/**
82
+	 * The events to log.
83
+	 *
84
+	 * @var array $events
85
+	 */
86
+	public $events = array(
87
+		'connect',
88
+		'sentHeaders',
89
+		'sentBody',
90
+		'receivedHeaders',
91
+		'receivedBody',
92
+		'disconnect',
93
+	);
94 94
 
95
-    // }}}
96
-    // __construct() {{{
95
+	// }}}
96
+	// __construct() {{{
97 97
 
98
-    /**
99
-     * Constructor.
100
-     *
101
-     * @param mixed $target Can be a file path (default: php://output), a resource,
102
-     *                      or an instance of the PEAR Log class.
103
-     * @param array $events Array of events to listen to (default: all events)
104
-     *
105
-     * @return void
106
-     */
107
-    public function __construct($target = 'php://output', array $events = array())
108
-    {
109
-        if (!empty($events)) {
110
-            $this->events = $events;
111
-        }
112
-        if (is_resource($target) || $target instanceof Log) {
113
-            $this->target = $target;
114
-        } elseif (false === ($this->target = @fopen($target, 'ab'))) {
115
-            throw new HTTP_Request2_Exception("Unable to open '{$target}'");
116
-        }
117
-    }
98
+	/**
99
+	 * Constructor.
100
+	 *
101
+	 * @param mixed $target Can be a file path (default: php://output), a resource,
102
+	 *                      or an instance of the PEAR Log class.
103
+	 * @param array $events Array of events to listen to (default: all events)
104
+	 *
105
+	 * @return void
106
+	 */
107
+	public function __construct($target = 'php://output', array $events = array())
108
+	{
109
+		if (!empty($events)) {
110
+			$this->events = $events;
111
+		}
112
+		if (is_resource($target) || $target instanceof Log) {
113
+			$this->target = $target;
114
+		} elseif (false === ($this->target = @fopen($target, 'ab'))) {
115
+			throw new HTTP_Request2_Exception("Unable to open '{$target}'");
116
+		}
117
+	}
118 118
 
119
-    // }}}
120
-    // update() {{{
119
+	// }}}
120
+	// update() {{{
121 121
 
122
-    /**
123
-     * Called when the request notifies us of an event.
124
-     *
125
-     * @param HTTP_Request2 $subject The HTTP_Request2 instance
126
-     *
127
-     * @return void
128
-     */
129
-    public function update(SplSubject $subject)
130
-    {
131
-        $event = $subject->getLastEvent();
132
-        if (!in_array($event['name'], $this->events)) {
133
-            return;
134
-        }
122
+	/**
123
+	 * Called when the request notifies us of an event.
124
+	 *
125
+	 * @param HTTP_Request2 $subject The HTTP_Request2 instance
126
+	 *
127
+	 * @return void
128
+	 */
129
+	public function update(SplSubject $subject)
130
+	{
131
+		$event = $subject->getLastEvent();
132
+		if (!in_array($event['name'], $this->events)) {
133
+			return;
134
+		}
135 135
 
136
-        switch ($event['name']) {
137
-        case 'connect':
138
-            $this->log('* Connected to ' . $event['data']);
139
-            break;
140
-        case 'sentHeaders':
141
-            $headers = explode("\r\n", $event['data']);
142
-            array_pop($headers);
143
-            foreach ($headers as $header) {
144
-                $this->log('> ' . $header);
145
-            }
146
-            break;
147
-        case 'sentBody':
148
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
149
-            break;
150
-        case 'receivedHeaders':
151
-            $this->log(sprintf(
152
-                '< HTTP/%s %s %s', $event['data']->getVersion(),
153
-                $event['data']->getStatus(), $event['data']->getReasonPhrase()
154
-            ));
155
-            $headers = $event['data']->getHeader();
156
-            foreach ($headers as $key => $val) {
157
-                $this->log('< ' . $key . ': ' . $val);
158
-            }
159
-            $this->log('< ');
160
-            break;
161
-        case 'receivedBody':
162
-            $this->log($event['data']->getBody());
163
-            break;
164
-        case 'disconnect':
165
-            $this->log('* Disconnected');
166
-            break;
167
-        }
168
-    }
136
+		switch ($event['name']) {
137
+		case 'connect':
138
+			$this->log('* Connected to ' . $event['data']);
139
+			break;
140
+		case 'sentHeaders':
141
+			$headers = explode("\r\n", $event['data']);
142
+			array_pop($headers);
143
+			foreach ($headers as $header) {
144
+				$this->log('> ' . $header);
145
+			}
146
+			break;
147
+		case 'sentBody':
148
+			$this->log('> ' . $event['data'] . ' byte(s) sent');
149
+			break;
150
+		case 'receivedHeaders':
151
+			$this->log(sprintf(
152
+				'< HTTP/%s %s %s', $event['data']->getVersion(),
153
+				$event['data']->getStatus(), $event['data']->getReasonPhrase()
154
+			));
155
+			$headers = $event['data']->getHeader();
156
+			foreach ($headers as $key => $val) {
157
+				$this->log('< ' . $key . ': ' . $val);
158
+			}
159
+			$this->log('< ');
160
+			break;
161
+		case 'receivedBody':
162
+			$this->log($event['data']->getBody());
163
+			break;
164
+		case 'disconnect':
165
+			$this->log('* Disconnected');
166
+			break;
167
+		}
168
+	}
169 169
 
170
-    // }}}
171
-    // log() {{{
170
+	// }}}
171
+	// log() {{{
172 172
 
173
-    /**
174
-     * Logs the given message to the configured target.
175
-     *
176
-     * @param string $message Message to display
177
-     *
178
-     * @return void
179
-     */
180
-    protected function log($message)
181
-    {
182
-        if ($this->target instanceof Log) {
183
-            $this->target->debug($message);
184
-        } elseif (is_resource($this->target)) {
185
-            fwrite($this->target, $message . "\r\n");
186
-        }
187
-    }
173
+	/**
174
+	 * Logs the given message to the configured target.
175
+	 *
176
+	 * @param string $message Message to display
177
+	 *
178
+	 * @return void
179
+	 */
180
+	protected function log($message)
181
+	{
182
+		if ($this->target instanceof Log) {
183
+			$this->target->debug($message);
184
+		} elseif (is_resource($this->target)) {
185
+			fwrite($this->target, $message . "\r\n");
186
+		}
187
+	}
188 188
 
189
-    // }}}
189
+	// }}}
190 190
 }
191 191
 
192 192
 ?>
193 193
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -135,17 +135,17 @@  discard block
 block discarded – undo
135 135
 
136 136
         switch ($event['name']) {
137 137
         case 'connect':
138
-            $this->log('* Connected to ' . $event['data']);
138
+            $this->log('* Connected to '.$event['data']);
139 139
             break;
140 140
         case 'sentHeaders':
141 141
             $headers = explode("\r\n", $event['data']);
142 142
             array_pop($headers);
143 143
             foreach ($headers as $header) {
144
-                $this->log('> ' . $header);
144
+                $this->log('> '.$header);
145 145
             }
146 146
             break;
147 147
         case 'sentBody':
148
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
148
+            $this->log('> '.$event['data'].' byte(s) sent');
149 149
             break;
150 150
         case 'receivedHeaders':
151 151
             $this->log(sprintf(
@@ -154,7 +154,7 @@  discard block
 block discarded – undo
154 154
             ));
155 155
             $headers = $event['data']->getHeader();
156 156
             foreach ($headers as $key => $val) {
157
-                $this->log('< ' . $key . ': ' . $val);
157
+                $this->log('< '.$key.': '.$val);
158 158
             }
159 159
             $this->log('< ');
160 160
             break;
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
         if ($this->target instanceof Log) {
183 183
             $this->target->debug($message);
184 184
         } elseif (is_resource($this->target)) {
185
-            fwrite($this->target, $message . "\r\n");
185
+            fwrite($this->target, $message."\r\n");
186 186
         }
187 187
     }
188 188
 
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/Response.php 3 patches
Indentation   +574 added lines, -574 removed lines patch added patch discarded remove patch
@@ -53,579 +53,579 @@
 block discarded – undo
53 53
  */
54 54
 class HTTP_Request2_Response
55 55
 {
56
-    /**
57
-     * HTTP protocol version (e.g. 1.0, 1.1)
58
-     * @var  string
59
-     */
60
-    protected $version;
61
-
62
-    /**
63
-     * Status code
64
-     * @var  integer
65
-     * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
66
-     */
67
-    protected $code;
68
-
69
-    /**
70
-     * Reason phrase
71
-     * @var  string
72
-     * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
73
-     */
74
-    protected $reasonPhrase;
75
-
76
-    /**
77
-     * Effective URL (may be different from original request URL in case of redirects)
78
-     * @var  string
79
-     */
80
-    protected $effectiveUrl;
81
-
82
-    /**
83
-     * Associative array of response headers
84
-     * @var  array
85
-     */
86
-    protected $headers = array();
87
-
88
-    /**
89
-     * Cookies set in the response
90
-     * @var  array
91
-     */
92
-    protected $cookies = array();
93
-
94
-    /**
95
-     * Name of last header processed by parseHederLine()
96
-     *
97
-     * Used to handle the headers that span multiple lines
98
-     *
99
-     * @var  string
100
-     */
101
-    protected $lastHeader = null;
102
-
103
-    /**
104
-     * Response body
105
-     * @var  string
106
-     */
107
-    protected $body = '';
108
-
109
-    /**
110
-     * Whether the body is still encoded by Content-Encoding
111
-     *
112
-     * cURL provides the decoded body to the callback; if we are reading from
113
-     * socket the body is still gzipped / deflated
114
-     *
115
-     * @var  bool
116
-     */
117
-    protected $bodyEncoded;
118
-
119
-    /**
120
-     * Associative array of HTTP status code / reason phrase.
121
-     *
122
-     * @var  array
123
-     * @link http://tools.ietf.org/html/rfc2616#section-10
124
-     */
125
-    protected static $phrases = array(
126
-
127
-        // 1xx: Informational - Request received, continuing process
128
-        100 => 'Continue',
129
-        101 => 'Switching Protocols',
130
-
131
-        // 2xx: Success - The action was successfully received, understood and
132
-        // accepted
133
-        200 => 'OK',
134
-        201 => 'Created',
135
-        202 => 'Accepted',
136
-        203 => 'Non-Authoritative Information',
137
-        204 => 'No Content',
138
-        205 => 'Reset Content',
139
-        206 => 'Partial Content',
140
-
141
-        // 3xx: Redirection - Further action must be taken in order to complete
142
-        // the request
143
-        300 => 'Multiple Choices',
144
-        301 => 'Moved Permanently',
145
-        302 => 'Found',  // 1.1
146
-        303 => 'See Other',
147
-        304 => 'Not Modified',
148
-        305 => 'Use Proxy',
149
-        307 => 'Temporary Redirect',
150
-
151
-        // 4xx: Client Error - The request contains bad syntax or cannot be
152
-        // fulfilled
153
-        400 => 'Bad Request',
154
-        401 => 'Unauthorized',
155
-        402 => 'Payment Required',
156
-        403 => 'Forbidden',
157
-        404 => 'Not Found',
158
-        405 => 'Method Not Allowed',
159
-        406 => 'Not Acceptable',
160
-        407 => 'Proxy Authentication Required',
161
-        408 => 'Request Timeout',
162
-        409 => 'Conflict',
163
-        410 => 'Gone',
164
-        411 => 'Length Required',
165
-        412 => 'Precondition Failed',
166
-        413 => 'Request Entity Too Large',
167
-        414 => 'Request-URI Too Long',
168
-        415 => 'Unsupported Media Type',
169
-        416 => 'Requested Range Not Satisfiable',
170
-        417 => 'Expectation Failed',
171
-
172
-        // 5xx: Server Error - The server failed to fulfill an apparently
173
-        // valid request
174
-        500 => 'Internal Server Error',
175
-        501 => 'Not Implemented',
176
-        502 => 'Bad Gateway',
177
-        503 => 'Service Unavailable',
178
-        504 => 'Gateway Timeout',
179
-        505 => 'HTTP Version Not Supported',
180
-        509 => 'Bandwidth Limit Exceeded',
181
-
182
-    );
183
-
184
-    /**
185
-     * Returns the default reason phrase for the given code or all reason phrases
186
-     *
187
-     * @param int $code Response code
188
-     *
189
-     * @return string|array|null Default reason phrase for $code if $code is given
190
-     *                           (null if no phrase is available), array of all
191
-     *                           reason phrases if $code is null
192
-     * @link   http://pear.php.net/bugs/18716
193
-     */
194
-    public static function getDefaultReasonPhrase($code = null)
195
-    {
196
-        if (null === $code) {
197
-            return self::$phrases;
198
-        } else {
199
-            return isset(self::$phrases[$code]) ? self::$phrases[$code] : null;
200
-        }
201
-    }
202
-
203
-    /**
204
-     * Constructor, parses the response status line
205
-     *
206
-     * @param string $statusLine   Response status line (e.g. "HTTP/1.1 200 OK")
207
-     * @param bool   $bodyEncoded  Whether body is still encoded by Content-Encoding
208
-     * @param string $effectiveUrl Effective URL of the response
209
-     *
210
-     * @throws   HTTP_Request2_MessageException if status line is invalid according to spec
211
-     */
212
-    public function __construct($statusLine, $bodyEncoded = true, $effectiveUrl = null)
213
-    {
214
-        if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) {
215
-            throw new HTTP_Request2_MessageException(
216
-                "Malformed response: {$statusLine}",
217
-                HTTP_Request2_Exception::MALFORMED_RESPONSE
218
-            );
219
-        }
220
-        $this->version      = $m[1];
221
-        $this->code         = intval($m[2]);
222
-        $this->reasonPhrase = !empty($m[3]) ? trim($m[3]) : self::getDefaultReasonPhrase($this->code);
223
-        $this->bodyEncoded  = (bool)$bodyEncoded;
224
-        $this->effectiveUrl = (string)$effectiveUrl;
225
-    }
226
-
227
-    /**
228
-     * Parses the line from HTTP response filling $headers array
229
-     *
230
-     * The method should be called after reading the line from socket or receiving
231
-     * it into cURL callback. Passing an empty string here indicates the end of
232
-     * response headers and triggers additional processing, so be sure to pass an
233
-     * empty string in the end.
234
-     *
235
-     * @param string $headerLine Line from HTTP response
236
-     */
237
-    public function parseHeaderLine($headerLine)
238
-    {
239
-        $headerLine = trim($headerLine, "\r\n");
240
-
241
-        if ('' == $headerLine) {
242
-            // empty string signals the end of headers, process the received ones
243
-            if (!empty($this->headers['set-cookie'])) {
244
-                $cookies = is_array($this->headers['set-cookie'])?
245
-                           $this->headers['set-cookie']:
246
-                           array($this->headers['set-cookie']);
247
-                foreach ($cookies as $cookieString) {
248
-                    $this->parseCookie($cookieString);
249
-                }
250
-                unset($this->headers['set-cookie']);
251
-            }
252
-            foreach (array_keys($this->headers) as $k) {
253
-                if (is_array($this->headers[$k])) {
254
-                    $this->headers[$k] = implode(', ', $this->headers[$k]);
255
-                }
256
-            }
257
-
258
-        } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) {
259
-            // string of the form header-name: header value
260
-            $name  = strtolower($m[1]);
261
-            $value = trim($m[2]);
262
-            if (empty($this->headers[$name])) {
263
-                $this->headers[$name] = $value;
264
-            } else {
265
-                if (!is_array($this->headers[$name])) {
266
-                    $this->headers[$name] = array($this->headers[$name]);
267
-                }
268
-                $this->headers[$name][] = $value;
269
-            }
270
-            $this->lastHeader = $name;
271
-
272
-        } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
273
-            // continuation of a previous header
274
-            if (!is_array($this->headers[$this->lastHeader])) {
275
-                $this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
276
-            } else {
277
-                $key = count($this->headers[$this->lastHeader]) - 1;
278
-                $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
279
-            }
280
-        }
281
-    }
282
-
283
-    /**
284
-     * Parses a Set-Cookie header to fill $cookies array
285
-     *
286
-     * @param string $cookieString value of Set-Cookie header
287
-     *
288
-     * @link     http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
289
-     */
290
-    protected function parseCookie($cookieString)
291
-    {
292
-        $cookie = array(
293
-            'expires' => null,
294
-            'domain'  => null,
295
-            'path'    => null,
296
-            'secure'  => false
297
-        );
298
-
299
-        if (!strpos($cookieString, ';')) {
300
-            // Only a name=value pair
301
-            $pos = strpos($cookieString, '=');
302
-            $cookie['name']  = trim(substr($cookieString, 0, $pos));
303
-            $cookie['value'] = trim(substr($cookieString, $pos + 1));
304
-
305
-        } else {
306
-            // Some optional parameters are supplied
307
-            $elements = explode(';', $cookieString);
308
-            $pos = strpos($elements[0], '=');
309
-            $cookie['name']  = trim(substr($elements[0], 0, $pos));
310
-            $cookie['value'] = trim(substr($elements[0], $pos + 1));
311
-
312
-            for ($i = 1; $i < count($elements); $i++) {
313
-                if (false === strpos($elements[$i], '=')) {
314
-                    $elName  = trim($elements[$i]);
315
-                    $elValue = null;
316
-                } else {
317
-                    list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i]));
318
-                }
319
-                $elName = strtolower($elName);
320
-                if ('secure' == $elName) {
321
-                    $cookie['secure'] = true;
322
-                } elseif ('expires' == $elName) {
323
-                    $cookie['expires'] = str_replace('"', '', $elValue);
324
-                } elseif ('path' == $elName || 'domain' == $elName) {
325
-                    $cookie[$elName] = urldecode($elValue);
326
-                } else {
327
-                    $cookie[$elName] = $elValue;
328
-                }
329
-            }
330
-        }
331
-        $this->cookies[] = $cookie;
332
-    }
333
-
334
-    /**
335
-     * Appends a string to the response body
336
-     *
337
-     * @param string $bodyChunk part of response body
338
-     */
339
-    public function appendBody($bodyChunk)
340
-    {
341
-        $this->body .= $bodyChunk;
342
-    }
343
-
344
-    /**
345
-     * Returns the effective URL of the response
346
-     *
347
-     * This may be different from the request URL if redirects were followed.
348
-     *
349
-     * @return string
350
-     * @link   http://pear.php.net/bugs/bug.php?id=18412
351
-     */
352
-    public function getEffectiveUrl()
353
-    {
354
-        return $this->effectiveUrl;
355
-    }
356
-
357
-    /**
358
-     * Returns the status code
359
-     *
360
-     * @return   integer
361
-     */
362
-    public function getStatus()
363
-    {
364
-        return $this->code;
365
-    }
366
-
367
-    /**
368
-     * Returns the reason phrase
369
-     *
370
-     * @return   string
371
-     */
372
-    public function getReasonPhrase()
373
-    {
374
-        return $this->reasonPhrase;
375
-    }
376
-
377
-    /**
378
-     * Whether response is a redirect that can be automatically handled by HTTP_Request2
379
-     *
380
-     * @return   bool
381
-     */
382
-    public function isRedirect()
383
-    {
384
-        return in_array($this->code, array(300, 301, 302, 303, 307))
385
-               && isset($this->headers['location']);
386
-    }
387
-
388
-    /**
389
-     * Returns either the named header or all response headers
390
-     *
391
-     * @param string $headerName Name of header to return
392
-     *
393
-     * @return   string|array    Value of $headerName header (null if header is
394
-     *                           not present), array of all response headers if
395
-     *                           $headerName is null
396
-     */
397
-    public function getHeader($headerName = null)
398
-    {
399
-        if (null === $headerName) {
400
-            return $this->headers;
401
-        } else {
402
-            $headerName = strtolower($headerName);
403
-            return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
404
-        }
405
-    }
406
-
407
-    /**
408
-     * Returns cookies set in response
409
-     *
410
-     * @return   array
411
-     */
412
-    public function getCookies()
413
-    {
414
-        return $this->cookies;
415
-    }
416
-
417
-    /**
418
-     * Returns the body of the response
419
-     *
420
-     * @return   string
421
-     * @throws   HTTP_Request2_Exception if body cannot be decoded
422
-     */
423
-    public function getBody()
424
-    {
425
-        if (0 == strlen($this->body) || !$this->bodyEncoded
426
-            || !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate'))
427
-        ) {
428
-            return $this->body;
429
-
430
-        } else {
431
-            if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
432
-                $oldEncoding = mb_internal_encoding();
433
-                mb_internal_encoding('8bit');
434
-            }
435
-
436
-            try {
437
-                switch (strtolower($this->getHeader('content-encoding'))) {
438
-                case 'gzip':
439
-                    $decoded = self::decodeGzip($this->body);
440
-                    break;
441
-                case 'deflate':
442
-                    $decoded = self::decodeDeflate($this->body);
443
-                }
444
-            } catch (Exception $e) {
445
-            }
446
-
447
-            if (!empty($oldEncoding)) {
448
-                mb_internal_encoding($oldEncoding);
449
-            }
450
-            if (!empty($e)) {
451
-                throw $e;
452
-            }
453
-            return $decoded;
454
-        }
455
-    }
456
-
457
-    /**
458
-     * Get the HTTP version of the response
459
-     *
460
-     * @return   string
461
-     */
462
-    public function getVersion()
463
-    {
464
-        return $this->version;
465
-    }
466
-
467
-    /**
468
-     * Decodes the message-body encoded by gzip
469
-     *
470
-     * The real decoding work is done by gzinflate() built-in function, this
471
-     * method only parses the header and checks data for compliance with
472
-     * RFC 1952
473
-     *
474
-     * @param string $data gzip-encoded data
475
-     *
476
-     * @return   string  decoded data
477
-     * @throws   HTTP_Request2_LogicException
478
-     * @throws   HTTP_Request2_MessageException
479
-     * @link     http://tools.ietf.org/html/rfc1952
480
-     */
481
-    public static function decodeGzip($data)
482
-    {
483
-        $length = strlen($data);
484
-        // If it doesn't look like gzip-encoded data, don't bother
485
-        if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
486
-            return $data;
487
-        }
488
-        if (!function_exists('gzinflate')) {
489
-            throw new HTTP_Request2_LogicException(
490
-                'Unable to decode body: gzip extension not available',
491
-                HTTP_Request2_Exception::MISCONFIGURATION
492
-            );
493
-        }
494
-        $method = ord(substr($data, 2, 1));
495
-        if (8 != $method) {
496
-            throw new HTTP_Request2_MessageException(
497
-                'Error parsing gzip header: unknown compression method',
498
-                HTTP_Request2_Exception::DECODE_ERROR
499
-            );
500
-        }
501
-        $flags = ord(substr($data, 3, 1));
502
-        if ($flags & 224) {
503
-            throw new HTTP_Request2_MessageException(
504
-                'Error parsing gzip header: reserved bits are set',
505
-                HTTP_Request2_Exception::DECODE_ERROR
506
-            );
507
-        }
508
-
509
-        // header is 10 bytes minimum. may be longer, though.
510
-        $headerLength = 10;
511
-        // extra fields, need to skip 'em
512
-        if ($flags & 4) {
513
-            if ($length - $headerLength - 2 < 8) {
514
-                throw new HTTP_Request2_MessageException(
515
-                    'Error parsing gzip header: data too short',
516
-                    HTTP_Request2_Exception::DECODE_ERROR
517
-                );
518
-            }
519
-            $extraLength = unpack('v', substr($data, 10, 2));
520
-            if ($length - $headerLength - 2 - $extraLength[1] < 8) {
521
-                throw new HTTP_Request2_MessageException(
522
-                    'Error parsing gzip header: data too short',
523
-                    HTTP_Request2_Exception::DECODE_ERROR
524
-                );
525
-            }
526
-            $headerLength += $extraLength[1] + 2;
527
-        }
528
-        // file name, need to skip that
529
-        if ($flags & 8) {
530
-            if ($length - $headerLength - 1 < 8) {
531
-                throw new HTTP_Request2_MessageException(
532
-                    'Error parsing gzip header: data too short',
533
-                    HTTP_Request2_Exception::DECODE_ERROR
534
-                );
535
-            }
536
-            $filenameLength = strpos(substr($data, $headerLength), chr(0));
537
-            if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) {
538
-                throw new HTTP_Request2_MessageException(
539
-                    'Error parsing gzip header: data too short',
540
-                    HTTP_Request2_Exception::DECODE_ERROR
541
-                );
542
-            }
543
-            $headerLength += $filenameLength + 1;
544
-        }
545
-        // comment, need to skip that also
546
-        if ($flags & 16) {
547
-            if ($length - $headerLength - 1 < 8) {
548
-                throw new HTTP_Request2_MessageException(
549
-                    'Error parsing gzip header: data too short',
550
-                    HTTP_Request2_Exception::DECODE_ERROR
551
-                );
552
-            }
553
-            $commentLength = strpos(substr($data, $headerLength), chr(0));
554
-            if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) {
555
-                throw new HTTP_Request2_MessageException(
556
-                    'Error parsing gzip header: data too short',
557
-                    HTTP_Request2_Exception::DECODE_ERROR
558
-                );
559
-            }
560
-            $headerLength += $commentLength + 1;
561
-        }
562
-        // have a CRC for header. let's check
563
-        if ($flags & 2) {
564
-            if ($length - $headerLength - 2 < 8) {
565
-                throw new HTTP_Request2_MessageException(
566
-                    'Error parsing gzip header: data too short',
567
-                    HTTP_Request2_Exception::DECODE_ERROR
568
-                );
569
-            }
570
-            $crcReal   = 0xffff & crc32(substr($data, 0, $headerLength));
571
-            $crcStored = unpack('v', substr($data, $headerLength, 2));
572
-            if ($crcReal != $crcStored[1]) {
573
-                throw new HTTP_Request2_MessageException(
574
-                    'Header CRC check failed',
575
-                    HTTP_Request2_Exception::DECODE_ERROR
576
-                );
577
-            }
578
-            $headerLength += 2;
579
-        }
580
-        // unpacked data CRC and size at the end of encoded data
581
-        $tmp = unpack('V2', substr($data, -8));
582
-        $dataCrc  = $tmp[1];
583
-        $dataSize = $tmp[2];
584
-
585
-        // finally, call the gzinflate() function
586
-        // don't pass $dataSize to gzinflate, see bugs #13135, #14370
587
-        $unpacked = gzinflate(substr($data, $headerLength, -8));
588
-        if (false === $unpacked) {
589
-            throw new HTTP_Request2_MessageException(
590
-                'gzinflate() call failed',
591
-                HTTP_Request2_Exception::DECODE_ERROR
592
-            );
593
-        } elseif ($dataSize != strlen($unpacked)) {
594
-            throw new HTTP_Request2_MessageException(
595
-                'Data size check failed',
596
-                HTTP_Request2_Exception::DECODE_ERROR
597
-            );
598
-        } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) {
599
-            throw new HTTP_Request2_Exception(
600
-                'Data CRC check failed',
601
-                HTTP_Request2_Exception::DECODE_ERROR
602
-            );
603
-        }
604
-        return $unpacked;
605
-    }
606
-
607
-    /**
608
-     * Decodes the message-body encoded by deflate
609
-     *
610
-     * @param string $data deflate-encoded data
611
-     *
612
-     * @return   string  decoded data
613
-     * @throws   HTTP_Request2_LogicException
614
-     */
615
-    public static function decodeDeflate($data)
616
-    {
617
-        if (!function_exists('gzuncompress')) {
618
-            throw new HTTP_Request2_LogicException(
619
-                'Unable to decode body: gzip extension not available',
620
-                HTTP_Request2_Exception::MISCONFIGURATION
621
-            );
622
-        }
623
-        // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950,
624
-        // while many applications send raw deflate stream from RFC 1951.
625
-        // We should check for presence of zlib header and use gzuncompress() or
626
-        // gzinflate() as needed. See bug #15305
627
-        $header = unpack('n', substr($data, 0, 2));
628
-        return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
629
-    }
56
+	/**
57
+	 * HTTP protocol version (e.g. 1.0, 1.1)
58
+	 * @var  string
59
+	 */
60
+	protected $version;
61
+
62
+	/**
63
+	 * Status code
64
+	 * @var  integer
65
+	 * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
66
+	 */
67
+	protected $code;
68
+
69
+	/**
70
+	 * Reason phrase
71
+	 * @var  string
72
+	 * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
73
+	 */
74
+	protected $reasonPhrase;
75
+
76
+	/**
77
+	 * Effective URL (may be different from original request URL in case of redirects)
78
+	 * @var  string
79
+	 */
80
+	protected $effectiveUrl;
81
+
82
+	/**
83
+	 * Associative array of response headers
84
+	 * @var  array
85
+	 */
86
+	protected $headers = array();
87
+
88
+	/**
89
+	 * Cookies set in the response
90
+	 * @var  array
91
+	 */
92
+	protected $cookies = array();
93
+
94
+	/**
95
+	 * Name of last header processed by parseHederLine()
96
+	 *
97
+	 * Used to handle the headers that span multiple lines
98
+	 *
99
+	 * @var  string
100
+	 */
101
+	protected $lastHeader = null;
102
+
103
+	/**
104
+	 * Response body
105
+	 * @var  string
106
+	 */
107
+	protected $body = '';
108
+
109
+	/**
110
+	 * Whether the body is still encoded by Content-Encoding
111
+	 *
112
+	 * cURL provides the decoded body to the callback; if we are reading from
113
+	 * socket the body is still gzipped / deflated
114
+	 *
115
+	 * @var  bool
116
+	 */
117
+	protected $bodyEncoded;
118
+
119
+	/**
120
+	 * Associative array of HTTP status code / reason phrase.
121
+	 *
122
+	 * @var  array
123
+	 * @link http://tools.ietf.org/html/rfc2616#section-10
124
+	 */
125
+	protected static $phrases = array(
126
+
127
+		// 1xx: Informational - Request received, continuing process
128
+		100 => 'Continue',
129
+		101 => 'Switching Protocols',
130
+
131
+		// 2xx: Success - The action was successfully received, understood and
132
+		// accepted
133
+		200 => 'OK',
134
+		201 => 'Created',
135
+		202 => 'Accepted',
136
+		203 => 'Non-Authoritative Information',
137
+		204 => 'No Content',
138
+		205 => 'Reset Content',
139
+		206 => 'Partial Content',
140
+
141
+		// 3xx: Redirection - Further action must be taken in order to complete
142
+		// the request
143
+		300 => 'Multiple Choices',
144
+		301 => 'Moved Permanently',
145
+		302 => 'Found',  // 1.1
146
+		303 => 'See Other',
147
+		304 => 'Not Modified',
148
+		305 => 'Use Proxy',
149
+		307 => 'Temporary Redirect',
150
+
151
+		// 4xx: Client Error - The request contains bad syntax or cannot be
152
+		// fulfilled
153
+		400 => 'Bad Request',
154
+		401 => 'Unauthorized',
155
+		402 => 'Payment Required',
156
+		403 => 'Forbidden',
157
+		404 => 'Not Found',
158
+		405 => 'Method Not Allowed',
159
+		406 => 'Not Acceptable',
160
+		407 => 'Proxy Authentication Required',
161
+		408 => 'Request Timeout',
162
+		409 => 'Conflict',
163
+		410 => 'Gone',
164
+		411 => 'Length Required',
165
+		412 => 'Precondition Failed',
166
+		413 => 'Request Entity Too Large',
167
+		414 => 'Request-URI Too Long',
168
+		415 => 'Unsupported Media Type',
169
+		416 => 'Requested Range Not Satisfiable',
170
+		417 => 'Expectation Failed',
171
+
172
+		// 5xx: Server Error - The server failed to fulfill an apparently
173
+		// valid request
174
+		500 => 'Internal Server Error',
175
+		501 => 'Not Implemented',
176
+		502 => 'Bad Gateway',
177
+		503 => 'Service Unavailable',
178
+		504 => 'Gateway Timeout',
179
+		505 => 'HTTP Version Not Supported',
180
+		509 => 'Bandwidth Limit Exceeded',
181
+
182
+	);
183
+
184
+	/**
185
+	 * Returns the default reason phrase for the given code or all reason phrases
186
+	 *
187
+	 * @param int $code Response code
188
+	 *
189
+	 * @return string|array|null Default reason phrase for $code if $code is given
190
+	 *                           (null if no phrase is available), array of all
191
+	 *                           reason phrases if $code is null
192
+	 * @link   http://pear.php.net/bugs/18716
193
+	 */
194
+	public static function getDefaultReasonPhrase($code = null)
195
+	{
196
+		if (null === $code) {
197
+			return self::$phrases;
198
+		} else {
199
+			return isset(self::$phrases[$code]) ? self::$phrases[$code] : null;
200
+		}
201
+	}
202
+
203
+	/**
204
+	 * Constructor, parses the response status line
205
+	 *
206
+	 * @param string $statusLine   Response status line (e.g. "HTTP/1.1 200 OK")
207
+	 * @param bool   $bodyEncoded  Whether body is still encoded by Content-Encoding
208
+	 * @param string $effectiveUrl Effective URL of the response
209
+	 *
210
+	 * @throws   HTTP_Request2_MessageException if status line is invalid according to spec
211
+	 */
212
+	public function __construct($statusLine, $bodyEncoded = true, $effectiveUrl = null)
213
+	{
214
+		if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) {
215
+			throw new HTTP_Request2_MessageException(
216
+				"Malformed response: {$statusLine}",
217
+				HTTP_Request2_Exception::MALFORMED_RESPONSE
218
+			);
219
+		}
220
+		$this->version      = $m[1];
221
+		$this->code         = intval($m[2]);
222
+		$this->reasonPhrase = !empty($m[3]) ? trim($m[3]) : self::getDefaultReasonPhrase($this->code);
223
+		$this->bodyEncoded  = (bool)$bodyEncoded;
224
+		$this->effectiveUrl = (string)$effectiveUrl;
225
+	}
226
+
227
+	/**
228
+	 * Parses the line from HTTP response filling $headers array
229
+	 *
230
+	 * The method should be called after reading the line from socket or receiving
231
+	 * it into cURL callback. Passing an empty string here indicates the end of
232
+	 * response headers and triggers additional processing, so be sure to pass an
233
+	 * empty string in the end.
234
+	 *
235
+	 * @param string $headerLine Line from HTTP response
236
+	 */
237
+	public function parseHeaderLine($headerLine)
238
+	{
239
+		$headerLine = trim($headerLine, "\r\n");
240
+
241
+		if ('' == $headerLine) {
242
+			// empty string signals the end of headers, process the received ones
243
+			if (!empty($this->headers['set-cookie'])) {
244
+				$cookies = is_array($this->headers['set-cookie'])?
245
+						   $this->headers['set-cookie']:
246
+						   array($this->headers['set-cookie']);
247
+				foreach ($cookies as $cookieString) {
248
+					$this->parseCookie($cookieString);
249
+				}
250
+				unset($this->headers['set-cookie']);
251
+			}
252
+			foreach (array_keys($this->headers) as $k) {
253
+				if (is_array($this->headers[$k])) {
254
+					$this->headers[$k] = implode(', ', $this->headers[$k]);
255
+				}
256
+			}
257
+
258
+		} elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) {
259
+			// string of the form header-name: header value
260
+			$name  = strtolower($m[1]);
261
+			$value = trim($m[2]);
262
+			if (empty($this->headers[$name])) {
263
+				$this->headers[$name] = $value;
264
+			} else {
265
+				if (!is_array($this->headers[$name])) {
266
+					$this->headers[$name] = array($this->headers[$name]);
267
+				}
268
+				$this->headers[$name][] = $value;
269
+			}
270
+			$this->lastHeader = $name;
271
+
272
+		} elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
273
+			// continuation of a previous header
274
+			if (!is_array($this->headers[$this->lastHeader])) {
275
+				$this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
276
+			} else {
277
+				$key = count($this->headers[$this->lastHeader]) - 1;
278
+				$this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
279
+			}
280
+		}
281
+	}
282
+
283
+	/**
284
+	 * Parses a Set-Cookie header to fill $cookies array
285
+	 *
286
+	 * @param string $cookieString value of Set-Cookie header
287
+	 *
288
+	 * @link     http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
289
+	 */
290
+	protected function parseCookie($cookieString)
291
+	{
292
+		$cookie = array(
293
+			'expires' => null,
294
+			'domain'  => null,
295
+			'path'    => null,
296
+			'secure'  => false
297
+		);
298
+
299
+		if (!strpos($cookieString, ';')) {
300
+			// Only a name=value pair
301
+			$pos = strpos($cookieString, '=');
302
+			$cookie['name']  = trim(substr($cookieString, 0, $pos));
303
+			$cookie['value'] = trim(substr($cookieString, $pos + 1));
304
+
305
+		} else {
306
+			// Some optional parameters are supplied
307
+			$elements = explode(';', $cookieString);
308
+			$pos = strpos($elements[0], '=');
309
+			$cookie['name']  = trim(substr($elements[0], 0, $pos));
310
+			$cookie['value'] = trim(substr($elements[0], $pos + 1));
311
+
312
+			for ($i = 1; $i < count($elements); $i++) {
313
+				if (false === strpos($elements[$i], '=')) {
314
+					$elName  = trim($elements[$i]);
315
+					$elValue = null;
316
+				} else {
317
+					list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i]));
318
+				}
319
+				$elName = strtolower($elName);
320
+				if ('secure' == $elName) {
321
+					$cookie['secure'] = true;
322
+				} elseif ('expires' == $elName) {
323
+					$cookie['expires'] = str_replace('"', '', $elValue);
324
+				} elseif ('path' == $elName || 'domain' == $elName) {
325
+					$cookie[$elName] = urldecode($elValue);
326
+				} else {
327
+					$cookie[$elName] = $elValue;
328
+				}
329
+			}
330
+		}
331
+		$this->cookies[] = $cookie;
332
+	}
333
+
334
+	/**
335
+	 * Appends a string to the response body
336
+	 *
337
+	 * @param string $bodyChunk part of response body
338
+	 */
339
+	public function appendBody($bodyChunk)
340
+	{
341
+		$this->body .= $bodyChunk;
342
+	}
343
+
344
+	/**
345
+	 * Returns the effective URL of the response
346
+	 *
347
+	 * This may be different from the request URL if redirects were followed.
348
+	 *
349
+	 * @return string
350
+	 * @link   http://pear.php.net/bugs/bug.php?id=18412
351
+	 */
352
+	public function getEffectiveUrl()
353
+	{
354
+		return $this->effectiveUrl;
355
+	}
356
+
357
+	/**
358
+	 * Returns the status code
359
+	 *
360
+	 * @return   integer
361
+	 */
362
+	public function getStatus()
363
+	{
364
+		return $this->code;
365
+	}
366
+
367
+	/**
368
+	 * Returns the reason phrase
369
+	 *
370
+	 * @return   string
371
+	 */
372
+	public function getReasonPhrase()
373
+	{
374
+		return $this->reasonPhrase;
375
+	}
376
+
377
+	/**
378
+	 * Whether response is a redirect that can be automatically handled by HTTP_Request2
379
+	 *
380
+	 * @return   bool
381
+	 */
382
+	public function isRedirect()
383
+	{
384
+		return in_array($this->code, array(300, 301, 302, 303, 307))
385
+			   && isset($this->headers['location']);
386
+	}
387
+
388
+	/**
389
+	 * Returns either the named header or all response headers
390
+	 *
391
+	 * @param string $headerName Name of header to return
392
+	 *
393
+	 * @return   string|array    Value of $headerName header (null if header is
394
+	 *                           not present), array of all response headers if
395
+	 *                           $headerName is null
396
+	 */
397
+	public function getHeader($headerName = null)
398
+	{
399
+		if (null === $headerName) {
400
+			return $this->headers;
401
+		} else {
402
+			$headerName = strtolower($headerName);
403
+			return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
404
+		}
405
+	}
406
+
407
+	/**
408
+	 * Returns cookies set in response
409
+	 *
410
+	 * @return   array
411
+	 */
412
+	public function getCookies()
413
+	{
414
+		return $this->cookies;
415
+	}
416
+
417
+	/**
418
+	 * Returns the body of the response
419
+	 *
420
+	 * @return   string
421
+	 * @throws   HTTP_Request2_Exception if body cannot be decoded
422
+	 */
423
+	public function getBody()
424
+	{
425
+		if (0 == strlen($this->body) || !$this->bodyEncoded
426
+			|| !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate'))
427
+		) {
428
+			return $this->body;
429
+
430
+		} else {
431
+			if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
432
+				$oldEncoding = mb_internal_encoding();
433
+				mb_internal_encoding('8bit');
434
+			}
435
+
436
+			try {
437
+				switch (strtolower($this->getHeader('content-encoding'))) {
438
+				case 'gzip':
439
+					$decoded = self::decodeGzip($this->body);
440
+					break;
441
+				case 'deflate':
442
+					$decoded = self::decodeDeflate($this->body);
443
+				}
444
+			} catch (Exception $e) {
445
+			}
446
+
447
+			if (!empty($oldEncoding)) {
448
+				mb_internal_encoding($oldEncoding);
449
+			}
450
+			if (!empty($e)) {
451
+				throw $e;
452
+			}
453
+			return $decoded;
454
+		}
455
+	}
456
+
457
+	/**
458
+	 * Get the HTTP version of the response
459
+	 *
460
+	 * @return   string
461
+	 */
462
+	public function getVersion()
463
+	{
464
+		return $this->version;
465
+	}
466
+
467
+	/**
468
+	 * Decodes the message-body encoded by gzip
469
+	 *
470
+	 * The real decoding work is done by gzinflate() built-in function, this
471
+	 * method only parses the header and checks data for compliance with
472
+	 * RFC 1952
473
+	 *
474
+	 * @param string $data gzip-encoded data
475
+	 *
476
+	 * @return   string  decoded data
477
+	 * @throws   HTTP_Request2_LogicException
478
+	 * @throws   HTTP_Request2_MessageException
479
+	 * @link     http://tools.ietf.org/html/rfc1952
480
+	 */
481
+	public static function decodeGzip($data)
482
+	{
483
+		$length = strlen($data);
484
+		// If it doesn't look like gzip-encoded data, don't bother
485
+		if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
486
+			return $data;
487
+		}
488
+		if (!function_exists('gzinflate')) {
489
+			throw new HTTP_Request2_LogicException(
490
+				'Unable to decode body: gzip extension not available',
491
+				HTTP_Request2_Exception::MISCONFIGURATION
492
+			);
493
+		}
494
+		$method = ord(substr($data, 2, 1));
495
+		if (8 != $method) {
496
+			throw new HTTP_Request2_MessageException(
497
+				'Error parsing gzip header: unknown compression method',
498
+				HTTP_Request2_Exception::DECODE_ERROR
499
+			);
500
+		}
501
+		$flags = ord(substr($data, 3, 1));
502
+		if ($flags & 224) {
503
+			throw new HTTP_Request2_MessageException(
504
+				'Error parsing gzip header: reserved bits are set',
505
+				HTTP_Request2_Exception::DECODE_ERROR
506
+			);
507
+		}
508
+
509
+		// header is 10 bytes minimum. may be longer, though.
510
+		$headerLength = 10;
511
+		// extra fields, need to skip 'em
512
+		if ($flags & 4) {
513
+			if ($length - $headerLength - 2 < 8) {
514
+				throw new HTTP_Request2_MessageException(
515
+					'Error parsing gzip header: data too short',
516
+					HTTP_Request2_Exception::DECODE_ERROR
517
+				);
518
+			}
519
+			$extraLength = unpack('v', substr($data, 10, 2));
520
+			if ($length - $headerLength - 2 - $extraLength[1] < 8) {
521
+				throw new HTTP_Request2_MessageException(
522
+					'Error parsing gzip header: data too short',
523
+					HTTP_Request2_Exception::DECODE_ERROR
524
+				);
525
+			}
526
+			$headerLength += $extraLength[1] + 2;
527
+		}
528
+		// file name, need to skip that
529
+		if ($flags & 8) {
530
+			if ($length - $headerLength - 1 < 8) {
531
+				throw new HTTP_Request2_MessageException(
532
+					'Error parsing gzip header: data too short',
533
+					HTTP_Request2_Exception::DECODE_ERROR
534
+				);
535
+			}
536
+			$filenameLength = strpos(substr($data, $headerLength), chr(0));
537
+			if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) {
538
+				throw new HTTP_Request2_MessageException(
539
+					'Error parsing gzip header: data too short',
540
+					HTTP_Request2_Exception::DECODE_ERROR
541
+				);
542
+			}
543
+			$headerLength += $filenameLength + 1;
544
+		}
545
+		// comment, need to skip that also
546
+		if ($flags & 16) {
547
+			if ($length - $headerLength - 1 < 8) {
548
+				throw new HTTP_Request2_MessageException(
549
+					'Error parsing gzip header: data too short',
550
+					HTTP_Request2_Exception::DECODE_ERROR
551
+				);
552
+			}
553
+			$commentLength = strpos(substr($data, $headerLength), chr(0));
554
+			if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) {
555
+				throw new HTTP_Request2_MessageException(
556
+					'Error parsing gzip header: data too short',
557
+					HTTP_Request2_Exception::DECODE_ERROR
558
+				);
559
+			}
560
+			$headerLength += $commentLength + 1;
561
+		}
562
+		// have a CRC for header. let's check
563
+		if ($flags & 2) {
564
+			if ($length - $headerLength - 2 < 8) {
565
+				throw new HTTP_Request2_MessageException(
566
+					'Error parsing gzip header: data too short',
567
+					HTTP_Request2_Exception::DECODE_ERROR
568
+				);
569
+			}
570
+			$crcReal   = 0xffff & crc32(substr($data, 0, $headerLength));
571
+			$crcStored = unpack('v', substr($data, $headerLength, 2));
572
+			if ($crcReal != $crcStored[1]) {
573
+				throw new HTTP_Request2_MessageException(
574
+					'Header CRC check failed',
575
+					HTTP_Request2_Exception::DECODE_ERROR
576
+				);
577
+			}
578
+			$headerLength += 2;
579
+		}
580
+		// unpacked data CRC and size at the end of encoded data
581
+		$tmp = unpack('V2', substr($data, -8));
582
+		$dataCrc  = $tmp[1];
583
+		$dataSize = $tmp[2];
584
+
585
+		// finally, call the gzinflate() function
586
+		// don't pass $dataSize to gzinflate, see bugs #13135, #14370
587
+		$unpacked = gzinflate(substr($data, $headerLength, -8));
588
+		if (false === $unpacked) {
589
+			throw new HTTP_Request2_MessageException(
590
+				'gzinflate() call failed',
591
+				HTTP_Request2_Exception::DECODE_ERROR
592
+			);
593
+		} elseif ($dataSize != strlen($unpacked)) {
594
+			throw new HTTP_Request2_MessageException(
595
+				'Data size check failed',
596
+				HTTP_Request2_Exception::DECODE_ERROR
597
+			);
598
+		} elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) {
599
+			throw new HTTP_Request2_Exception(
600
+				'Data CRC check failed',
601
+				HTTP_Request2_Exception::DECODE_ERROR
602
+			);
603
+		}
604
+		return $unpacked;
605
+	}
606
+
607
+	/**
608
+	 * Decodes the message-body encoded by deflate
609
+	 *
610
+	 * @param string $data deflate-encoded data
611
+	 *
612
+	 * @return   string  decoded data
613
+	 * @throws   HTTP_Request2_LogicException
614
+	 */
615
+	public static function decodeDeflate($data)
616
+	{
617
+		if (!function_exists('gzuncompress')) {
618
+			throw new HTTP_Request2_LogicException(
619
+				'Unable to decode body: gzip extension not available',
620
+				HTTP_Request2_Exception::MISCONFIGURATION
621
+			);
622
+		}
623
+		// RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950,
624
+		// while many applications send raw deflate stream from RFC 1951.
625
+		// We should check for presence of zlib header and use gzuncompress() or
626
+		// gzinflate() as needed. See bug #15305
627
+		$header = unpack('n', substr($data, 0, 2));
628
+		return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
629
+	}
630 630
 }
631 631
 ?>
632 632
\ No newline at end of file
Please login to merge, or discard this patch.
Switch Indentation   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -435,11 +435,11 @@
 block discarded – undo
435 435
 
436 436
             try {
437 437
                 switch (strtolower($this->getHeader('content-encoding'))) {
438
-                case 'gzip':
439
-                    $decoded = self::decodeGzip($this->body);
440
-                    break;
441
-                case 'deflate':
442
-                    $decoded = self::decodeDeflate($this->body);
438
+                	case 'gzip':
439
+                    	$decoded = self::decodeGzip($this->body);
440
+                    	break;
441
+                	case 'deflate':
442
+                    	$decoded = self::decodeDeflate($this->body);
443 443
                 }
444 444
             } catch (Exception $e) {
445 445
             }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -10 removed lines patch added patch discarded remove patch
@@ -142,7 +142,7 @@  discard block
 block discarded – undo
142 142
         // the request
143 143
         300 => 'Multiple Choices',
144 144
         301 => 'Moved Permanently',
145
-        302 => 'Found',  // 1.1
145
+        302 => 'Found', // 1.1
146 146
         303 => 'See Other',
147 147
         304 => 'Not Modified',
148 148
         305 => 'Use Proxy',
@@ -220,8 +220,8 @@  discard block
 block discarded – undo
220 220
         $this->version      = $m[1];
221 221
         $this->code         = intval($m[2]);
222 222
         $this->reasonPhrase = !empty($m[3]) ? trim($m[3]) : self::getDefaultReasonPhrase($this->code);
223
-        $this->bodyEncoded  = (bool)$bodyEncoded;
224
-        $this->effectiveUrl = (string)$effectiveUrl;
223
+        $this->bodyEncoded  = (bool) $bodyEncoded;
224
+        $this->effectiveUrl = (string) $effectiveUrl;
225 225
     }
226 226
 
227 227
     /**
@@ -241,9 +241,8 @@  discard block
 block discarded – undo
241 241
         if ('' == $headerLine) {
242 242
             // empty string signals the end of headers, process the received ones
243 243
             if (!empty($this->headers['set-cookie'])) {
244
-                $cookies = is_array($this->headers['set-cookie'])?
245
-                           $this->headers['set-cookie']:
246
-                           array($this->headers['set-cookie']);
244
+                $cookies = is_array($this->headers['set-cookie']) ?
245
+                           $this->headers['set-cookie'] : array($this->headers['set-cookie']);
247 246
                 foreach ($cookies as $cookieString) {
248 247
                     $this->parseCookie($cookieString);
249 248
                 }
@@ -272,10 +271,10 @@  discard block
 block discarded – undo
272 271
         } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
273 272
             // continuation of a previous header
274 273
             if (!is_array($this->headers[$this->lastHeader])) {
275
-                $this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
274
+                $this->headers[$this->lastHeader] .= ' '.trim($m[1]);
276 275
             } else {
277 276
                 $key = count($this->headers[$this->lastHeader]) - 1;
278
-                $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
277
+                $this->headers[$this->lastHeader][$key] .= ' '.trim($m[1]);
279 278
             }
280 279
         }
281 280
     }
@@ -400,7 +399,7 @@  discard block
 block discarded – undo
400 399
             return $this->headers;
401 400
         } else {
402 401
             $headerName = strtolower($headerName);
403
-            return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
402
+            return isset($this->headers[$headerName]) ? $this->headers[$headerName] : null;
404 403
         }
405 404
     }
406 405
 
@@ -625,7 +624,7 @@  discard block
 block discarded – undo
625 624
         // We should check for presence of zlib header and use gzuncompress() or
626 625
         // gzinflate() as needed. See bug #15305
627 626
         $header = unpack('n', substr($data, 0, 2));
628
-        return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
627
+        return (0 == $header[1] % 31) ? gzuncompress($data) : gzinflate($data);
629 628
     }
630 629
 }
631 630
 ?>
632 631
\ No newline at end of file
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/SOCKS5.php 3 patches
Switch Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -68,14 +68,14 @@
 block discarded – undo
68 68
             );
69 69
         }
70 70
         switch ($response['method']) {
71
-        case 2:
72
-            $this->performAuthentication($username, $password);
73
-        case 0:
74
-            break;
75
-        default:
76
-            throw new HTTP_Request2_ConnectionException(
77
-                "Connection rejected by proxy due to unsupported auth method"
78
-            );
71
+        	case 2:
72
+            	$this->performAuthentication($username, $password);
73
+        	case 0:
74
+            	break;
75
+        	default:
76
+            	throw new HTTP_Request2_ConnectionException(
77
+                	"Connection rejected by proxy due to unsupported auth method"
78
+            	);
79 79
         }
80 80
     }
81 81
 
Please login to merge, or discard this patch.
Indentation   +91 added lines, -91 removed lines patch added patch discarded remove patch
@@ -35,101 +35,101 @@
 block discarded – undo
35 35
  */
36 36
 class HTTP_Request2_SOCKS5 extends HTTP_Request2_SocketWrapper
37 37
 {
38
-    /**
39
-     * Constructor, tries to connect and authenticate to a SOCKS5 proxy
40
-     *
41
-     * @param string $address        Proxy address, e.g. 'tcp://localhost:1080'
42
-     * @param int    $timeout        Connection timeout (seconds)
43
-     * @param array  $contextOptions Stream context options
44
-     * @param string $username       Proxy user name
45
-     * @param string $password       Proxy password
46
-     *
47
-     * @throws HTTP_Request2_LogicException
48
-     * @throws HTTP_Request2_ConnectionException
49
-     * @throws HTTP_Request2_MessageException
50
-     */
51
-    public function __construct(
52
-        $address, $timeout = 10, array $contextOptions = array(),
53
-        $username = null, $password = null
54
-    ) {
55
-        parent::__construct($address, $timeout, $contextOptions);
38
+	/**
39
+	 * Constructor, tries to connect and authenticate to a SOCKS5 proxy
40
+	 *
41
+	 * @param string $address        Proxy address, e.g. 'tcp://localhost:1080'
42
+	 * @param int    $timeout        Connection timeout (seconds)
43
+	 * @param array  $contextOptions Stream context options
44
+	 * @param string $username       Proxy user name
45
+	 * @param string $password       Proxy password
46
+	 *
47
+	 * @throws HTTP_Request2_LogicException
48
+	 * @throws HTTP_Request2_ConnectionException
49
+	 * @throws HTTP_Request2_MessageException
50
+	 */
51
+	public function __construct(
52
+		$address, $timeout = 10, array $contextOptions = array(),
53
+		$username = null, $password = null
54
+	) {
55
+		parent::__construct($address, $timeout, $contextOptions);
56 56
 
57
-        if (strlen($username)) {
58
-            $request = pack('C4', 5, 2, 0, 2);
59
-        } else {
60
-            $request = pack('C3', 5, 1, 0);
61
-        }
62
-        $this->write($request);
63
-        $response = unpack('Cversion/Cmethod', $this->read(3));
64
-        if (5 != $response['version']) {
65
-            throw new HTTP_Request2_MessageException(
66
-                'Invalid version received from SOCKS5 proxy: ' . $response['version'],
67
-                HTTP_Request2_Exception::MALFORMED_RESPONSE
68
-            );
69
-        }
70
-        switch ($response['method']) {
71
-        case 2:
72
-            $this->performAuthentication($username, $password);
73
-        case 0:
74
-            break;
75
-        default:
76
-            throw new HTTP_Request2_ConnectionException(
77
-                "Connection rejected by proxy due to unsupported auth method"
78
-            );
79
-        }
80
-    }
57
+		if (strlen($username)) {
58
+			$request = pack('C4', 5, 2, 0, 2);
59
+		} else {
60
+			$request = pack('C3', 5, 1, 0);
61
+		}
62
+		$this->write($request);
63
+		$response = unpack('Cversion/Cmethod', $this->read(3));
64
+		if (5 != $response['version']) {
65
+			throw new HTTP_Request2_MessageException(
66
+				'Invalid version received from SOCKS5 proxy: ' . $response['version'],
67
+				HTTP_Request2_Exception::MALFORMED_RESPONSE
68
+			);
69
+		}
70
+		switch ($response['method']) {
71
+		case 2:
72
+			$this->performAuthentication($username, $password);
73
+		case 0:
74
+			break;
75
+		default:
76
+			throw new HTTP_Request2_ConnectionException(
77
+				"Connection rejected by proxy due to unsupported auth method"
78
+			);
79
+		}
80
+	}
81 81
 
82
-    /**
83
-     * Performs username/password authentication for SOCKS5
84
-     *
85
-     * @param string $username Proxy user name
86
-     * @param string $password Proxy password
87
-     *
88
-     * @throws HTTP_Request2_ConnectionException
89
-     * @throws HTTP_Request2_MessageException
90
-     * @link http://tools.ietf.org/html/rfc1929
91
-     */
92
-    protected function performAuthentication($username, $password)
93
-    {
94
-        $request  = pack('C2', 1, strlen($username)) . $username
95
-                    . pack('C', strlen($password)) . $password;
82
+	/**
83
+	 * Performs username/password authentication for SOCKS5
84
+	 *
85
+	 * @param string $username Proxy user name
86
+	 * @param string $password Proxy password
87
+	 *
88
+	 * @throws HTTP_Request2_ConnectionException
89
+	 * @throws HTTP_Request2_MessageException
90
+	 * @link http://tools.ietf.org/html/rfc1929
91
+	 */
92
+	protected function performAuthentication($username, $password)
93
+	{
94
+		$request  = pack('C2', 1, strlen($username)) . $username
95
+					. pack('C', strlen($password)) . $password;
96 96
 
97
-        $this->write($request);
98
-        $response = unpack('Cvn/Cstatus', $this->read(3));
99
-        if (1 != $response['vn'] || 0 != $response['status']) {
100
-            throw new HTTP_Request2_ConnectionException(
101
-                'Connection rejected by proxy due to invalid username and/or password'
102
-            );
103
-        }
104
-    }
97
+		$this->write($request);
98
+		$response = unpack('Cvn/Cstatus', $this->read(3));
99
+		if (1 != $response['vn'] || 0 != $response['status']) {
100
+			throw new HTTP_Request2_ConnectionException(
101
+				'Connection rejected by proxy due to invalid username and/or password'
102
+			);
103
+		}
104
+	}
105 105
 
106
-    /**
107
-     * Connects to a remote host via proxy
108
-     *
109
-     * @param string $remoteHost Remote host
110
-     * @param int    $remotePort Remote port
111
-     *
112
-     * @throws HTTP_Request2_ConnectionException
113
-     * @throws HTTP_Request2_MessageException
114
-     */
115
-    public function connect($remoteHost, $remotePort)
116
-    {
117
-        $request = pack('C5', 0x05, 0x01, 0x00, 0x03, strlen($remoteHost))
118
-                   . $remoteHost . pack('n', $remotePort);
106
+	/**
107
+	 * Connects to a remote host via proxy
108
+	 *
109
+	 * @param string $remoteHost Remote host
110
+	 * @param int    $remotePort Remote port
111
+	 *
112
+	 * @throws HTTP_Request2_ConnectionException
113
+	 * @throws HTTP_Request2_MessageException
114
+	 */
115
+	public function connect($remoteHost, $remotePort)
116
+	{
117
+		$request = pack('C5', 0x05, 0x01, 0x00, 0x03, strlen($remoteHost))
118
+				   . $remoteHost . pack('n', $remotePort);
119 119
 
120
-        $this->write($request);
121
-        $response = unpack('Cversion/Creply/Creserved', $this->read(1024));
122
-        if (5 != $response['version'] || 0 != $response['reserved']) {
123
-            throw new HTTP_Request2_MessageException(
124
-                'Invalid response received from SOCKS5 proxy',
125
-                HTTP_Request2_Exception::MALFORMED_RESPONSE
126
-            );
127
-        } elseif (0 != $response['reply']) {
128
-            throw new HTTP_Request2_ConnectionException(
129
-                "Unable to connect to {$remoteHost}:{$remotePort} through SOCKS5 proxy",
130
-                0, $response['reply']
131
-            );
132
-        }
133
-    }
120
+		$this->write($request);
121
+		$response = unpack('Cversion/Creply/Creserved', $this->read(1024));
122
+		if (5 != $response['version'] || 0 != $response['reserved']) {
123
+			throw new HTTP_Request2_MessageException(
124
+				'Invalid response received from SOCKS5 proxy',
125
+				HTTP_Request2_Exception::MALFORMED_RESPONSE
126
+			);
127
+		} elseif (0 != $response['reply']) {
128
+			throw new HTTP_Request2_ConnectionException(
129
+				"Unable to connect to {$remoteHost}:{$remotePort} through SOCKS5 proxy",
130
+				0, $response['reply']
131
+			);
132
+		}
133
+	}
134 134
 }
135 135
 ?>
136 136
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -63,7 +63,7 @@  discard block
 block discarded – undo
63 63
         $response = unpack('Cversion/Cmethod', $this->read(3));
64 64
         if (5 != $response['version']) {
65 65
             throw new HTTP_Request2_MessageException(
66
-                'Invalid version received from SOCKS5 proxy: ' . $response['version'],
66
+                'Invalid version received from SOCKS5 proxy: '.$response['version'],
67 67
                 HTTP_Request2_Exception::MALFORMED_RESPONSE
68 68
             );
69 69
         }
@@ -91,8 +91,8 @@  discard block
 block discarded – undo
91 91
      */
92 92
     protected function performAuthentication($username, $password)
93 93
     {
94
-        $request  = pack('C2', 1, strlen($username)) . $username
95
-                    . pack('C', strlen($password)) . $password;
94
+        $request = pack('C2', 1, strlen($username)).$username
95
+                    . pack('C', strlen($password)).$password;
96 96
 
97 97
         $this->write($request);
98 98
         $response = unpack('Cvn/Cstatus', $this->read(3));
@@ -115,7 +115,7 @@  discard block
 block discarded – undo
115 115
     public function connect($remoteHost, $remotePort)
116 116
     {
117 117
         $request = pack('C5', 0x05, 0x01, 0x00, 0x03, strlen($remoteHost))
118
-                   . $remoteHost . pack('n', $remotePort);
118
+                   . $remoteHost.pack('n', $remotePort);
119 119
 
120 120
         $this->write($request);
121 121
         $response = unpack('Cversion/Creply/Creserved', $this->read(1024));
Please login to merge, or discard this patch.
libs/PEAR.1.9.5/HTTP/Request2/SocketWrapper.php 2 patches
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -170,7 +170,7 @@
 block discarded – undo
170 170
                 // reset socket timeout if we don't have request timeout specified,
171 171
                 // prevents further calls failing with a bogus Exception
172 172
                 if (!$this->deadline) {
173
-                    $default = (int)@ini_get('default_socket_timeout');
173
+                    $default = (int) @ini_get('default_socket_timeout');
174 174
                     stream_set_timeout($this->socket, $default > 0 ? $default : PHP_INT_MAX);
175 175
                 }
176 176
                 if ($info['timed_out']) {
Please login to merge, or discard this patch.
Indentation   +238 added lines, -238 removed lines patch added patch discarded remove patch
@@ -38,260 +38,260 @@
 block discarded – undo
38 38
  */
39 39
 class HTTP_Request2_SocketWrapper
40 40
 {
41
-    /**
42
-     * PHP warning messages raised during stream_socket_client() call
43
-     * @var array
44
-     */
45
-    protected $connectionWarnings = array();
41
+	/**
42
+	 * PHP warning messages raised during stream_socket_client() call
43
+	 * @var array
44
+	 */
45
+	protected $connectionWarnings = array();
46 46
 
47
-    /**
48
-     * Connected socket
49
-     * @var resource
50
-     */
51
-    protected $socket;
47
+	/**
48
+	 * Connected socket
49
+	 * @var resource
50
+	 */
51
+	protected $socket;
52 52
 
53
-    /**
54
-     * Sum of start time and global timeout, exception will be thrown if request continues past this time
55
-     * @var  integer
56
-     */
57
-    protected $deadline;
53
+	/**
54
+	 * Sum of start time and global timeout, exception will be thrown if request continues past this time
55
+	 * @var  integer
56
+	 */
57
+	protected $deadline;
58 58
 
59
-    /**
60
-     * Global timeout value, mostly for exception messages
61
-     * @var integer
62
-     */
63
-    protected $timeout;
59
+	/**
60
+	 * Global timeout value, mostly for exception messages
61
+	 * @var integer
62
+	 */
63
+	protected $timeout;
64 64
 
65
-    /**
66
-     * Class constructor, tries to establish connection
67
-     *
68
-     * @param string $address        Address for stream_socket_client() call,
69
-     *                               e.g. 'tcp://localhost:80'
70
-     * @param int    $timeout        Connection timeout (seconds)
71
-     * @param array  $contextOptions Context options
72
-     *
73
-     * @throws HTTP_Request2_LogicException
74
-     * @throws HTTP_Request2_ConnectionException
75
-     */
76
-    public function __construct($address, $timeout, array $contextOptions = array())
77
-    {
78
-        if (!empty($contextOptions)
79
-            && !isset($contextOptions['socket']) && !isset($contextOptions['ssl'])
80
-        ) {
81
-            // Backwards compatibility with 2.1.0 and 2.1.1 releases
82
-            $contextOptions = array('ssl' => $contextOptions);
83
-        }
84
-        $context = stream_context_create();
85
-        foreach ($contextOptions as $wrapper => $options) {
86
-            foreach ($options as $name => $value) {
87
-                if (!stream_context_set_option($context, $wrapper, $name, $value)) {
88
-                    throw new HTTP_Request2_LogicException(
89
-                        "Error setting '{$wrapper}' wrapper context option '{$name}'"
90
-                    );
91
-                }
92
-            }
93
-        }
94
-        set_error_handler(array($this, 'connectionWarningsHandler'));
95
-        $this->socket = stream_socket_client(
96
-            $address, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context
97
-        );
98
-        restore_error_handler();
99
-        // if we fail to bind to a specified local address (see request #19515),
100
-        // connection still succeeds, albeit with a warning. Throw an Exception
101
-        // with the warning text in this case as that connection is unlikely
102
-        // to be what user wants and as Curl throws an error in similar case.
103
-        if ($this->connectionWarnings) {
104
-            if ($this->socket) {
105
-                fclose($this->socket);
106
-            }
107
-            $error = $errstr ? $errstr : implode("\n", $this->connectionWarnings);
108
-            throw new HTTP_Request2_ConnectionException(
109
-                "Unable to connect to {$address}. Error: {$error}", 0, $errno
110
-            );
111
-        }
112
-    }
65
+	/**
66
+	 * Class constructor, tries to establish connection
67
+	 *
68
+	 * @param string $address        Address for stream_socket_client() call,
69
+	 *                               e.g. 'tcp://localhost:80'
70
+	 * @param int    $timeout        Connection timeout (seconds)
71
+	 * @param array  $contextOptions Context options
72
+	 *
73
+	 * @throws HTTP_Request2_LogicException
74
+	 * @throws HTTP_Request2_ConnectionException
75
+	 */
76
+	public function __construct($address, $timeout, array $contextOptions = array())
77
+	{
78
+		if (!empty($contextOptions)
79
+			&& !isset($contextOptions['socket']) && !isset($contextOptions['ssl'])
80
+		) {
81
+			// Backwards compatibility with 2.1.0 and 2.1.1 releases
82
+			$contextOptions = array('ssl' => $contextOptions);
83
+		}
84
+		$context = stream_context_create();
85
+		foreach ($contextOptions as $wrapper => $options) {
86
+			foreach ($options as $name => $value) {
87
+				if (!stream_context_set_option($context, $wrapper, $name, $value)) {
88
+					throw new HTTP_Request2_LogicException(
89
+						"Error setting '{$wrapper}' wrapper context option '{$name}'"
90
+					);
91
+				}
92
+			}
93
+		}
94
+		set_error_handler(array($this, 'connectionWarningsHandler'));
95
+		$this->socket = stream_socket_client(
96
+			$address, $errno, $errstr, $timeout, STREAM_CLIENT_CONNECT, $context
97
+		);
98
+		restore_error_handler();
99
+		// if we fail to bind to a specified local address (see request #19515),
100
+		// connection still succeeds, albeit with a warning. Throw an Exception
101
+		// with the warning text in this case as that connection is unlikely
102
+		// to be what user wants and as Curl throws an error in similar case.
103
+		if ($this->connectionWarnings) {
104
+			if ($this->socket) {
105
+				fclose($this->socket);
106
+			}
107
+			$error = $errstr ? $errstr : implode("\n", $this->connectionWarnings);
108
+			throw new HTTP_Request2_ConnectionException(
109
+				"Unable to connect to {$address}. Error: {$error}", 0, $errno
110
+			);
111
+		}
112
+	}
113 113
 
114
-    /**
115
-     * Destructor, disconnects socket
116
-     */
117
-    public function __destruct()
118
-    {
119
-        fclose($this->socket);
120
-    }
114
+	/**
115
+	 * Destructor, disconnects socket
116
+	 */
117
+	public function __destruct()
118
+	{
119
+		fclose($this->socket);
120
+	}
121 121
 
122
-    /**
123
-     * Wrapper around fread(), handles global request timeout
124
-     *
125
-     * @param int $length Reads up to this number of bytes
126
-     *
127
-     * @return   string Data read from socket
128
-     * @throws   HTTP_Request2_MessageException     In case of timeout
129
-     */
130
-    public function read($length)
131
-    {
132
-        if ($this->deadline) {
133
-            stream_set_timeout($this->socket, max($this->deadline - time(), 1));
134
-        }
135
-        $data = fread($this->socket, $length);
136
-        $this->checkTimeout();
137
-        return $data;
138
-    }
122
+	/**
123
+	 * Wrapper around fread(), handles global request timeout
124
+	 *
125
+	 * @param int $length Reads up to this number of bytes
126
+	 *
127
+	 * @return   string Data read from socket
128
+	 * @throws   HTTP_Request2_MessageException     In case of timeout
129
+	 */
130
+	public function read($length)
131
+	{
132
+		if ($this->deadline) {
133
+			stream_set_timeout($this->socket, max($this->deadline - time(), 1));
134
+		}
135
+		$data = fread($this->socket, $length);
136
+		$this->checkTimeout();
137
+		return $data;
138
+	}
139 139
 
140
-    /**
141
-     * Reads until either the end of the socket or a newline, whichever comes first
142
-     *
143
-     * Strips the trailing newline from the returned data, handles global
144
-     * request timeout. Method idea borrowed from Net_Socket PEAR package.
145
-     *
146
-     * @param int $bufferSize   buffer size to use for reading
147
-     * @param int $localTimeout timeout value to use just for this call
148
-     *                          (used when waiting for "100 Continue" response)
149
-     *
150
-     * @return   string Available data up to the newline (not including newline)
151
-     * @throws   HTTP_Request2_MessageException     In case of timeout
152
-     */
153
-    public function readLine($bufferSize, $localTimeout = null)
154
-    {
155
-        $line = '';
156
-        while (!feof($this->socket)) {
157
-            if (null !== $localTimeout) {
158
-                stream_set_timeout($this->socket, $localTimeout);
159
-            } elseif ($this->deadline) {
160
-                stream_set_timeout($this->socket, max($this->deadline - time(), 1));
161
-            }
140
+	/**
141
+	 * Reads until either the end of the socket or a newline, whichever comes first
142
+	 *
143
+	 * Strips the trailing newline from the returned data, handles global
144
+	 * request timeout. Method idea borrowed from Net_Socket PEAR package.
145
+	 *
146
+	 * @param int $bufferSize   buffer size to use for reading
147
+	 * @param int $localTimeout timeout value to use just for this call
148
+	 *                          (used when waiting for "100 Continue" response)
149
+	 *
150
+	 * @return   string Available data up to the newline (not including newline)
151
+	 * @throws   HTTP_Request2_MessageException     In case of timeout
152
+	 */
153
+	public function readLine($bufferSize, $localTimeout = null)
154
+	{
155
+		$line = '';
156
+		while (!feof($this->socket)) {
157
+			if (null !== $localTimeout) {
158
+				stream_set_timeout($this->socket, $localTimeout);
159
+			} elseif ($this->deadline) {
160
+				stream_set_timeout($this->socket, max($this->deadline - time(), 1));
161
+			}
162 162
 
163
-            $line .= @fgets($this->socket, $bufferSize);
163
+			$line .= @fgets($this->socket, $bufferSize);
164 164
 
165
-            if (null === $localTimeout) {
166
-                $this->checkTimeout();
165
+			if (null === $localTimeout) {
166
+				$this->checkTimeout();
167 167
 
168
-            } else {
169
-                $info = stream_get_meta_data($this->socket);
170
-                // reset socket timeout if we don't have request timeout specified,
171
-                // prevents further calls failing with a bogus Exception
172
-                if (!$this->deadline) {
173
-                    $default = (int)@ini_get('default_socket_timeout');
174
-                    stream_set_timeout($this->socket, $default > 0 ? $default : PHP_INT_MAX);
175
-                }
176
-                if ($info['timed_out']) {
177
-                    throw new HTTP_Request2_MessageException(
178
-                        "readLine() call timed out", HTTP_Request2_Exception::TIMEOUT
179
-                    );
180
-                }
181
-            }
182
-            if (substr($line, -1) == "\n") {
183
-                return rtrim($line, "\r\n");
184
-            }
185
-        }
186
-        return $line;
187
-    }
168
+			} else {
169
+				$info = stream_get_meta_data($this->socket);
170
+				// reset socket timeout if we don't have request timeout specified,
171
+				// prevents further calls failing with a bogus Exception
172
+				if (!$this->deadline) {
173
+					$default = (int)@ini_get('default_socket_timeout');
174
+					stream_set_timeout($this->socket, $default > 0 ? $default : PHP_INT_MAX);
175
+				}
176
+				if ($info['timed_out']) {
177
+					throw new HTTP_Request2_MessageException(
178
+						"readLine() call timed out", HTTP_Request2_Exception::TIMEOUT
179
+					);
180
+				}
181
+			}
182
+			if (substr($line, -1) == "\n") {
183
+				return rtrim($line, "\r\n");
184
+			}
185
+		}
186
+		return $line;
187
+	}
188 188
 
189
-    /**
190
-     * Wrapper around fwrite(), handles global request timeout
191
-     *
192
-     * @param string $data String to be written
193
-     *
194
-     * @return int
195
-     * @throws HTTP_Request2_MessageException
196
-     */
197
-    public function write($data)
198
-    {
199
-        if ($this->deadline) {
200
-            stream_set_timeout($this->socket, max($this->deadline - time(), 1));
201
-        }
202
-        $written = fwrite($this->socket, $data);
203
-        $this->checkTimeout();
204
-        // http://www.php.net/manual/en/function.fwrite.php#96951
205
-        if ($written < strlen($data)) {
206
-            throw new HTTP_Request2_MessageException('Error writing request');
207
-        }
208
-        return $written;
209
-    }
189
+	/**
190
+	 * Wrapper around fwrite(), handles global request timeout
191
+	 *
192
+	 * @param string $data String to be written
193
+	 *
194
+	 * @return int
195
+	 * @throws HTTP_Request2_MessageException
196
+	 */
197
+	public function write($data)
198
+	{
199
+		if ($this->deadline) {
200
+			stream_set_timeout($this->socket, max($this->deadline - time(), 1));
201
+		}
202
+		$written = fwrite($this->socket, $data);
203
+		$this->checkTimeout();
204
+		// http://www.php.net/manual/en/function.fwrite.php#96951
205
+		if ($written < strlen($data)) {
206
+			throw new HTTP_Request2_MessageException('Error writing request');
207
+		}
208
+		return $written;
209
+	}
210 210
 
211
-    /**
212
-     * Tests for end-of-file on a socket
213
-     *
214
-     * @return bool
215
-     */
216
-    public function eof()
217
-    {
218
-        return feof($this->socket);
219
-    }
211
+	/**
212
+	 * Tests for end-of-file on a socket
213
+	 *
214
+	 * @return bool
215
+	 */
216
+	public function eof()
217
+	{
218
+		return feof($this->socket);
219
+	}
220 220
 
221
-    /**
222
-     * Sets request deadline
223
-     *
224
-     * @param int $deadline Exception will be thrown if request continues
225
-     *                      past this time
226
-     * @param int $timeout  Original request timeout value, to use in
227
-     *                      Exception message
228
-     */
229
-    public function setDeadline($deadline, $timeout)
230
-    {
231
-        $this->deadline = $deadline;
232
-        $this->timeout  = $timeout;
233
-    }
221
+	/**
222
+	 * Sets request deadline
223
+	 *
224
+	 * @param int $deadline Exception will be thrown if request continues
225
+	 *                      past this time
226
+	 * @param int $timeout  Original request timeout value, to use in
227
+	 *                      Exception message
228
+	 */
229
+	public function setDeadline($deadline, $timeout)
230
+	{
231
+		$this->deadline = $deadline;
232
+		$this->timeout  = $timeout;
233
+	}
234 234
 
235
-    /**
236
-     * Turns on encryption on a socket
237
-     *
238
-     * @throws HTTP_Request2_ConnectionException
239
-     */
240
-    public function enableCrypto()
241
-    {
242
-        $modes = array(
243
-            STREAM_CRYPTO_METHOD_TLS_CLIENT,
244
-            STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
245
-            STREAM_CRYPTO_METHOD_SSLv23_CLIENT,
246
-            STREAM_CRYPTO_METHOD_SSLv2_CLIENT
247
-        );
235
+	/**
236
+	 * Turns on encryption on a socket
237
+	 *
238
+	 * @throws HTTP_Request2_ConnectionException
239
+	 */
240
+	public function enableCrypto()
241
+	{
242
+		$modes = array(
243
+			STREAM_CRYPTO_METHOD_TLS_CLIENT,
244
+			STREAM_CRYPTO_METHOD_SSLv3_CLIENT,
245
+			STREAM_CRYPTO_METHOD_SSLv23_CLIENT,
246
+			STREAM_CRYPTO_METHOD_SSLv2_CLIENT
247
+		);
248 248
 
249
-        foreach ($modes as $mode) {
250
-            if (stream_socket_enable_crypto($this->socket, true, $mode)) {
251
-                return;
252
-            }
253
-        }
254
-        throw new HTTP_Request2_ConnectionException(
255
-            'Failed to enable secure connection when connecting through proxy'
256
-        );
257
-    }
249
+		foreach ($modes as $mode) {
250
+			if (stream_socket_enable_crypto($this->socket, true, $mode)) {
251
+				return;
252
+			}
253
+		}
254
+		throw new HTTP_Request2_ConnectionException(
255
+			'Failed to enable secure connection when connecting through proxy'
256
+		);
257
+	}
258 258
 
259
-    /**
260
-     * Throws an Exception if stream timed out
261
-     *
262
-     * @throws HTTP_Request2_MessageException
263
-     */
264
-    protected function checkTimeout()
265
-    {
266
-        $info = stream_get_meta_data($this->socket);
267
-        if ($info['timed_out'] || $this->deadline && time() > $this->deadline) {
268
-            $reason = $this->deadline
269
-                ? "after {$this->timeout} second(s)"
270
-                : 'due to default_socket_timeout php.ini setting';
271
-            throw new HTTP_Request2_MessageException(
272
-                "Request timed out {$reason}", HTTP_Request2_Exception::TIMEOUT
273
-            );
274
-        }
275
-    }
259
+	/**
260
+	 * Throws an Exception if stream timed out
261
+	 *
262
+	 * @throws HTTP_Request2_MessageException
263
+	 */
264
+	protected function checkTimeout()
265
+	{
266
+		$info = stream_get_meta_data($this->socket);
267
+		if ($info['timed_out'] || $this->deadline && time() > $this->deadline) {
268
+			$reason = $this->deadline
269
+				? "after {$this->timeout} second(s)"
270
+				: 'due to default_socket_timeout php.ini setting';
271
+			throw new HTTP_Request2_MessageException(
272
+				"Request timed out {$reason}", HTTP_Request2_Exception::TIMEOUT
273
+			);
274
+		}
275
+	}
276 276
 
277
-    /**
278
-     * Error handler to use during stream_socket_client() call
279
-     *
280
-     * One stream_socket_client() call may produce *multiple* PHP warnings
281
-     * (especially OpenSSL-related), we keep them in an array to later use for
282
-     * the message of HTTP_Request2_ConnectionException
283
-     *
284
-     * @param int    $errno  error level
285
-     * @param string $errstr error message
286
-     *
287
-     * @return bool
288
-     */
289
-    protected function connectionWarningsHandler($errno, $errstr)
290
-    {
291
-        if ($errno & E_WARNING) {
292
-            array_unshift($this->connectionWarnings, $errstr);
293
-        }
294
-        return true;
295
-    }
277
+	/**
278
+	 * Error handler to use during stream_socket_client() call
279
+	 *
280
+	 * One stream_socket_client() call may produce *multiple* PHP warnings
281
+	 * (especially OpenSSL-related), we keep them in an array to later use for
282
+	 * the message of HTTP_Request2_ConnectionException
283
+	 *
284
+	 * @param int    $errno  error level
285
+	 * @param string $errstr error message
286
+	 *
287
+	 * @return bool
288
+	 */
289
+	protected function connectionWarningsHandler($errno, $errstr)
290
+	{
291
+		if ($errno & E_WARNING) {
292
+			array_unshift($this->connectionWarnings, $errstr);
293
+		}
294
+		return true;
295
+	}
296 296
 }
297 297
 ?>
Please login to merge, or discard this patch.
libs/PEAR.1.9/HTTP/Request2/MultipartBody.php 2 patches
Indentation   +126 added lines, -126 removed lines patch added patch discarded remove patch
@@ -59,31 +59,31 @@  discard block
 block discarded – undo
59 59
     * MIME boundary
60 60
     * @var  string
61 61
     */
62
-    private $_boundary;
62
+	private $_boundary;
63 63
 
64 64
    /**
65 65
     * Form parameters added via {@link HTTP_Request2::addPostParameter()}
66 66
     * @var  array
67 67
     */
68
-    private $_params = array();
68
+	private $_params = array();
69 69
 
70 70
    /**
71 71
     * File uploads added via {@link HTTP_Request2::addUpload()}
72 72
     * @var  array
73 73
     */
74
-    private $_uploads = array();
74
+	private $_uploads = array();
75 75
 
76 76
    /**
77 77
     * Header for parts with parameters
78 78
     * @var  string
79 79
     */
80
-    private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n";
80
+	private $_headerParam = "--%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n";
81 81
 
82 82
    /**
83 83
     * Header for parts with uploads
84 84
     * @var  string
85 85
     */
86
-    private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n";
86
+	private $_headerUpload = "--%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: %s\r\n\r\n";
87 87
 
88 88
    /**
89 89
     * Current position in parameter and upload arrays
@@ -93,7 +93,7 @@  discard block
 block discarded – undo
93 93
     *
94 94
     * @var  array
95 95
     */
96
-    private $_pos = array(0, 0);
96
+	private $_pos = array(0, 0);
97 97
 
98 98
 
99 99
    /**
@@ -103,59 +103,59 @@  discard block
 block discarded – undo
103 103
     * @param    array   file uploads set via {@link HTTP_Request2::addUpload()}
104 104
     * @param    bool    whether to append brackets to array variable names
105 105
     */
106
-    public function __construct(array $params, array $uploads, $useBrackets = true)
107
-    {
108
-        $this->_params = self::_flattenArray('', $params, $useBrackets);
109
-        foreach ($uploads as $fieldName => $f) {
110
-            if (!is_array($f['fp'])) {
111
-                $this->_uploads[] = $f + array('name' => $fieldName);
112
-            } else {
113
-                for ($i = 0; $i < count($f['fp']); $i++) {
114
-                    $upload = array(
115
-                        'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
116
-                    );
117
-                    foreach (array('fp', 'filename', 'size', 'type') as $key) {
118
-                        $upload[$key] = $f[$key][$i];
119
-                    }
120
-                    $this->_uploads[] = $upload;
121
-                }
122
-            }
123
-        }
124
-    }
106
+	public function __construct(array $params, array $uploads, $useBrackets = true)
107
+	{
108
+		$this->_params = self::_flattenArray('', $params, $useBrackets);
109
+		foreach ($uploads as $fieldName => $f) {
110
+			if (!is_array($f['fp'])) {
111
+				$this->_uploads[] = $f + array('name' => $fieldName);
112
+			} else {
113
+				for ($i = 0; $i < count($f['fp']); $i++) {
114
+					$upload = array(
115
+						'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
116
+					);
117
+					foreach (array('fp', 'filename', 'size', 'type') as $key) {
118
+						$upload[$key] = $f[$key][$i];
119
+					}
120
+					$this->_uploads[] = $upload;
121
+				}
122
+			}
123
+		}
124
+	}
125 125
 
126 126
    /**
127 127
     * Returns the length of the body to use in Content-Length header
128 128
     *
129 129
     * @return   integer
130 130
     */
131
-    public function getLength()
132
-    {
133
-        $boundaryLength     = strlen($this->getBoundary());
134
-        $headerParamLength  = strlen($this->_headerParam) - 4 + $boundaryLength;
135
-        $headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength;
136
-        $length             = $boundaryLength + 6;
137
-        foreach ($this->_params as $p) {
138
-            $length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2;
139
-        }
140
-        foreach ($this->_uploads as $u) {
141
-            $length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) +
142
-                       strlen($u['filename']) + $u['size'] + 2;
143
-        }
144
-        return $length;
145
-    }
131
+	public function getLength()
132
+	{
133
+		$boundaryLength     = strlen($this->getBoundary());
134
+		$headerParamLength  = strlen($this->_headerParam) - 4 + $boundaryLength;
135
+		$headerUploadLength = strlen($this->_headerUpload) - 8 + $boundaryLength;
136
+		$length             = $boundaryLength + 6;
137
+		foreach ($this->_params as $p) {
138
+			$length += $headerParamLength + strlen($p[0]) + strlen($p[1]) + 2;
139
+		}
140
+		foreach ($this->_uploads as $u) {
141
+			$length += $headerUploadLength + strlen($u['name']) + strlen($u['type']) +
142
+					   strlen($u['filename']) + $u['size'] + 2;
143
+		}
144
+		return $length;
145
+	}
146 146
 
147 147
    /**
148 148
     * Returns the boundary to use in Content-Type header
149 149
     *
150 150
     * @return   string
151 151
     */
152
-    public function getBoundary()
153
-    {
154
-        if (empty($this->_boundary)) {
155
-            $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
156
-        }
157
-        return $this->_boundary;
158
-    }
152
+	public function getBoundary()
153
+	{
154
+		if (empty($this->_boundary)) {
155
+			$this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
156
+		}
157
+		return $this->_boundary;
158
+	}
159 159
 
160 160
    /**
161 161
     * Returns next chunk of request body
@@ -163,69 +163,69 @@  discard block
 block discarded – undo
163 163
     * @param    integer Amount of bytes to read
164 164
     * @return   string  Up to $length bytes of data, empty string if at end
165 165
     */
166
-    public function read($length)
167
-    {
168
-        $ret         = '';
169
-        $boundary    = $this->getBoundary();
170
-        $paramCount  = count($this->_params);
171
-        $uploadCount = count($this->_uploads);
172
-        while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) {
173
-            $oldLength = $length;
174
-            if ($this->_pos[0] < $paramCount) {
175
-                $param = sprintf($this->_headerParam, $boundary,
176
-                                 $this->_params[$this->_pos[0]][0]) .
177
-                         $this->_params[$this->_pos[0]][1] . "\r\n";
178
-                $ret    .= substr($param, $this->_pos[1], $length);
179
-                $length -= min(strlen($param) - $this->_pos[1], $length);
166
+	public function read($length)
167
+	{
168
+		$ret         = '';
169
+		$boundary    = $this->getBoundary();
170
+		$paramCount  = count($this->_params);
171
+		$uploadCount = count($this->_uploads);
172
+		while ($length > 0 && $this->_pos[0] <= $paramCount + $uploadCount) {
173
+			$oldLength = $length;
174
+			if ($this->_pos[0] < $paramCount) {
175
+				$param = sprintf($this->_headerParam, $boundary,
176
+								 $this->_params[$this->_pos[0]][0]) .
177
+						 $this->_params[$this->_pos[0]][1] . "\r\n";
178
+				$ret    .= substr($param, $this->_pos[1], $length);
179
+				$length -= min(strlen($param) - $this->_pos[1], $length);
180 180
 
181
-            } elseif ($this->_pos[0] < $paramCount + $uploadCount) {
182
-                $pos    = $this->_pos[0] - $paramCount;
183
-                $header = sprintf($this->_headerUpload, $boundary,
184
-                                  $this->_uploads[$pos]['name'],
185
-                                  $this->_uploads[$pos]['filename'],
186
-                                  $this->_uploads[$pos]['type']);
187
-                if ($this->_pos[1] < strlen($header)) {
188
-                    $ret    .= substr($header, $this->_pos[1], $length);
189
-                    $length -= min(strlen($header) - $this->_pos[1], $length);
190
-                }
191
-                $filePos  = max(0, $this->_pos[1] - strlen($header));
192
-                if ($length > 0 && $filePos < $this->_uploads[$pos]['size']) {
193
-                    $ret     .= fread($this->_uploads[$pos]['fp'], $length);
194
-                    $length  -= min($length, $this->_uploads[$pos]['size'] - $filePos);
195
-                }
196
-                if ($length > 0) {
197
-                    $start   = $this->_pos[1] + ($oldLength - $length) -
198
-                               strlen($header) - $this->_uploads[$pos]['size'];
199
-                    $ret    .= substr("\r\n", $start, $length);
200
-                    $length -= min(2 - $start, $length);
201
-                }
181
+			} elseif ($this->_pos[0] < $paramCount + $uploadCount) {
182
+				$pos    = $this->_pos[0] - $paramCount;
183
+				$header = sprintf($this->_headerUpload, $boundary,
184
+								  $this->_uploads[$pos]['name'],
185
+								  $this->_uploads[$pos]['filename'],
186
+								  $this->_uploads[$pos]['type']);
187
+				if ($this->_pos[1] < strlen($header)) {
188
+					$ret    .= substr($header, $this->_pos[1], $length);
189
+					$length -= min(strlen($header) - $this->_pos[1], $length);
190
+				}
191
+				$filePos  = max(0, $this->_pos[1] - strlen($header));
192
+				if ($length > 0 && $filePos < $this->_uploads[$pos]['size']) {
193
+					$ret     .= fread($this->_uploads[$pos]['fp'], $length);
194
+					$length  -= min($length, $this->_uploads[$pos]['size'] - $filePos);
195
+				}
196
+				if ($length > 0) {
197
+					$start   = $this->_pos[1] + ($oldLength - $length) -
198
+							   strlen($header) - $this->_uploads[$pos]['size'];
199
+					$ret    .= substr("\r\n", $start, $length);
200
+					$length -= min(2 - $start, $length);
201
+				}
202 202
 
203
-            } else {
204
-                $closing  = '--' . $boundary . "--\r\n";
205
-                $ret     .= substr($closing, $this->_pos[1], $length);
206
-                $length  -= min(strlen($closing) - $this->_pos[1], $length);
207
-            }
208
-            if ($length > 0) {
209
-                $this->_pos     = array($this->_pos[0] + 1, 0);
210
-            } else {
211
-                $this->_pos[1] += $oldLength;
212
-            }
213
-        }
214
-        return $ret;
215
-    }
203
+			} else {
204
+				$closing  = '--' . $boundary . "--\r\n";
205
+				$ret     .= substr($closing, $this->_pos[1], $length);
206
+				$length  -= min(strlen($closing) - $this->_pos[1], $length);
207
+			}
208
+			if ($length > 0) {
209
+				$this->_pos     = array($this->_pos[0] + 1, 0);
210
+			} else {
211
+				$this->_pos[1] += $oldLength;
212
+			}
213
+		}
214
+		return $ret;
215
+	}
216 216
 
217 217
    /**
218 218
     * Sets the current position to the start of the body
219 219
     *
220 220
     * This allows reusing the same body in another request
221 221
     */
222
-    public function rewind()
223
-    {
224
-        $this->_pos = array(0, 0);
225
-        foreach ($this->_uploads as $u) {
226
-            rewind($u['fp']);
227
-        }
228
-    }
222
+	public function rewind()
223
+	{
224
+		$this->_pos = array(0, 0);
225
+		foreach ($this->_uploads as $u) {
226
+			rewind($u['fp']);
227
+		}
228
+	}
229 229
 
230 230
    /**
231 231
     * Returns the body as string
@@ -235,11 +235,11 @@  discard block
 block discarded – undo
235 235
     *
236 236
     * @return   string
237 237
     */
238
-    public function __toString()
239
-    {
240
-        $this->rewind();
241
-        return $this->read($this->getLength());
242
-    }
238
+	public function __toString()
239
+	{
240
+		$this->rewind();
241
+		return $this->read($this->getLength());
242
+	}
243 243
 
244 244
 
245 245
    /**
@@ -251,24 +251,24 @@  discard block
 block discarded – undo
251 251
     * @param    bool    whether to append [] to array variables' names
252 252
     * @return   array   array with the following items: array('item name', 'item value');
253 253
     */
254
-    private static function _flattenArray($name, $values, $useBrackets)
255
-    {
256
-        if (!is_array($values)) {
257
-            return array(array($name, $values));
258
-        } else {
259
-            $ret = array();
260
-            foreach ($values as $k => $v) {
261
-                if (empty($name)) {
262
-                    $newName = $k;
263
-                } elseif ($useBrackets) {
264
-                    $newName = $name . '[' . $k . ']';
265
-                } else {
266
-                    $newName = $name;
267
-                }
268
-                $ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets));
269
-            }
270
-            return $ret;
271
-        }
272
-    }
254
+	private static function _flattenArray($name, $values, $useBrackets)
255
+	{
256
+		if (!is_array($values)) {
257
+			return array(array($name, $values));
258
+		} else {
259
+			$ret = array();
260
+			foreach ($values as $k => $v) {
261
+				if (empty($name)) {
262
+					$newName = $k;
263
+				} elseif ($useBrackets) {
264
+					$newName = $name . '[' . $k . ']';
265
+				} else {
266
+					$newName = $name;
267
+				}
268
+				$ret = array_merge($ret, self::_flattenArray($newName, $v, $useBrackets));
269
+			}
270
+			return $ret;
271
+		}
272
+	}
273 273
 }
274 274
 ?>
Please login to merge, or discard this patch.
Spacing   +7 added lines, -7 removed lines patch added patch discarded remove patch
@@ -112,7 +112,7 @@  discard block
 block discarded – undo
112 112
             } else {
113 113
                 for ($i = 0; $i < count($f['fp']); $i++) {
114 114
                     $upload = array(
115
-                        'name' => ($useBrackets? $fieldName . '[' . $i . ']': $fieldName)
115
+                        'name' => ($useBrackets ? $fieldName.'['.$i.']' : $fieldName)
116 116
                     );
117 117
                     foreach (array('fp', 'filename', 'size', 'type') as $key) {
118 118
                         $upload[$key] = $f[$key][$i];
@@ -152,7 +152,7 @@  discard block
 block discarded – undo
152 152
     public function getBoundary()
153 153
     {
154 154
         if (empty($this->_boundary)) {
155
-            $this->_boundary = '--' . md5('PEAR-HTTP_Request2-' . microtime());
155
+            $this->_boundary = '--'.md5('PEAR-HTTP_Request2-'.microtime());
156 156
         }
157 157
         return $this->_boundary;
158 158
     }
@@ -173,8 +173,8 @@  discard block
 block discarded – undo
173 173
             $oldLength = $length;
174 174
             if ($this->_pos[0] < $paramCount) {
175 175
                 $param = sprintf($this->_headerParam, $boundary,
176
-                                 $this->_params[$this->_pos[0]][0]) .
177
-                         $this->_params[$this->_pos[0]][1] . "\r\n";
176
+                                 $this->_params[$this->_pos[0]][0]).
177
+                         $this->_params[$this->_pos[0]][1]."\r\n";
178 178
                 $ret    .= substr($param, $this->_pos[1], $length);
179 179
                 $length -= min(strlen($param) - $this->_pos[1], $length);
180 180
 
@@ -188,7 +188,7 @@  discard block
 block discarded – undo
188 188
                     $ret    .= substr($header, $this->_pos[1], $length);
189 189
                     $length -= min(strlen($header) - $this->_pos[1], $length);
190 190
                 }
191
-                $filePos  = max(0, $this->_pos[1] - strlen($header));
191
+                $filePos = max(0, $this->_pos[1] - strlen($header));
192 192
                 if ($length > 0 && $filePos < $this->_uploads[$pos]['size']) {
193 193
                     $ret     .= fread($this->_uploads[$pos]['fp'], $length);
194 194
                     $length  -= min($length, $this->_uploads[$pos]['size'] - $filePos);
@@ -201,7 +201,7 @@  discard block
 block discarded – undo
201 201
                 }
202 202
 
203 203
             } else {
204
-                $closing  = '--' . $boundary . "--\r\n";
204
+                $closing  = '--'.$boundary."--\r\n";
205 205
                 $ret     .= substr($closing, $this->_pos[1], $length);
206 206
                 $length  -= min(strlen($closing) - $this->_pos[1], $length);
207 207
             }
@@ -261,7 +261,7 @@  discard block
 block discarded – undo
261 261
                 if (empty($name)) {
262 262
                     $newName = $k;
263 263
                 } elseif ($useBrackets) {
264
-                    $newName = $name . '[' . $k . ']';
264
+                    $newName = $name.'['.$k.']';
265 265
                 } else {
266 266
                     $newName = $name;
267 267
                 }
Please login to merge, or discard this patch.
libs/PEAR.1.9/HTTP/Request2/Observer/Log.php 3 patches
Switch Indentation   +30 added lines, -30 removed lines patch added patch discarded remove patch
@@ -157,36 +157,36 @@
 block discarded – undo
157 157
         }
158 158
 
159 159
         switch ($event['name']) {
160
-        case 'connect':
161
-            $this->log('* Connected to ' . $event['data']);
162
-            break;
163
-        case 'sentHeaders':
164
-            $headers = explode("\r\n", $event['data']);
165
-            array_pop($headers);
166
-            foreach ($headers as $header) {
167
-                $this->log('> ' . $header);
168
-            }
169
-            break;
170
-        case 'sentBodyPart':
171
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
172
-            break;
173
-        case 'receivedHeaders':
174
-            $this->log(sprintf('< HTTP/%s %s %s',
175
-                $event['data']->getVersion(),
176
-                $event['data']->getStatus(),
177
-                $event['data']->getReasonPhrase()));
178
-            $headers = $event['data']->getHeader();
179
-            foreach ($headers as $key => $val) {
180
-                $this->log('< ' . $key . ': ' . $val);
181
-            }
182
-            $this->log('< ');
183
-            break;
184
-        case 'receivedBody':
185
-            $this->log($event['data']->getBody());
186
-            break;
187
-        case 'disconnect':
188
-            $this->log('* Disconnected');
189
-            break;
160
+        	case 'connect':
161
+            	$this->log('* Connected to ' . $event['data']);
162
+            	break;
163
+        	case 'sentHeaders':
164
+            	$headers = explode("\r\n", $event['data']);
165
+            	array_pop($headers);
166
+            	foreach ($headers as $header) {
167
+                	$this->log('> ' . $header);
168
+            	}
169
+            	break;
170
+        	case 'sentBodyPart':
171
+            	$this->log('> ' . $event['data'] . ' byte(s) sent');
172
+            	break;
173
+        	case 'receivedHeaders':
174
+            	$this->log(sprintf('< HTTP/%s %s %s',
175
+                	$event['data']->getVersion(),
176
+                	$event['data']->getStatus(),
177
+                	$event['data']->getReasonPhrase()));
178
+            	$headers = $event['data']->getHeader();
179
+            	foreach ($headers as $key => $val) {
180
+                	$this->log('< ' . $key . ': ' . $val);
181
+            	}
182
+            	$this->log('< ');
183
+            	break;
184
+        	case 'receivedBody':
185
+            	$this->log($event['data']->getBody());
186
+            	break;
187
+        	case 'disconnect':
188
+            	$this->log('* Disconnected');
189
+            	break;
190 190
         }
191 191
     }
192 192
 
Please login to merge, or discard this patch.
Indentation   +108 added lines, -108 removed lines patch added patch discarded remove patch
@@ -92,124 +92,124 @@
 block discarded – undo
92 92
  */
93 93
 class HTTP_Request2_Observer_Log implements SplObserver
94 94
 {
95
-    // properties {{{
95
+	// properties {{{
96 96
 
97
-    /**
98
-     * The log target, it can be a a resource or a PEAR Log instance.
99
-     *
100
-     * @var resource|Log $target
101
-     */
102
-    protected $target = null;
97
+	/**
98
+	 * The log target, it can be a a resource or a PEAR Log instance.
99
+	 *
100
+	 * @var resource|Log $target
101
+	 */
102
+	protected $target = null;
103 103
 
104
-    /**
105
-     * The events to log.
106
-     *
107
-     * @var array $events
108
-     */
109
-    public $events = array(
110
-        'connect',
111
-        'sentHeaders',
112
-        'sentBodyPart',
113
-        'receivedHeaders',
114
-        'receivedBody',
115
-        'disconnect',
116
-    );
104
+	/**
105
+	 * The events to log.
106
+	 *
107
+	 * @var array $events
108
+	 */
109
+	public $events = array(
110
+		'connect',
111
+		'sentHeaders',
112
+		'sentBodyPart',
113
+		'receivedHeaders',
114
+		'receivedBody',
115
+		'disconnect',
116
+	);
117 117
 
118
-    // }}}
119
-    // __construct() {{{
118
+	// }}}
119
+	// __construct() {{{
120 120
 
121
-    /**
122
-     * Constructor.
123
-     *
124
-     * @param mixed $target Can be a file path (default: php://output), a resource,
125
-     *                      or an instance of the PEAR Log class.
126
-     * @param array $events Array of events to listen to (default: all events)
127
-     *
128
-     * @return void
129
-     */
130
-    public function __construct($target = 'php://output', array $events = array())
131
-    {
132
-        if (!empty($events)) {
133
-            $this->events = $events;
134
-        }
135
-        if (is_resource($target) || $target instanceof Log) {
136
-            $this->target = $target;
137
-        } elseif (false === ($this->target = @fopen($target, 'ab'))) {
138
-            throw new HTTP_Request2_Exception("Unable to open '{$target}'");
139
-        }
140
-    }
121
+	/**
122
+	 * Constructor.
123
+	 *
124
+	 * @param mixed $target Can be a file path (default: php://output), a resource,
125
+	 *                      or an instance of the PEAR Log class.
126
+	 * @param array $events Array of events to listen to (default: all events)
127
+	 *
128
+	 * @return void
129
+	 */
130
+	public function __construct($target = 'php://output', array $events = array())
131
+	{
132
+		if (!empty($events)) {
133
+			$this->events = $events;
134
+		}
135
+		if (is_resource($target) || $target instanceof Log) {
136
+			$this->target = $target;
137
+		} elseif (false === ($this->target = @fopen($target, 'ab'))) {
138
+			throw new HTTP_Request2_Exception("Unable to open '{$target}'");
139
+		}
140
+	}
141 141
 
142
-    // }}}
143
-    // update() {{{
142
+	// }}}
143
+	// update() {{{
144 144
 
145
-    /**
146
-     * Called when the request notifies us of an event.
147
-     *
148
-     * @param HTTP_Request2 $subject The HTTP_Request2 instance
149
-     *
150
-     * @return void
151
-     */
152
-    public function update(SplSubject $subject)
153
-    {
154
-        $event = $subject->getLastEvent();
155
-        if (!in_array($event['name'], $this->events)) {
156
-            return;
157
-        }
145
+	/**
146
+	 * Called when the request notifies us of an event.
147
+	 *
148
+	 * @param HTTP_Request2 $subject The HTTP_Request2 instance
149
+	 *
150
+	 * @return void
151
+	 */
152
+	public function update(SplSubject $subject)
153
+	{
154
+		$event = $subject->getLastEvent();
155
+		if (!in_array($event['name'], $this->events)) {
156
+			return;
157
+		}
158 158
 
159
-        switch ($event['name']) {
160
-        case 'connect':
161
-            $this->log('* Connected to ' . $event['data']);
162
-            break;
163
-        case 'sentHeaders':
164
-            $headers = explode("\r\n", $event['data']);
165
-            array_pop($headers);
166
-            foreach ($headers as $header) {
167
-                $this->log('> ' . $header);
168
-            }
169
-            break;
170
-        case 'sentBodyPart':
171
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
172
-            break;
173
-        case 'receivedHeaders':
174
-            $this->log(sprintf('< HTTP/%s %s %s',
175
-                $event['data']->getVersion(),
176
-                $event['data']->getStatus(),
177
-                $event['data']->getReasonPhrase()));
178
-            $headers = $event['data']->getHeader();
179
-            foreach ($headers as $key => $val) {
180
-                $this->log('< ' . $key . ': ' . $val);
181
-            }
182
-            $this->log('< ');
183
-            break;
184
-        case 'receivedBody':
185
-            $this->log($event['data']->getBody());
186
-            break;
187
-        case 'disconnect':
188
-            $this->log('* Disconnected');
189
-            break;
190
-        }
191
-    }
159
+		switch ($event['name']) {
160
+		case 'connect':
161
+			$this->log('* Connected to ' . $event['data']);
162
+			break;
163
+		case 'sentHeaders':
164
+			$headers = explode("\r\n", $event['data']);
165
+			array_pop($headers);
166
+			foreach ($headers as $header) {
167
+				$this->log('> ' . $header);
168
+			}
169
+			break;
170
+		case 'sentBodyPart':
171
+			$this->log('> ' . $event['data'] . ' byte(s) sent');
172
+			break;
173
+		case 'receivedHeaders':
174
+			$this->log(sprintf('< HTTP/%s %s %s',
175
+				$event['data']->getVersion(),
176
+				$event['data']->getStatus(),
177
+				$event['data']->getReasonPhrase()));
178
+			$headers = $event['data']->getHeader();
179
+			foreach ($headers as $key => $val) {
180
+				$this->log('< ' . $key . ': ' . $val);
181
+			}
182
+			$this->log('< ');
183
+			break;
184
+		case 'receivedBody':
185
+			$this->log($event['data']->getBody());
186
+			break;
187
+		case 'disconnect':
188
+			$this->log('* Disconnected');
189
+			break;
190
+		}
191
+	}
192 192
 
193
-    // }}}
194
-    // log() {{{
193
+	// }}}
194
+	// log() {{{
195 195
 
196
-    /**
197
-     * Logs the given message to the configured target.
198
-     *
199
-     * @param string $message Message to display
200
-     *
201
-     * @return void
202
-     */
203
-    protected function log($message)
204
-    {
205
-        if ($this->target instanceof Log) {
206
-            $this->target->debug($message);
207
-        } elseif (is_resource($this->target)) {
208
-            fwrite($this->target, $message . "\r\n");
209
-        }
210
-    }
196
+	/**
197
+	 * Logs the given message to the configured target.
198
+	 *
199
+	 * @param string $message Message to display
200
+	 *
201
+	 * @return void
202
+	 */
203
+	protected function log($message)
204
+	{
205
+		if ($this->target instanceof Log) {
206
+			$this->target->debug($message);
207
+		} elseif (is_resource($this->target)) {
208
+			fwrite($this->target, $message . "\r\n");
209
+		}
210
+	}
211 211
 
212
-    // }}}
212
+	// }}}
213 213
 }
214 214
 
215 215
 ?>
216 216
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -158,17 +158,17 @@  discard block
 block discarded – undo
158 158
 
159 159
         switch ($event['name']) {
160 160
         case 'connect':
161
-            $this->log('* Connected to ' . $event['data']);
161
+            $this->log('* Connected to '.$event['data']);
162 162
             break;
163 163
         case 'sentHeaders':
164 164
             $headers = explode("\r\n", $event['data']);
165 165
             array_pop($headers);
166 166
             foreach ($headers as $header) {
167
-                $this->log('> ' . $header);
167
+                $this->log('> '.$header);
168 168
             }
169 169
             break;
170 170
         case 'sentBodyPart':
171
-            $this->log('> ' . $event['data'] . ' byte(s) sent');
171
+            $this->log('> '.$event['data'].' byte(s) sent');
172 172
             break;
173 173
         case 'receivedHeaders':
174 174
             $this->log(sprintf('< HTTP/%s %s %s',
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
                 $event['data']->getReasonPhrase()));
178 178
             $headers = $event['data']->getHeader();
179 179
             foreach ($headers as $key => $val) {
180
-                $this->log('< ' . $key . ': ' . $val);
180
+                $this->log('< '.$key.': '.$val);
181 181
             }
182 182
             $this->log('< ');
183 183
             break;
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         if ($this->target instanceof Log) {
206 206
             $this->target->debug($message);
207 207
         } elseif (is_resource($this->target)) {
208
-            fwrite($this->target, $message . "\r\n");
208
+            fwrite($this->target, $message."\r\n");
209 209
         }
210 210
     }
211 211
 
Please login to merge, or discard this patch.
libs/PEAR.1.9/HTTP/Request2/Response.php 2 patches
Indentation   +330 added lines, -330 removed lines patch added patch discarded remove patch
@@ -79,33 +79,33 @@  discard block
 block discarded – undo
79 79
     * HTTP protocol version (e.g. 1.0, 1.1)
80 80
     * @var  string
81 81
     */
82
-    protected $version;
82
+	protected $version;
83 83
 
84 84
    /**
85 85
     * Status code
86 86
     * @var  integer
87 87
     * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
88 88
     */
89
-    protected $code;
89
+	protected $code;
90 90
 
91 91
    /**
92 92
     * Reason phrase
93 93
     * @var  string
94 94
     * @link http://tools.ietf.org/html/rfc2616#section-6.1.1
95 95
     */
96
-    protected $reasonPhrase;
96
+	protected $reasonPhrase;
97 97
 
98 98
    /**
99 99
     * Associative array of response headers
100 100
     * @var  array
101 101
     */
102
-    protected $headers = array();
102
+	protected $headers = array();
103 103
 
104 104
    /**
105 105
     * Cookies set in the response
106 106
     * @var  array
107 107
     */
108
-    protected $cookies = array();
108
+	protected $cookies = array();
109 109
 
110 110
    /**
111 111
     * Name of last header processed by parseHederLine()
@@ -114,13 +114,13 @@  discard block
 block discarded – undo
114 114
     *
115 115
     * @var  string
116 116
     */
117
-    protected $lastHeader = null;
117
+	protected $lastHeader = null;
118 118
 
119 119
    /**
120 120
     * Response body
121 121
     * @var  string
122 122
     */
123
-    protected $body = '';
123
+	protected $body = '';
124 124
 
125 125
    /**
126 126
     * Whether the body is still encoded by Content-Encoding
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
     *
131 131
     * @var  bool
132 132
     */
133
-    protected $bodyEncoded;
133
+	protected $bodyEncoded;
134 134
 
135 135
    /**
136 136
     * Associative array of HTTP status code / reason phrase.
@@ -138,64 +138,64 @@  discard block
 block discarded – undo
138 138
     * @var  array
139 139
     * @link http://tools.ietf.org/html/rfc2616#section-10
140 140
     */
141
-    protected static $phrases = array(
142
-
143
-        // 1xx: Informational - Request received, continuing process
144
-        100 => 'Continue',
145
-        101 => 'Switching Protocols',
146
-
147
-        // 2xx: Success - The action was successfully received, understood and
148
-        // accepted
149
-        200 => 'OK',
150
-        201 => 'Created',
151
-        202 => 'Accepted',
152
-        203 => 'Non-Authoritative Information',
153
-        204 => 'No Content',
154
-        205 => 'Reset Content',
155
-        206 => 'Partial Content',
156
-
157
-        // 3xx: Redirection - Further action must be taken in order to complete
158
-        // the request
159
-        300 => 'Multiple Choices',
160
-        301 => 'Moved Permanently',
161
-        302 => 'Found',  // 1.1
162
-        303 => 'See Other',
163
-        304 => 'Not Modified',
164
-        305 => 'Use Proxy',
165
-        307 => 'Temporary Redirect',
166
-
167
-        // 4xx: Client Error - The request contains bad syntax or cannot be
168
-        // fulfilled
169
-        400 => 'Bad Request',
170
-        401 => 'Unauthorized',
171
-        402 => 'Payment Required',
172
-        403 => 'Forbidden',
173
-        404 => 'Not Found',
174
-        405 => 'Method Not Allowed',
175
-        406 => 'Not Acceptable',
176
-        407 => 'Proxy Authentication Required',
177
-        408 => 'Request Timeout',
178
-        409 => 'Conflict',
179
-        410 => 'Gone',
180
-        411 => 'Length Required',
181
-        412 => 'Precondition Failed',
182
-        413 => 'Request Entity Too Large',
183
-        414 => 'Request-URI Too Long',
184
-        415 => 'Unsupported Media Type',
185
-        416 => 'Requested Range Not Satisfiable',
186
-        417 => 'Expectation Failed',
187
-
188
-        // 5xx: Server Error - The server failed to fulfill an apparently
189
-        // valid request
190
-        500 => 'Internal Server Error',
191
-        501 => 'Not Implemented',
192
-        502 => 'Bad Gateway',
193
-        503 => 'Service Unavailable',
194
-        504 => 'Gateway Timeout',
195
-        505 => 'HTTP Version Not Supported',
196
-        509 => 'Bandwidth Limit Exceeded',
197
-
198
-    );
141
+	protected static $phrases = array(
142
+
143
+		// 1xx: Informational - Request received, continuing process
144
+		100 => 'Continue',
145
+		101 => 'Switching Protocols',
146
+
147
+		// 2xx: Success - The action was successfully received, understood and
148
+		// accepted
149
+		200 => 'OK',
150
+		201 => 'Created',
151
+		202 => 'Accepted',
152
+		203 => 'Non-Authoritative Information',
153
+		204 => 'No Content',
154
+		205 => 'Reset Content',
155
+		206 => 'Partial Content',
156
+
157
+		// 3xx: Redirection - Further action must be taken in order to complete
158
+		// the request
159
+		300 => 'Multiple Choices',
160
+		301 => 'Moved Permanently',
161
+		302 => 'Found',  // 1.1
162
+		303 => 'See Other',
163
+		304 => 'Not Modified',
164
+		305 => 'Use Proxy',
165
+		307 => 'Temporary Redirect',
166
+
167
+		// 4xx: Client Error - The request contains bad syntax or cannot be
168
+		// fulfilled
169
+		400 => 'Bad Request',
170
+		401 => 'Unauthorized',
171
+		402 => 'Payment Required',
172
+		403 => 'Forbidden',
173
+		404 => 'Not Found',
174
+		405 => 'Method Not Allowed',
175
+		406 => 'Not Acceptable',
176
+		407 => 'Proxy Authentication Required',
177
+		408 => 'Request Timeout',
178
+		409 => 'Conflict',
179
+		410 => 'Gone',
180
+		411 => 'Length Required',
181
+		412 => 'Precondition Failed',
182
+		413 => 'Request Entity Too Large',
183
+		414 => 'Request-URI Too Long',
184
+		415 => 'Unsupported Media Type',
185
+		416 => 'Requested Range Not Satisfiable',
186
+		417 => 'Expectation Failed',
187
+
188
+		// 5xx: Server Error - The server failed to fulfill an apparently
189
+		// valid request
190
+		500 => 'Internal Server Error',
191
+		501 => 'Not Implemented',
192
+		502 => 'Bad Gateway',
193
+		503 => 'Service Unavailable',
194
+		504 => 'Gateway Timeout',
195
+		505 => 'HTTP Version Not Supported',
196
+		509 => 'Bandwidth Limit Exceeded',
197
+
198
+	);
199 199
 
200 200
    /**
201 201
     * Constructor, parses the response status line
@@ -204,20 +204,20 @@  discard block
 block discarded – undo
204 204
     * @param    bool    Whether body is still encoded by Content-Encoding
205 205
     * @throws   HTTP_Request2_Exception if status line is invalid according to spec
206 206
     */
207
-    public function __construct($statusLine, $bodyEncoded = true)
208
-    {
209
-        if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) {
210
-            throw new HTTP_Request2_Exception("Malformed response: {$statusLine}");
211
-        }
212
-        $this->version = $m[1];
213
-        $this->code    = intval($m[2]);
214
-        if (!empty($m[3])) {
215
-            $this->reasonPhrase = trim($m[3]);
216
-        } elseif (!empty(self::$phrases[$this->code])) {
217
-            $this->reasonPhrase = self::$phrases[$this->code];
218
-        }
219
-        $this->bodyEncoded = (bool)$bodyEncoded;
220
-    }
207
+	public function __construct($statusLine, $bodyEncoded = true)
208
+	{
209
+		if (!preg_match('!^HTTP/(\d\.\d) (\d{3})(?: (.+))?!', $statusLine, $m)) {
210
+			throw new HTTP_Request2_Exception("Malformed response: {$statusLine}");
211
+		}
212
+		$this->version = $m[1];
213
+		$this->code    = intval($m[2]);
214
+		if (!empty($m[3])) {
215
+			$this->reasonPhrase = trim($m[3]);
216
+		} elseif (!empty(self::$phrases[$this->code])) {
217
+			$this->reasonPhrase = self::$phrases[$this->code];
218
+		}
219
+		$this->bodyEncoded = (bool)$bodyEncoded;
220
+	}
221 221
 
222 222
    /**
223 223
     * Parses the line from HTTP response filling $headers array
@@ -229,51 +229,51 @@  discard block
 block discarded – undo
229 229
     *
230 230
     * @param    string  Line from HTTP response
231 231
     */
232
-    public function parseHeaderLine($headerLine)
233
-    {
234
-        $headerLine = trim($headerLine, "\r\n");
235
-
236
-        // empty string signals the end of headers, process the received ones
237
-        if ('' == $headerLine) {
238
-            if (!empty($this->headers['set-cookie'])) {
239
-                $cookies = is_array($this->headers['set-cookie'])?
240
-                           $this->headers['set-cookie']:
241
-                           array($this->headers['set-cookie']);
242
-                foreach ($cookies as $cookieString) {
243
-                    $this->parseCookie($cookieString);
244
-                }
245
-                unset($this->headers['set-cookie']);
246
-            }
247
-            foreach (array_keys($this->headers) as $k) {
248
-                if (is_array($this->headers[$k])) {
249
-                    $this->headers[$k] = implode(', ', $this->headers[$k]);
250
-                }
251
-            }
252
-
253
-        // string of the form header-name: header value
254
-        } elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) {
255
-            $name  = strtolower($m[1]);
256
-            $value = trim($m[2]);
257
-            if (empty($this->headers[$name])) {
258
-                $this->headers[$name] = $value;
259
-            } else {
260
-                if (!is_array($this->headers[$name])) {
261
-                    $this->headers[$name] = array($this->headers[$name]);
262
-                }
263
-                $this->headers[$name][] = $value;
264
-            }
265
-            $this->lastHeader = $name;
266
-
267
-        // continuation of a previous header
268
-        } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
269
-            if (!is_array($this->headers[$this->lastHeader])) {
270
-                $this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
271
-            } else {
272
-                $key = count($this->headers[$this->lastHeader]) - 1;
273
-                $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
274
-            }
275
-        }
276
-    }
232
+	public function parseHeaderLine($headerLine)
233
+	{
234
+		$headerLine = trim($headerLine, "\r\n");
235
+
236
+		// empty string signals the end of headers, process the received ones
237
+		if ('' == $headerLine) {
238
+			if (!empty($this->headers['set-cookie'])) {
239
+				$cookies = is_array($this->headers['set-cookie'])?
240
+						   $this->headers['set-cookie']:
241
+						   array($this->headers['set-cookie']);
242
+				foreach ($cookies as $cookieString) {
243
+					$this->parseCookie($cookieString);
244
+				}
245
+				unset($this->headers['set-cookie']);
246
+			}
247
+			foreach (array_keys($this->headers) as $k) {
248
+				if (is_array($this->headers[$k])) {
249
+					$this->headers[$k] = implode(', ', $this->headers[$k]);
250
+				}
251
+			}
252
+
253
+		// string of the form header-name: header value
254
+		} elseif (preg_match('!^([^\x00-\x1f\x7f-\xff()<>@,;:\\\\"/\[\]?={}\s]+):(.+)$!', $headerLine, $m)) {
255
+			$name  = strtolower($m[1]);
256
+			$value = trim($m[2]);
257
+			if (empty($this->headers[$name])) {
258
+				$this->headers[$name] = $value;
259
+			} else {
260
+				if (!is_array($this->headers[$name])) {
261
+					$this->headers[$name] = array($this->headers[$name]);
262
+				}
263
+				$this->headers[$name][] = $value;
264
+			}
265
+			$this->lastHeader = $name;
266
+
267
+		// continuation of a previous header
268
+		} elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
269
+			if (!is_array($this->headers[$this->lastHeader])) {
270
+				$this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
271
+			} else {
272
+				$key = count($this->headers[$this->lastHeader]) - 1;
273
+				$this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
274
+			}
275
+		}
276
+	}
277 277
 
278 278
    /**
279 279
     * Parses a Set-Cookie header to fill $cookies array
@@ -281,86 +281,86 @@  discard block
 block discarded – undo
281 281
     * @param    string    value of Set-Cookie header
282 282
     * @link     http://web.archive.org/web/20080331104521/http://cgi.netscape.com/newsref/std/cookie_spec.html
283 283
     */
284
-    protected function parseCookie($cookieString)
285
-    {
286
-        $cookie = array(
287
-            'expires' => null,
288
-            'domain'  => null,
289
-            'path'    => null,
290
-            'secure'  => false
291
-        );
292
-
293
-        // Only a name=value pair
294
-        if (!strpos($cookieString, ';')) {
295
-            $pos = strpos($cookieString, '=');
296
-            $cookie['name']  = trim(substr($cookieString, 0, $pos));
297
-            $cookie['value'] = trim(substr($cookieString, $pos + 1));
298
-
299
-        // Some optional parameters are supplied
300
-        } else {
301
-            $elements = explode(';', $cookieString);
302
-            $pos = strpos($elements[0], '=');
303
-            $cookie['name']  = trim(substr($elements[0], 0, $pos));
304
-            $cookie['value'] = trim(substr($elements[0], $pos + 1));
305
-
306
-            for ($i = 1; $i < count($elements); $i++) {
307
-                if (false === strpos($elements[$i], '=')) {
308
-                    $elName  = trim($elements[$i]);
309
-                    $elValue = null;
310
-                } else {
311
-                    list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i]));
312
-                }
313
-                $elName = strtolower($elName);
314
-                if ('secure' == $elName) {
315
-                    $cookie['secure'] = true;
316
-                } elseif ('expires' == $elName) {
317
-                    $cookie['expires'] = str_replace('"', '', $elValue);
318
-                } elseif ('path' == $elName || 'domain' == $elName) {
319
-                    $cookie[$elName] = urldecode($elValue);
320
-                } else {
321
-                    $cookie[$elName] = $elValue;
322
-                }
323
-            }
324
-        }
325
-        $this->cookies[] = $cookie;
326
-    }
284
+	protected function parseCookie($cookieString)
285
+	{
286
+		$cookie = array(
287
+			'expires' => null,
288
+			'domain'  => null,
289
+			'path'    => null,
290
+			'secure'  => false
291
+		);
292
+
293
+		// Only a name=value pair
294
+		if (!strpos($cookieString, ';')) {
295
+			$pos = strpos($cookieString, '=');
296
+			$cookie['name']  = trim(substr($cookieString, 0, $pos));
297
+			$cookie['value'] = trim(substr($cookieString, $pos + 1));
298
+
299
+		// Some optional parameters are supplied
300
+		} else {
301
+			$elements = explode(';', $cookieString);
302
+			$pos = strpos($elements[0], '=');
303
+			$cookie['name']  = trim(substr($elements[0], 0, $pos));
304
+			$cookie['value'] = trim(substr($elements[0], $pos + 1));
305
+
306
+			for ($i = 1; $i < count($elements); $i++) {
307
+				if (false === strpos($elements[$i], '=')) {
308
+					$elName  = trim($elements[$i]);
309
+					$elValue = null;
310
+				} else {
311
+					list ($elName, $elValue) = array_map('trim', explode('=', $elements[$i]));
312
+				}
313
+				$elName = strtolower($elName);
314
+				if ('secure' == $elName) {
315
+					$cookie['secure'] = true;
316
+				} elseif ('expires' == $elName) {
317
+					$cookie['expires'] = str_replace('"', '', $elValue);
318
+				} elseif ('path' == $elName || 'domain' == $elName) {
319
+					$cookie[$elName] = urldecode($elValue);
320
+				} else {
321
+					$cookie[$elName] = $elValue;
322
+				}
323
+			}
324
+		}
325
+		$this->cookies[] = $cookie;
326
+	}
327 327
 
328 328
    /**
329 329
     * Appends a string to the response body
330 330
     * @param    string
331 331
     */
332
-    public function appendBody($bodyChunk)
333
-    {
334
-        $this->body .= $bodyChunk;
335
-    }
332
+	public function appendBody($bodyChunk)
333
+	{
334
+		$this->body .= $bodyChunk;
335
+	}
336 336
 
337 337
    /**
338 338
     * Returns the status code
339 339
     * @return   integer
340 340
     */
341
-    public function getStatus()
342
-    {
343
-        return $this->code;
344
-    }
341
+	public function getStatus()
342
+	{
343
+		return $this->code;
344
+	}
345 345
 
346 346
    /**
347 347
     * Returns the reason phrase
348 348
     * @return   string
349 349
     */
350
-    public function getReasonPhrase()
351
-    {
352
-        return $this->reasonPhrase;
353
-    }
350
+	public function getReasonPhrase()
351
+	{
352
+		return $this->reasonPhrase;
353
+	}
354 354
 
355 355
    /**
356 356
     * Whether response is a redirect that can be automatically handled by HTTP_Request2
357 357
     * @return   bool
358 358
     */
359
-    public function isRedirect()
360
-    {
361
-        return in_array($this->code, array(300, 301, 302, 303, 307))
362
-               && isset($this->headers['location']);
363
-    }
359
+	public function isRedirect()
360
+	{
361
+		return in_array($this->code, array(300, 301, 302, 303, 307))
362
+			   && isset($this->headers['location']);
363
+	}
364 364
 
365 365
    /**
366 366
     * Returns either the named header or all response headers
@@ -370,25 +370,25 @@  discard block
 block discarded – undo
370 370
     *                           not present), array of all response headers if
371 371
     *                           $headerName is null
372 372
     */
373
-    public function getHeader($headerName = null)
374
-    {
375
-        if (null === $headerName) {
376
-            return $this->headers;
377
-        } else {
378
-            $headerName = strtolower($headerName);
379
-            return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
380
-        }
381
-    }
373
+	public function getHeader($headerName = null)
374
+	{
375
+		if (null === $headerName) {
376
+			return $this->headers;
377
+		} else {
378
+			$headerName = strtolower($headerName);
379
+			return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
380
+		}
381
+	}
382 382
 
383 383
    /**
384 384
     * Returns cookies set in response
385 385
     *
386 386
     * @return   array
387 387
     */
388
-    public function getCookies()
389
-    {
390
-        return $this->cookies;
391
-    }
388
+	public function getCookies()
389
+	{
390
+		return $this->cookies;
391
+	}
392 392
 
393 393
    /**
394 394
     * Returns the body of the response
@@ -396,49 +396,49 @@  discard block
 block discarded – undo
396 396
     * @return   string
397 397
     * @throws   HTTP_Request2_Exception if body cannot be decoded
398 398
     */
399
-    public function getBody()
400
-    {
401
-        if (!$this->bodyEncoded ||
402
-            !in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate'))
403
-        ) {
404
-            return $this->body;
405
-
406
-        } else {
407
-            if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
408
-                $oldEncoding = mb_internal_encoding();
409
-                mb_internal_encoding('iso-8859-1');
410
-            }
411
-
412
-            try {
413
-                switch (strtolower($this->getHeader('content-encoding'))) {
414
-                    case 'gzip':
415
-                        $decoded = self::decodeGzip($this->body);
416
-                        break;
417
-                    case 'deflate':
418
-                        $decoded = self::decodeDeflate($this->body);
419
-                }
420
-            } catch (Exception $e) {
421
-            }
422
-
423
-            if (!empty($oldEncoding)) {
424
-                mb_internal_encoding($oldEncoding);
425
-            }
426
-            if (!empty($e)) {
427
-                throw $e;
428
-            }
429
-            return $decoded;
430
-        }
431
-    }
399
+	public function getBody()
400
+	{
401
+		if (!$this->bodyEncoded ||
402
+			!in_array(strtolower($this->getHeader('content-encoding')), array('gzip', 'deflate'))
403
+		) {
404
+			return $this->body;
405
+
406
+		} else {
407
+			if (extension_loaded('mbstring') && (2 & ini_get('mbstring.func_overload'))) {
408
+				$oldEncoding = mb_internal_encoding();
409
+				mb_internal_encoding('iso-8859-1');
410
+			}
411
+
412
+			try {
413
+				switch (strtolower($this->getHeader('content-encoding'))) {
414
+					case 'gzip':
415
+						$decoded = self::decodeGzip($this->body);
416
+						break;
417
+					case 'deflate':
418
+						$decoded = self::decodeDeflate($this->body);
419
+				}
420
+			} catch (Exception $e) {
421
+			}
422
+
423
+			if (!empty($oldEncoding)) {
424
+				mb_internal_encoding($oldEncoding);
425
+			}
426
+			if (!empty($e)) {
427
+				throw $e;
428
+			}
429
+			return $decoded;
430
+		}
431
+	}
432 432
 
433 433
    /**
434 434
     * Get the HTTP version of the response
435 435
     *
436 436
     * @return   string
437 437
     */
438
-    public function getVersion()
439
-    {
440
-        return $this->version;
441
-    }
438
+	public function getVersion()
439
+	{
440
+		return $this->version;
441
+	}
442 442
 
443 443
    /**
444 444
     * Decodes the message-body encoded by gzip
@@ -452,89 +452,89 @@  discard block
 block discarded – undo
452 452
     * @throws   HTTP_Request2_Exception
453 453
     * @link     http://tools.ietf.org/html/rfc1952
454 454
     */
455
-    public static function decodeGzip($data)
456
-    {
457
-        $length = strlen($data);
458
-        // If it doesn't look like gzip-encoded data, don't bother
459
-        if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
460
-            return $data;
461
-        }
462
-        if (!function_exists('gzinflate')) {
463
-            throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available');
464
-        }
465
-        $method = ord(substr($data, 2, 1));
466
-        if (8 != $method) {
467
-            throw new HTTP_Request2_Exception('Error parsing gzip header: unknown compression method');
468
-        }
469
-        $flags = ord(substr($data, 3, 1));
470
-        if ($flags & 224) {
471
-            throw new HTTP_Request2_Exception('Error parsing gzip header: reserved bits are set');
472
-        }
473
-
474
-        // header is 10 bytes minimum. may be longer, though.
475
-        $headerLength = 10;
476
-        // extra fields, need to skip 'em
477
-        if ($flags & 4) {
478
-            if ($length - $headerLength - 2 < 8) {
479
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
480
-            }
481
-            $extraLength = unpack('v', substr($data, 10, 2));
482
-            if ($length - $headerLength - 2 - $extraLength[1] < 8) {
483
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
484
-            }
485
-            $headerLength += $extraLength[1] + 2;
486
-        }
487
-        // file name, need to skip that
488
-        if ($flags & 8) {
489
-            if ($length - $headerLength - 1 < 8) {
490
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
491
-            }
492
-            $filenameLength = strpos(substr($data, $headerLength), chr(0));
493
-            if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) {
494
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
495
-            }
496
-            $headerLength += $filenameLength + 1;
497
-        }
498
-        // comment, need to skip that also
499
-        if ($flags & 16) {
500
-            if ($length - $headerLength - 1 < 8) {
501
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
502
-            }
503
-            $commentLength = strpos(substr($data, $headerLength), chr(0));
504
-            if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) {
505
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
506
-            }
507
-            $headerLength += $commentLength + 1;
508
-        }
509
-        // have a CRC for header. let's check
510
-        if ($flags & 2) {
511
-            if ($length - $headerLength - 2 < 8) {
512
-                throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
513
-            }
514
-            $crcReal   = 0xffff & crc32(substr($data, 0, $headerLength));
515
-            $crcStored = unpack('v', substr($data, $headerLength, 2));
516
-            if ($crcReal != $crcStored[1]) {
517
-                throw new HTTP_Request2_Exception('Header CRC check failed');
518
-            }
519
-            $headerLength += 2;
520
-        }
521
-        // unpacked data CRC and size at the end of encoded data
522
-        $tmp = unpack('V2', substr($data, -8));
523
-        $dataCrc  = $tmp[1];
524
-        $dataSize = $tmp[2];
525
-
526
-        // finally, call the gzinflate() function
527
-        // don't pass $dataSize to gzinflate, see bugs #13135, #14370
528
-        $unpacked = gzinflate(substr($data, $headerLength, -8));
529
-        if (false === $unpacked) {
530
-            throw new HTTP_Request2_Exception('gzinflate() call failed');
531
-        } elseif ($dataSize != strlen($unpacked)) {
532
-            throw new HTTP_Request2_Exception('Data size check failed');
533
-        } elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) {
534
-            throw new HTTP_Request2_Exception('Data CRC check failed');
535
-        }
536
-        return $unpacked;
537
-    }
455
+	public static function decodeGzip($data)
456
+	{
457
+		$length = strlen($data);
458
+		// If it doesn't look like gzip-encoded data, don't bother
459
+		if (18 > $length || strcmp(substr($data, 0, 2), "\x1f\x8b")) {
460
+			return $data;
461
+		}
462
+		if (!function_exists('gzinflate')) {
463
+			throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available');
464
+		}
465
+		$method = ord(substr($data, 2, 1));
466
+		if (8 != $method) {
467
+			throw new HTTP_Request2_Exception('Error parsing gzip header: unknown compression method');
468
+		}
469
+		$flags = ord(substr($data, 3, 1));
470
+		if ($flags & 224) {
471
+			throw new HTTP_Request2_Exception('Error parsing gzip header: reserved bits are set');
472
+		}
473
+
474
+		// header is 10 bytes minimum. may be longer, though.
475
+		$headerLength = 10;
476
+		// extra fields, need to skip 'em
477
+		if ($flags & 4) {
478
+			if ($length - $headerLength - 2 < 8) {
479
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
480
+			}
481
+			$extraLength = unpack('v', substr($data, 10, 2));
482
+			if ($length - $headerLength - 2 - $extraLength[1] < 8) {
483
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
484
+			}
485
+			$headerLength += $extraLength[1] + 2;
486
+		}
487
+		// file name, need to skip that
488
+		if ($flags & 8) {
489
+			if ($length - $headerLength - 1 < 8) {
490
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
491
+			}
492
+			$filenameLength = strpos(substr($data, $headerLength), chr(0));
493
+			if (false === $filenameLength || $length - $headerLength - $filenameLength - 1 < 8) {
494
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
495
+			}
496
+			$headerLength += $filenameLength + 1;
497
+		}
498
+		// comment, need to skip that also
499
+		if ($flags & 16) {
500
+			if ($length - $headerLength - 1 < 8) {
501
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
502
+			}
503
+			$commentLength = strpos(substr($data, $headerLength), chr(0));
504
+			if (false === $commentLength || $length - $headerLength - $commentLength - 1 < 8) {
505
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
506
+			}
507
+			$headerLength += $commentLength + 1;
508
+		}
509
+		// have a CRC for header. let's check
510
+		if ($flags & 2) {
511
+			if ($length - $headerLength - 2 < 8) {
512
+				throw new HTTP_Request2_Exception('Error parsing gzip header: data too short');
513
+			}
514
+			$crcReal   = 0xffff & crc32(substr($data, 0, $headerLength));
515
+			$crcStored = unpack('v', substr($data, $headerLength, 2));
516
+			if ($crcReal != $crcStored[1]) {
517
+				throw new HTTP_Request2_Exception('Header CRC check failed');
518
+			}
519
+			$headerLength += 2;
520
+		}
521
+		// unpacked data CRC and size at the end of encoded data
522
+		$tmp = unpack('V2', substr($data, -8));
523
+		$dataCrc  = $tmp[1];
524
+		$dataSize = $tmp[2];
525
+
526
+		// finally, call the gzinflate() function
527
+		// don't pass $dataSize to gzinflate, see bugs #13135, #14370
528
+		$unpacked = gzinflate(substr($data, $headerLength, -8));
529
+		if (false === $unpacked) {
530
+			throw new HTTP_Request2_Exception('gzinflate() call failed');
531
+		} elseif ($dataSize != strlen($unpacked)) {
532
+			throw new HTTP_Request2_Exception('Data size check failed');
533
+		} elseif ((0xffffffff & $dataCrc) != (0xffffffff & crc32($unpacked))) {
534
+			throw new HTTP_Request2_Exception('Data CRC check failed');
535
+		}
536
+		return $unpacked;
537
+	}
538 538
 
539 539
    /**
540 540
     * Decodes the message-body encoded by deflate
@@ -543,17 +543,17 @@  discard block
 block discarded – undo
543 543
     * @return   string  decoded data
544 544
     * @throws   HTTP_Request2_Exception
545 545
     */
546
-    public static function decodeDeflate($data)
547
-    {
548
-        if (!function_exists('gzuncompress')) {
549
-            throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available');
550
-        }
551
-        // RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950,
552
-        // while many applications send raw deflate stream from RFC 1951.
553
-        // We should check for presence of zlib header and use gzuncompress() or
554
-        // gzinflate() as needed. See bug #15305
555
-        $header = unpack('n', substr($data, 0, 2));
556
-        return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
557
-    }
546
+	public static function decodeDeflate($data)
547
+	{
548
+		if (!function_exists('gzuncompress')) {
549
+			throw new HTTP_Request2_Exception('Unable to decode body: gzip extension not available');
550
+		}
551
+		// RFC 2616 defines 'deflate' encoding as zlib format from RFC 1950,
552
+		// while many applications send raw deflate stream from RFC 1951.
553
+		// We should check for presence of zlib header and use gzuncompress() or
554
+		// gzinflate() as needed. See bug #15305
555
+		$header = unpack('n', substr($data, 0, 2));
556
+		return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
557
+	}
558 558
 }
559 559
 ?>
560 560
\ No newline at end of file
Please login to merge, or discard this patch.
Spacing   +8 added lines, -9 removed lines patch added patch discarded remove patch
@@ -158,7 +158,7 @@  discard block
 block discarded – undo
158 158
         // the request
159 159
         300 => 'Multiple Choices',
160 160
         301 => 'Moved Permanently',
161
-        302 => 'Found',  // 1.1
161
+        302 => 'Found', // 1.1
162 162
         303 => 'See Other',
163 163
         304 => 'Not Modified',
164 164
         305 => 'Use Proxy',
@@ -216,7 +216,7 @@  discard block
 block discarded – undo
216 216
         } elseif (!empty(self::$phrases[$this->code])) {
217 217
             $this->reasonPhrase = self::$phrases[$this->code];
218 218
         }
219
-        $this->bodyEncoded = (bool)$bodyEncoded;
219
+        $this->bodyEncoded = (bool) $bodyEncoded;
220 220
     }
221 221
 
222 222
    /**
@@ -236,9 +236,8 @@  discard block
 block discarded – undo
236 236
         // empty string signals the end of headers, process the received ones
237 237
         if ('' == $headerLine) {
238 238
             if (!empty($this->headers['set-cookie'])) {
239
-                $cookies = is_array($this->headers['set-cookie'])?
240
-                           $this->headers['set-cookie']:
241
-                           array($this->headers['set-cookie']);
239
+                $cookies = is_array($this->headers['set-cookie']) ?
240
+                           $this->headers['set-cookie'] : array($this->headers['set-cookie']);
242 241
                 foreach ($cookies as $cookieString) {
243 242
                     $this->parseCookie($cookieString);
244 243
                 }
@@ -267,10 +266,10 @@  discard block
 block discarded – undo
267 266
         // continuation of a previous header
268 267
         } elseif (preg_match('!^\s+(.+)$!', $headerLine, $m) && $this->lastHeader) {
269 268
             if (!is_array($this->headers[$this->lastHeader])) {
270
-                $this->headers[$this->lastHeader] .= ' ' . trim($m[1]);
269
+                $this->headers[$this->lastHeader] .= ' '.trim($m[1]);
271 270
             } else {
272 271
                 $key = count($this->headers[$this->lastHeader]) - 1;
273
-                $this->headers[$this->lastHeader][$key] .= ' ' . trim($m[1]);
272
+                $this->headers[$this->lastHeader][$key] .= ' '.trim($m[1]);
274 273
             }
275 274
         }
276 275
     }
@@ -376,7 +375,7 @@  discard block
 block discarded – undo
376 375
             return $this->headers;
377 376
         } else {
378 377
             $headerName = strtolower($headerName);
379
-            return isset($this->headers[$headerName])? $this->headers[$headerName]: null;
378
+            return isset($this->headers[$headerName]) ? $this->headers[$headerName] : null;
380 379
         }
381 380
     }
382 381
 
@@ -553,7 +552,7 @@  discard block
 block discarded – undo
553 552
         // We should check for presence of zlib header and use gzuncompress() or
554 553
         // gzinflate() as needed. See bug #15305
555 554
         $header = unpack('n', substr($data, 0, 2));
556
-        return (0 == $header[1] % 31)? gzuncompress($data): gzinflate($data);
555
+        return (0 == $header[1] % 31) ? gzuncompress($data) : gzinflate($data);
557 556
     }
558 557
 }
559 558
 ?>
560 559
\ No newline at end of file
Please login to merge, or discard this patch.