received = null; $this->has_content = false; $this->method = $method; $this->request = curl_init(); $this->setopt(CURLOPT_RETURNTRANSFER, true); $this->setopt(CURLOPT_FAILONERROR, true); $this->setopt(CURLOPT_HEADER, true); $this->setopt(CURLOPT_CUSTOMREQUEST, $method); $this->setopt(CURLOPT_URL, curl_escape($url)); } public function set_json(array $content): object { if ($this->has_content) { throw new RuntimeException('JSON content already set.'); } if ($this->method === 'GET' or $this->method === 'HEAD') { throw new TypeError("JSON request can not be GET or HEAD."); } $converted = json_encode($content); $headers = [ 'Content-Type: application/json' ]; $this->has_content = true; $this->setopt(CURLOPT_POSTFIELDS, $converted); $this->setopt(CURLOPT_HTTPHEADER, $headers); return $this; } public function request(): string { if ($this->received !== null) { return $this->received; } $result = curl_exec($this->request); $error = curl_error($this->request); $error_number = curl_errno($this->request); curl_close($this->received); if ($result !== false and $error_number === 0) { return $this->received = $result; } throw new RuntimeException( 'Can not fetch request. Error code ' .string($error_number) .': "'.$error.'".' ); } private function setopt(int $option, mixed $content): void { curl_setopt($this->request, $option, $content); } }