in src/ClientImpl.php [677:748]
private static function httpErrors(
\Psr\Http\Message\RequestInterface $request,
\Psr\Http\Message\ResponseInterface $response,
array $options
)
{
$statusCode = $response->getStatusCode();
if (intval($statusCode / 100) == 2) {
return;
}
$content = isset($options['sink']) ? $options['sink']->getMemContent() :
$response->getBody()->getContents();
$code = 'BadErrorResponse';
$message = '';
$ec = '';
$requestId = '';
$errorFields = [];
$xmlStr = $content;
if ($xmlStr === '' && $response->hasHeader('x-oss-err')) {
$xmlStr = base64_decode($response->getHeader('x-oss-err')[0]);
}
if (strpos($xmlStr, '<Error>') !== false) {
try {
$xml = Utils::parseXml($xmlStr);
$code = isset($xml->Code) ? (string)$xml->Code : $code;
$message = isset($xml->Message) ? (string)$xml->Message : '';
$ec = isset($xml->EC) ? (string)$xml->EC : '';
$requestId = isset($xml->RequestId) ? (string)$xml->RequestId : '';
foreach ($xml as $key => $val) {
$errorFields[$key] = (string)$val;
}
} catch (\Exception $e) {
//maybe contains speical char, from 0x1 - 0x1F
//find <Code>...</Code> <Message>...</Message> <RequestId>...</RequestId> <EC>...</EC>
$value = Utils::findXmlElementText($xmlStr, 'Code');
if ($value !== '') {
$code = $value;
$message = Utils::findXmlElementText($xmlStr, 'Message');
$requestId = Utils::findXmlElementText($xmlStr, 'RequestId');
$ec = Utils::findXmlElementText($xmlStr, 'EC');
} else {
$message = 'Failed to parse xml from response body, part response body ' . substr($xmlStr, 0, 256);
}
}
} else {
$message = 'Not found tag <Error>, part response body ' . substr($xmlStr, 0, 256);
}
if ($requestId == '' && $response->hasHeader('x-oss-request-id')) {
$requestId = $response->getHeader('x-oss-request-id')[0];
}
if ($ec == '' && $response->hasHeader('x-oss-ec')) {
$ec = $response->getHeader('x-oss-ec')[0];
}
throw new Exception\ServiceException(
[
'status_code' => $statusCode,
'request_id' => $requestId,
'code' => $code,
'message' => $message,
'ec' => $ec,
'request_target' => $request->getMethod() . ' ' . $request->getUri(),
'snapshot' => $content,
'headers' => $response->getHeaders(),
'error_fields' => $errorFields
]
);
}