From 3ae5912a4c487e5bdba12864252f8ce0cdd45059 Mon Sep 17 00:00:00 2001 From: sun Date: Tue, 1 Jul 2014 13:58:20 +0200 Subject: [PATCH 1/2] Use cURL extension instead of Guzzle. --- composer.json | 2 +- .../Bundle/TestReporterBundle/ApiClient.php | 39 +++++++++++-------- .../Command/TestReporterCommand.php | 31 +++++++-------- 3 files changed, 37 insertions(+), 35 deletions(-) diff --git a/composer.json b/composer.json index 94645b6..8409641 100644 --- a/composer.json +++ b/composer.json @@ -15,7 +15,7 @@ ], "require": { "php": ">=5.3", - "guzzle/guzzle": ">=3.0", + "ext-curl": "*", "satooshi/php-coveralls": ">=0.6.1", "symfony/console": ">=2.0" }, diff --git a/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php b/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php index 0d5d394..fb8ac1d 100644 --- a/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php +++ b/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php @@ -1,17 +1,12 @@ client = new Client(); $this->apiHost = "https://codeclimate.com"; if (isset($_SERVER["CODECLIMATE_API_HOST"])) { @@ -22,18 +17,30 @@ public function __construct() public function send($json) { - $request = $this->client->createRequest('POST', $this->apiHost."/test_reports"); - $response = false; - - $request->setHeader("User-Agent", "Code Climate (PHP Test Reporter v".Version::VERSION.")"); - $request->setHeader("Content-Type", "application/json"); - $request->setBody($json); - - try { - $response = $this->client->send($request); - } catch (ClientErrorResponseException $e) { - $response = $e->getResponse(); + $ch = curl_init(); + curl_setopt_array($ch, array( + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_URL => $this->apiHost.'/test_reports', + CURLOPT_USERAGENT => 'Code Climate (PHP Test Reporter v'.Version::VERSION.')', + CURLOPT_HTTPHEADER => array('Content-Type: application/json'), + CURLOPT_HEADER => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => (string)$json, + )); + + $response = new \stdClass; + if ($raw_response = curl_exec($ch)) { + list($response->headers, $response->body) = explode("\r\n\r\n", $raw_response, 2); + $response->headers = explode("\r\n", $response->headers); + list(, $response->code, $response->message) = explode(' ', $response->headers[0], 3); + } + else { + $response->code = -curl_errno($ch); + $response->message = curl_error($ch); + $response->headers = array(); + $response->body = NULL; } + curl_close($ch); return $response; } diff --git a/src/CodeClimate/Bundle/TestReporterBundle/Command/TestReporterCommand.php b/src/CodeClimate/Bundle/TestReporterBundle/Command/TestReporterCommand.php index 183d9ac..4fd439d 100644 --- a/src/CodeClimate/Bundle/TestReporterBundle/Command/TestReporterCommand.php +++ b/src/CodeClimate/Bundle/TestReporterBundle/Command/TestReporterCommand.php @@ -61,26 +61,21 @@ protected function execute(InputInterface $input, OutputInterface $output) } else { $client = new ApiClient(); $response = $client->send($json); + switch ($response->code) { + case 200: + $output->writeln("Test coverage data sent."); + break; - if ($response) { - $code = $response->getStatusCode(); + case 401: + $output->writeln("Invalid CODECLIMATE_REPO_TOKEN."); + $ret = 1; + break; - switch ($code) { - case 200: - $output->writeln("Test coverage data sent"); - break; - case 401: - $output->writeln("An invalid CODECLIMATE_REPO_TOKEN repo token was specified."); - $ret = 1; - break; - default: - $output->writeln("Status code: ".$code); - $ret = 1; - break; - } - } else { - $output->writeln("Unknown error posting Test coverage data."); - $ret = 1; + default: + $output->writeln("Unexpected response: ".$response->code." ".$response->message); + $output->writeln($response->body); + $ret = 1; + break; } } From 7875a8979f0292a3e540f462a4038be040be8894 Mon Sep 17 00:00:00 2001 From: patrick brisbin Date: Thu, 17 Jul 2014 14:24:22 -0400 Subject: [PATCH 2/2] Correctly handle 100 Continue HTTP status When the server returns 100 Continue, the full HTTP response will be in $response->body. By re-executing the parse on that body until the response is no longer 100, we'll get the real status. --- .../Bundle/TestReporterBundle/ApiClient.php | 42 +++++++++++-------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php b/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php index fb8ac1d..105c651 100644 --- a/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php +++ b/src/CodeClimate/Bundle/TestReporterBundle/ApiClient.php @@ -10,7 +10,7 @@ public function __construct() $this->apiHost = "https://codeclimate.com"; if (isset($_SERVER["CODECLIMATE_API_HOST"])) { - $this->apiHost = $_SERVER["CODECLIMATE_API_HOST"]; + $this->apiHost = $_SERVER["CODECLIMATE_API_HOST"]; } } @@ -19,29 +19,37 @@ public function send($json) { $ch = curl_init(); curl_setopt_array($ch, array( - CURLOPT_CUSTOMREQUEST => 'POST', - CURLOPT_URL => $this->apiHost.'/test_reports', - CURLOPT_USERAGENT => 'Code Climate (PHP Test Reporter v'.Version::VERSION.')', - CURLOPT_HTTPHEADER => array('Content-Type: application/json'), - CURLOPT_HEADER => true, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_POSTFIELDS => (string)$json, + CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_URL => $this->apiHost.'/test_reports', + CURLOPT_USERAGENT => 'Code Climate (PHP Test Reporter v'.Version::VERSION.')', + CURLOPT_HTTPHEADER => array('Content-Type: application/json'), + CURLOPT_HEADER => true, + CURLOPT_RETURNTRANSFER => true, + CURLOPT_POSTFIELDS => (string)$json, )); $response = new \stdClass; if ($raw_response = curl_exec($ch)) { - list($response->headers, $response->body) = explode("\r\n\r\n", $raw_response, 2); - $response->headers = explode("\r\n", $response->headers); - list(, $response->code, $response->message) = explode(' ', $response->headers[0], 3); - } - else { - $response->code = -curl_errno($ch); - $response->message = curl_error($ch); - $response->headers = array(); - $response->body = NULL; + $this->buildResponse($response, $raw_response); + + while ($response->code == 100) { // Continue + $this->buildResponse($response, $response->body); + } + } else { + $response->code = -curl_errno($ch); + $response->message = curl_error($ch); + $response->headers = array(); + $response->body = NULL; } curl_close($ch); return $response; } + + private function buildResponse($response, $body) + { + list($response->headers, $response->body) = explode("\r\n\r\n", $body, 2); + $response->headers = explode("\r\n", $response->headers); + list(, $response->code, $response->message) = explode(' ', $response->headers[0], 3); + } }