* * This source file is subject to the MIT license that is bundled * with this source code in the file LICENSE. */ namespace ByteDance\Kernel\Http; use ByteDance\Kernel\Exceptions\InvalidArgumentException; use ByteDance\Kernel\Exceptions\RuntimeException; use ByteDance\Kernel\Support\File; use GuzzleHttp\Psr7\Response as GuzzleResponse; use ByteDance\Kernel\Support\Collection; use Psr\Http\Message\ResponseInterface; /** * Class Response. * * @author overtrue */ class Response extends GuzzleResponse { /** * @return string */ public function getBodyContents() { $this->getBody()->rewind(); $contents = $this->getBody()->getContents(); $this->getBody()->rewind(); return $contents; } /** * @param \Psr\Http\Message\ResponseInterface $response * * @return \ByteDance\Kernel\Http\Response */ public static function buildFromPsrResponse(ResponseInterface $response) { return new static( $response->getStatusCode(), $response->getHeaders(), $response->getBody(), $response->getProtocolVersion(), $response->getReasonPhrase() ); } /** * Build to json. * * @return string */ public function toJson() { return json_encode($this->toArray()); } /** * Build to array. * * @return array */ public function toArray() { $content = $this->removeControlCharacters($this->getBodyContents()); $array = json_decode($content, true, 512, JSON_BIGINT_AS_STRING); if (JSON_ERROR_NONE === json_last_error()) { return (array) $array; } return []; } /** * Get collection data. * * @return \ByteDance\Kernel\Support\Collection */ public function toCollection() { return new Collection($this->toArray()); } /** * @return object */ public function toObject() { return json_decode($this->toJson()); } /** * @return bool|string */ public function __toString() { return $this->getBodyContents(); } /** * @param string $content * * @return string */ protected function removeControlCharacters(string $content) { return \preg_replace('/[\x00-\x1F\x80-\x9F]/u', '', $content); } /** * @param string $directory * @param string $filename * @param bool $appendSuffix * * @return bool|int * * @throws \ByteDance\Kernel\Exceptions\InvalidArgumentException * @throws \ByteDance\Kernel\Exceptions\RuntimeException */ public function save(string $directory, string $filename = '', bool $appendSuffix = true) { $this->getBody()->rewind(); $directory = rtrim($directory, '/'); if (!is_dir($directory)) { mkdir($directory, 0755, true); // @codeCoverageIgnore } if (!is_writable($directory)) { throw new InvalidArgumentException(sprintf("'%s' is not writable.", $directory)); } $contents = $this->getBody()->getContents(); if (empty($contents) || '{' === $contents[0]) { throw new RuntimeException('Invalid media response content.'); } if (empty($filename)) { if (preg_match('/filename="(?.*?)"/', $this->getHeaderLine('Content-Disposition'), $match)) { $filename = $match['filename']; } else { $filename = md5($contents); } } if ($appendSuffix && empty(pathinfo($filename, PATHINFO_EXTENSION))) { $filename .= File::getStreamExt($contents); } file_put_contents($directory.'/'.$filename, $contents); return $filename; } }