From 75ba439f5be1e049a8ba680bd7736b57cf65161d Mon Sep 17 00:00:00 2001 From: Jake Dallimore Date: Fri, 5 May 2023 10:00:28 +0800 Subject: [PATCH] MDL-77990 enrol_lti: fix http_client shim by using curl getResponse Fixes an error in the parsing of response headers containing multiple HTTP responses in the raw response. Curl already handles this, so let it do the work. --- .../local/ltiadvantage/lib/http_client.php | 20 ++++--------------- 1 file changed, 4 insertions(+), 16 deletions(-) diff --git a/enrol/lti/classes/local/ltiadvantage/lib/http_client.php b/enrol/lti/classes/local/ltiadvantage/lib/http_client.php index 1911ea2e1d08b..7d77cf895705a 100644 --- a/enrol/lti/classes/local/ltiadvantage/lib/http_client.php +++ b/enrol/lti/classes/local/ltiadvantage/lib/http_client.php @@ -77,23 +77,11 @@ function(&$val, $key) { $info = $this->curlclient->get_info(); if (!$this->curlclient->get_errno() && !$this->curlclient->error) { // No errors, so format the response. - $headersize = $info['header_size']; - $resheaders = substr($res ?? '', 0, $headersize); - $resbody = substr($res ?? '', $headersize); - $headerlines = array_filter(explode("\r\n", $resheaders)); - $parsedresponseheaders = [ - 'httpstatus' => array_shift($headerlines) - ]; - foreach ($headerlines as $headerline) { - $headerbits = explode(':', $headerline, 2); - if (count($headerbits) == 2) { - // Only parse headers having colon separation. - $parsedresponseheaders[$headerbits[0]] = $headerbits[1]; - } - } - $response = new http_response(['headers' => $parsedresponseheaders, 'body' => $resbody], intval($info['http_code'])); + $resbody = substr($res ?? '', $info['header_size']); + $headers = $this->curlclient->getResponse(); + $response = new http_response(['headers' => $headers, 'body' => $resbody], intval($info['http_code'])); if ($response->getStatusCode() >= 400) { - throw new http_exception($response, "An HTTP error status was received: '{$response->getHeaders()['httpstatus']}'"); + throw new http_exception($response, "An HTTP error status was received: '".reset($headers)."'"); } return $response; }