annotate vendor/guzzlehttp/guzzle/src/MessageFormatter.php @ 12:7a779792577d

Update Drupal core to v8.4.5 (via Composer)
author Chris Cannam
date Fri, 23 Feb 2018 15:52:07 +0000
parents 4c8ae668cc8c
children 5fb285c0d0e3
rev   line source
Chris@0 1 <?php
Chris@0 2 namespace GuzzleHttp;
Chris@0 3
Chris@0 4 use Psr\Http\Message\MessageInterface;
Chris@0 5 use Psr\Http\Message\RequestInterface;
Chris@0 6 use Psr\Http\Message\ResponseInterface;
Chris@0 7
Chris@0 8 /**
Chris@0 9 * Formats log messages using variable substitutions for requests, responses,
Chris@0 10 * and other transactional data.
Chris@0 11 *
Chris@0 12 * The following variable substitutions are supported:
Chris@0 13 *
Chris@0 14 * - {request}: Full HTTP request message
Chris@0 15 * - {response}: Full HTTP response message
Chris@0 16 * - {ts}: ISO 8601 date in GMT
Chris@0 17 * - {date_iso_8601} ISO 8601 date in GMT
Chris@0 18 * - {date_common_log} Apache common log date using the configured timezone.
Chris@0 19 * - {host}: Host of the request
Chris@0 20 * - {method}: Method of the request
Chris@0 21 * - {uri}: URI of the request
Chris@0 22 * - {host}: Host of the request
Chris@0 23 * - {version}: Protocol version
Chris@0 24 * - {target}: Request target of the request (path + query + fragment)
Chris@0 25 * - {hostname}: Hostname of the machine that sent the request
Chris@0 26 * - {code}: Status code of the response (if available)
Chris@0 27 * - {phrase}: Reason phrase of the response (if available)
Chris@0 28 * - {error}: Any error messages (if available)
Chris@0 29 * - {req_header_*}: Replace `*` with the lowercased name of a request header to add to the message
Chris@0 30 * - {res_header_*}: Replace `*` with the lowercased name of a response header to add to the message
Chris@0 31 * - {req_headers}: Request headers
Chris@0 32 * - {res_headers}: Response headers
Chris@0 33 * - {req_body}: Request body
Chris@0 34 * - {res_body}: Response body
Chris@0 35 */
Chris@0 36 class MessageFormatter
Chris@0 37 {
Chris@0 38 /**
Chris@0 39 * Apache Common Log Format.
Chris@0 40 * @link http://httpd.apache.org/docs/2.4/logs.html#common
Chris@0 41 * @var string
Chris@0 42 */
Chris@0 43 const CLF = "{hostname} {req_header_User-Agent} - [{date_common_log}] \"{method} {target} HTTP/{version}\" {code} {res_header_Content-Length}";
Chris@0 44 const DEBUG = ">>>>>>>>\n{request}\n<<<<<<<<\n{response}\n--------\n{error}";
Chris@0 45 const SHORT = '[{ts}] "{method} {target} HTTP/{version}" {code}';
Chris@0 46
Chris@0 47 /** @var string Template used to format log messages */
Chris@0 48 private $template;
Chris@0 49
Chris@0 50 /**
Chris@0 51 * @param string $template Log message template
Chris@0 52 */
Chris@0 53 public function __construct($template = self::CLF)
Chris@0 54 {
Chris@0 55 $this->template = $template ?: self::CLF;
Chris@0 56 }
Chris@0 57
Chris@0 58 /**
Chris@0 59 * Returns a formatted message string.
Chris@0 60 *
Chris@0 61 * @param RequestInterface $request Request that was sent
Chris@0 62 * @param ResponseInterface $response Response that was received
Chris@0 63 * @param \Exception $error Exception that was received
Chris@0 64 *
Chris@0 65 * @return string
Chris@0 66 */
Chris@0 67 public function format(
Chris@0 68 RequestInterface $request,
Chris@0 69 ResponseInterface $response = null,
Chris@0 70 \Exception $error = null
Chris@0 71 ) {
Chris@0 72 $cache = [];
Chris@0 73
Chris@0 74 return preg_replace_callback(
Chris@0 75 '/{\s*([A-Za-z_\-\.0-9]+)\s*}/',
Chris@0 76 function (array $matches) use ($request, $response, $error, &$cache) {
Chris@0 77
Chris@0 78 if (isset($cache[$matches[1]])) {
Chris@0 79 return $cache[$matches[1]];
Chris@0 80 }
Chris@0 81
Chris@0 82 $result = '';
Chris@0 83 switch ($matches[1]) {
Chris@0 84 case 'request':
Chris@0 85 $result = Psr7\str($request);
Chris@0 86 break;
Chris@0 87 case 'response':
Chris@0 88 $result = $response ? Psr7\str($response) : '';
Chris@0 89 break;
Chris@0 90 case 'req_headers':
Chris@0 91 $result = trim($request->getMethod()
Chris@0 92 . ' ' . $request->getRequestTarget())
Chris@0 93 . ' HTTP/' . $request->getProtocolVersion() . "\r\n"
Chris@0 94 . $this->headers($request);
Chris@0 95 break;
Chris@0 96 case 'res_headers':
Chris@0 97 $result = $response ?
Chris@0 98 sprintf(
Chris@0 99 'HTTP/%s %d %s',
Chris@0 100 $response->getProtocolVersion(),
Chris@0 101 $response->getStatusCode(),
Chris@0 102 $response->getReasonPhrase()
Chris@0 103 ) . "\r\n" . $this->headers($response)
Chris@0 104 : 'NULL';
Chris@0 105 break;
Chris@0 106 case 'req_body':
Chris@0 107 $result = $request->getBody();
Chris@0 108 break;
Chris@0 109 case 'res_body':
Chris@0 110 $result = $response ? $response->getBody() : 'NULL';
Chris@0 111 break;
Chris@0 112 case 'ts':
Chris@0 113 case 'date_iso_8601':
Chris@0 114 $result = gmdate('c');
Chris@0 115 break;
Chris@0 116 case 'date_common_log':
Chris@0 117 $result = date('d/M/Y:H:i:s O');
Chris@0 118 break;
Chris@0 119 case 'method':
Chris@0 120 $result = $request->getMethod();
Chris@0 121 break;
Chris@0 122 case 'version':
Chris@0 123 $result = $request->getProtocolVersion();
Chris@0 124 break;
Chris@0 125 case 'uri':
Chris@0 126 case 'url':
Chris@0 127 $result = $request->getUri();
Chris@0 128 break;
Chris@0 129 case 'target':
Chris@0 130 $result = $request->getRequestTarget();
Chris@0 131 break;
Chris@0 132 case 'req_version':
Chris@0 133 $result = $request->getProtocolVersion();
Chris@0 134 break;
Chris@0 135 case 'res_version':
Chris@0 136 $result = $response
Chris@0 137 ? $response->getProtocolVersion()
Chris@0 138 : 'NULL';
Chris@0 139 break;
Chris@0 140 case 'host':
Chris@0 141 $result = $request->getHeaderLine('Host');
Chris@0 142 break;
Chris@0 143 case 'hostname':
Chris@0 144 $result = gethostname();
Chris@0 145 break;
Chris@0 146 case 'code':
Chris@0 147 $result = $response ? $response->getStatusCode() : 'NULL';
Chris@0 148 break;
Chris@0 149 case 'phrase':
Chris@0 150 $result = $response ? $response->getReasonPhrase() : 'NULL';
Chris@0 151 break;
Chris@0 152 case 'error':
Chris@0 153 $result = $error ? $error->getMessage() : 'NULL';
Chris@0 154 break;
Chris@0 155 default:
Chris@0 156 // handle prefixed dynamic headers
Chris@0 157 if (strpos($matches[1], 'req_header_') === 0) {
Chris@0 158 $result = $request->getHeaderLine(substr($matches[1], 11));
Chris@0 159 } elseif (strpos($matches[1], 'res_header_') === 0) {
Chris@0 160 $result = $response
Chris@0 161 ? $response->getHeaderLine(substr($matches[1], 11))
Chris@0 162 : 'NULL';
Chris@0 163 }
Chris@0 164 }
Chris@0 165
Chris@0 166 $cache[$matches[1]] = $result;
Chris@0 167 return $result;
Chris@0 168 },
Chris@0 169 $this->template
Chris@0 170 );
Chris@0 171 }
Chris@0 172
Chris@0 173 private function headers(MessageInterface $message)
Chris@0 174 {
Chris@0 175 $result = '';
Chris@0 176 foreach ($message->getHeaders() as $name => $values) {
Chris@0 177 $result .= $name . ': ' . implode(', ', $values) . "\r\n";
Chris@0 178 }
Chris@0 179
Chris@0 180 return trim($result);
Chris@0 181 }
Chris@0 182 }