annotate vendor/guzzlehttp/guzzle/src/MessageFormatter.php @ 19:fa3358dc1485 tip

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