3 * An observer useful for debugging / testing.
\r
9 * This source file is subject to BSD 3-Clause License that is bundled
\r
10 * with this package in the file LICENSE and available at the URL
\r
11 * https://raw.github.com/pear/HTTP_Request2/trunk/docs/LICENSE
\r
14 * @package HTTP_Request2
\r
15 * @author David Jean Louis <izi@php.net>
\r
16 * @author Alexey Borzov <avb@php.net>
\r
17 * @copyright 2008-2014 Alexey Borzov <avb@php.net>
\r
18 * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
\r
19 * @link http://pear.php.net/package/HTTP_Request2
\r
23 * Exception class for HTTP_Request2 package
\r
25 require_once 'HTTP/Request2/Exception.php';
\r
28 * A debug observer useful for debugging / testing.
\r
30 * This observer logs to a log target data corresponding to the various request
\r
31 * and response events, it logs by default to php://output but can be configured
\r
32 * to log to a file or via the PEAR Log package.
\r
36 * require_once 'HTTP/Request2.php';
\r
37 * require_once 'HTTP/Request2/Observer/Log.php';
\r
39 * $request = new HTTP_Request2('http://www.example.com');
\r
40 * $observer = new HTTP_Request2_Observer_Log();
\r
41 * $request->attach($observer);
\r
45 * A more complex example with PEAR Log:
\r
47 * require_once 'HTTP/Request2.php';
\r
48 * require_once 'HTTP/Request2/Observer/Log.php';
\r
49 * require_once 'Log.php';
\r
51 * $request = new HTTP_Request2('http://www.example.com');
\r
52 * // we want to log with PEAR log
\r
53 * $observer = new HTTP_Request2_Observer_Log(Log::factory('console'));
\r
55 * // we only want to log received headers
\r
56 * $observer->events = array('receivedHeaders');
\r
58 * $request->attach($observer);
\r
63 * @package HTTP_Request2
\r
64 * @author David Jean Louis <izi@php.net>
\r
65 * @author Alexey Borzov <avb@php.net>
\r
66 * @license http://opensource.org/licenses/BSD-3-Clause BSD 3-Clause License
\r
67 * @version Release: 2.2.1
\r
68 * @link http://pear.php.net/package/HTTP_Request2
\r
70 class HTTP_Request2_Observer_Log implements SplObserver
\r
75 * The log target, it can be a a resource or a PEAR Log instance.
\r
77 * @var resource|Log $target
\r
79 protected $target = null;
\r
82 * The events to log.
\r
84 * @var array $events
\r
86 public $events = array(
\r
96 // __construct() {{{
\r
101 * @param mixed $target Can be a file path (default: php://output), a resource,
\r
102 * or an instance of the PEAR Log class.
\r
103 * @param array $events Array of events to listen to (default: all events)
\r
107 public function __construct($target = 'php://output', array $events = array())
\r
109 if (!empty($events)) {
\r
110 $this->events = $events;
\r
112 if (is_resource($target) || $target instanceof Log) {
\r
113 $this->target = $target;
\r
114 } elseif (false === ($this->target = @fopen($target, 'ab'))) {
\r
115 throw new HTTP_Request2_Exception("Unable to open '{$target}'");
\r
123 * Called when the request notifies us of an event.
\r
125 * @param HTTP_Request2 $subject The HTTP_Request2 instance
\r
129 public function update(SplSubject $subject)
\r
131 $event = $subject->getLastEvent();
\r
132 if (!in_array($event['name'], $this->events)) {
\r
136 switch ($event['name']) {
\r
138 $this->log('* Connected to ' . $event['data']);
\r
140 case 'sentHeaders':
\r
141 $headers = explode("\r\n", $event['data']);
\r
142 array_pop($headers);
\r
143 foreach ($headers as $header) {
\r
144 $this->log('> ' . $header);
\r
148 $this->log('> ' . $event['data'] . ' byte(s) sent');
\r
150 case 'receivedHeaders':
\r
151 $this->log(sprintf(
\r
152 '< HTTP/%s %s %s', $event['data']->getVersion(),
\r
153 $event['data']->getStatus(), $event['data']->getReasonPhrase()
\r
155 $headers = $event['data']->getHeader();
\r
156 foreach ($headers as $key => $val) {
\r
157 $this->log('< ' . $key . ': ' . $val);
\r
161 case 'receivedBody':
\r
162 $this->log($event['data']->getBody());
\r
165 $this->log('* Disconnected');
\r
174 * Logs the given message to the configured target.
\r
176 * @param string $message Message to display
\r
180 protected function log($message)
\r
182 if ($this->target instanceof Log) {
\r
183 $this->target->debug($message);
\r
184 } elseif (is_resource($this->target)) {
\r
185 fwrite($this->target, $message . "\r\n");
\r