]> git.mxchange.org Git - quix0rs-gnu-social.git/blob - extlib/HTTP/Request2/Observer/Log.php
PEAR::HTTP_Request2 updated to 2.2.1
[quix0rs-gnu-social.git] / extlib / HTTP / Request2 / Observer / Log.php
1 <?php\r
2 /**\r
3  * An observer useful for debugging / testing.\r
4  *\r
5  * PHP version 5\r
6  *\r
7  * LICENSE\r
8  *\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
12  *\r
13  * @category  HTTP\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
20  */\r
21 \r
22 /**\r
23  * Exception class for HTTP_Request2 package\r
24  */\r
25 require_once 'HTTP/Request2/Exception.php';\r
26 \r
27 /**\r
28  * A debug observer useful for debugging / testing.\r
29  *\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
33  *\r
34  * A simple example:\r
35  * <code>\r
36  * require_once 'HTTP/Request2.php';\r
37  * require_once 'HTTP/Request2/Observer/Log.php';\r
38  *\r
39  * $request  = new HTTP_Request2('http://www.example.com');\r
40  * $observer = new HTTP_Request2_Observer_Log();\r
41  * $request->attach($observer);\r
42  * $request->send();\r
43  * </code>\r
44  *\r
45  * A more complex example with PEAR Log:\r
46  * <code>\r
47  * require_once 'HTTP/Request2.php';\r
48  * require_once 'HTTP/Request2/Observer/Log.php';\r
49  * require_once 'Log.php';\r
50  *\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
54  *\r
55  * // we only want to log received headers\r
56  * $observer->events = array('receivedHeaders');\r
57  *\r
58  * $request->attach($observer);\r
59  * $request->send();\r
60  * </code>\r
61  *\r
62  * @category HTTP\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
69  */\r
70 class HTTP_Request2_Observer_Log implements SplObserver\r
71 {\r
72     // properties {{{\r
73 \r
74     /**\r
75      * The log target, it can be a a resource or a PEAR Log instance.\r
76      *\r
77      * @var resource|Log $target\r
78      */\r
79     protected $target = null;\r
80 \r
81     /**\r
82      * The events to log.\r
83      *\r
84      * @var array $events\r
85      */\r
86     public $events = array(\r
87         'connect',\r
88         'sentHeaders',\r
89         'sentBody',\r
90         'receivedHeaders',\r
91         'receivedBody',\r
92         'disconnect',\r
93     );\r
94 \r
95     // }}}\r
96     // __construct() {{{\r
97 \r
98     /**\r
99      * Constructor.\r
100      *\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
104      *\r
105      * @return void\r
106      */\r
107     public function __construct($target = 'php://output', array $events = array())\r
108     {\r
109         if (!empty($events)) {\r
110             $this->events = $events;\r
111         }\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
116         }\r
117     }\r
118 \r
119     // }}}\r
120     // update() {{{\r
121 \r
122     /**\r
123      * Called when the request notifies us of an event.\r
124      *\r
125      * @param HTTP_Request2 $subject The HTTP_Request2 instance\r
126      *\r
127      * @return void\r
128      */\r
129     public function update(SplSubject $subject)\r
130     {\r
131         $event = $subject->getLastEvent();\r
132         if (!in_array($event['name'], $this->events)) {\r
133             return;\r
134         }\r
135 \r
136         switch ($event['name']) {\r
137         case 'connect':\r
138             $this->log('* Connected to ' . $event['data']);\r
139             break;\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
145             }\r
146             break;\r
147         case 'sentBody':\r
148             $this->log('> ' . $event['data'] . ' byte(s) sent');\r
149             break;\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
154             ));\r
155             $headers = $event['data']->getHeader();\r
156             foreach ($headers as $key => $val) {\r
157                 $this->log('< ' . $key . ': ' . $val);\r
158             }\r
159             $this->log('< ');\r
160             break;\r
161         case 'receivedBody':\r
162             $this->log($event['data']->getBody());\r
163             break;\r
164         case 'disconnect':\r
165             $this->log('* Disconnected');\r
166             break;\r
167         }\r
168     }\r
169 \r
170     // }}}\r
171     // log() {{{\r
172 \r
173     /**\r
174      * Logs the given message to the configured target.\r
175      *\r
176      * @param string $message Message to display\r
177      *\r
178      * @return void\r
179      */\r
180     protected function log($message)\r
181     {\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
186         }\r
187     }\r
188 \r
189     // }}}\r
190 }\r
191 \r
192 ?>