Open Journal Systems  3.3.0
LogPlugin.php
1 <?php
2 
3 namespace Guzzle\Plugin\Log;
4 
12 
21 {
23  protected $logAdapter;
24 
26  protected $formatter;
27 
29  protected $wireBodies;
30 
37  public function __construct(
39  $formatter = null,
40  $wireBodies = false
41  ) {
42  $this->logAdapter = $logAdapter;
43  $this->formatter = $formatter instanceof MessageFormatter ? $formatter : new MessageFormatter($formatter);
44  $this->wireBodies = $wireBodies;
45  }
46 
55  public static function getDebugPlugin($wireBodies = true, $stream = null)
56  {
57  if ($stream === null) {
58  if (defined('STDERR')) {
59  $stream = STDERR;
60  } else {
61  $stream = fopen('php://output', 'w');
62  }
63  }
64 
65  return new self(new ClosureLogAdapter(function ($m) use ($stream) {
66  fwrite($stream, $m . PHP_EOL);
67  }), "# Request:\n{request}\n\n# Response:\n{response}\n\n# Errors: {curl_code} {curl_error}", $wireBodies);
68  }
69 
70  public static function getSubscribedEvents()
71  {
72  return array(
73  'curl.callback.write' => array('onCurlWrite', 255),
74  'curl.callback.read' => array('onCurlRead', 255),
75  'request.before_send' => array('onRequestBeforeSend', 255),
76  'request.sent' => array('onRequestSent', 255)
77  );
78  }
79 
85  public function onCurlRead(Event $event)
86  {
87  // Stream the request body to the log if the body is not repeatable
88  if ($wire = $event['request']->getParams()->get('request_wire')) {
89  $wire->write($event['read']);
90  }
91  }
92 
98  public function onCurlWrite(Event $event)
99  {
100  // Stream the response body to the log if the body is not repeatable
101  if ($wire = $event['request']->getParams()->get('response_wire')) {
102  $wire->write($event['write']);
103  }
104  }
105 
111  public function onRequestBeforeSend(Event $event)
112  {
113  if ($this->wireBodies) {
114  $request = $event['request'];
115  // Ensure that curl IO events are emitted
116  $request->getCurlOptions()->set('emit_io', true);
117  // We need to make special handling for content wiring and non-repeatable streams.
118  if ($request instanceof EntityEnclosingRequestInterface && $request->getBody()
119  && (!$request->getBody()->isSeekable() || !$request->getBody()->isReadable())
120  ) {
121  // The body of the request cannot be recalled so logging the body will require us to buffer it
122  $request->getParams()->set('request_wire', EntityBody::factory());
123  }
124  if (!$request->getResponseBody()->isRepeatable()) {
125  // The body of the response cannot be recalled so logging the body will require us to buffer it
126  $request->getParams()->set('response_wire', EntityBody::factory());
127  }
128  }
129  }
130 
136  public function onRequestSent(Event $event)
137  {
138  $request = $event['request'];
139  $response = $event['response'];
140  $handle = $event['handle'];
141 
142  if ($wire = $request->getParams()->get('request_wire')) {
143  $request = clone $request;
144  $request->setBody($wire);
145  }
146 
147  if ($wire = $request->getParams()->get('response_wire')) {
148  $response = clone $response;
149  $response->setBody($wire);
150  }
151 
152  // Send the log message to the adapter, adding a category and host
153  $priority = $response && $response->isError() ? LOG_ERR : LOG_DEBUG;
154  $message = $this->formatter->format($request, $response, $handle);
155  $this->logAdapter->log($message, $priority, array(
156  'request' => $request,
157  'response' => $response,
158  'handle' => $handle
159  ));
160  }
161 }
Guzzle\Plugin\Log\LogPlugin\onCurlWrite
onCurlWrite(Event $event)
Definition: LogPlugin.php:107
Guzzle\Plugin\Log\LogPlugin\onRequestSent
onRequestSent(Event $event)
Definition: LogPlugin.php:145
Guzzle\Plugin\Log\LogPlugin
Definition: LogPlugin.php:20
Guzzle\Plugin\Log\LogPlugin\onCurlRead
onCurlRead(Event $event)
Definition: LogPlugin.php:94
Symfony\Component\EventDispatcher\EventSubscriberInterface
Definition: lib/vendor/symfony/event-dispatcher/EventSubscriberInterface.php:25
Guzzle\Http\Message\EntityEnclosingRequestInterface
Definition: EntityEnclosingRequestInterface.php:12
Guzzle\Http\EntityBody\factory
static factory($resource='', $size=null)
Definition: EntityBody.php:36
Guzzle\Log\MessageFormatter
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Log/MessageFormatter.php:39
Guzzle\Plugin\Log\LogPlugin\getDebugPlugin
static getDebugPlugin($wireBodies=true, $stream=null)
Definition: LogPlugin.php:64
Guzzle\Http\EntityBody
Definition: EntityBody.php:13
Guzzle\Common\Event
Definition: lib/vendor/guzzle/guzzle/src/Guzzle/Common/Event.php:10
Guzzle\Plugin\Log
Definition: LogPlugin.php:3
Guzzle\Log\ClosureLogAdapter
Definition: ClosureLogAdapter.php:8
Guzzle\Plugin\Log\LogPlugin\onRequestBeforeSend
onRequestBeforeSend(Event $event)
Definition: LogPlugin.php:120
Guzzle\Plugin\Log\LogPlugin\$formatter
$formatter
Definition: LogPlugin.php:32
Guzzle\Plugin\Log\LogPlugin\$wireBodies
$wireBodies
Definition: LogPlugin.php:38
Guzzle\Log\LogAdapterInterface
Definition: LogAdapterInterface.php:8
Guzzle\Plugin\Log\LogPlugin\__construct
__construct(LogAdapterInterface $logAdapter, $formatter=null, $wireBodies=false)
Definition: LogPlugin.php:46
Guzzle\Plugin\Log\LogPlugin\$logAdapter
$logAdapter
Definition: LogPlugin.php:26
Guzzle\Plugin\Log\LogPlugin\getSubscribedEvents
static getSubscribedEvents()
Definition: LogPlugin.php:79
Guzzle\Http\Message\EntityEnclosingRequestInterface\getBody
getBody()