Merge pull request #9437 from nupplaphil/task/httprequest_head
authorHypolite Petovan <hypolite@mrpetovan.com>
Mon, 19 Oct 2020 12:36:00 +0000 (08:36 -0400)
committerGitHub <noreply@github.com>
Mon, 19 Oct 2020 12:36:00 +0000 (08:36 -0400)
Add HTTPRequest::head() function

mod/parse_url.php
src/Model/GServer.php
src/Module/Magic.php
src/Network/HTTPRequest.php
src/Network/IHTTPRequest.php
src/Util/HTTPSignature.php

index ede557f..1904d92 100644 (file)
@@ -85,7 +85,7 @@ function parse_url_content(App $a)
        // Check if the URL is an image, video or audio file. If so format
        // the URL with the corresponding BBCode media tag
        // Fetch the header of the URL
-       $curlResponse = DI::httpRequest()->get($url, ['novalidate' => true, 'nobody' => true]);
+       $curlResponse = DI::httpRequest()->head($url);
 
        if ($curlResponse->isSuccess()) {
                // Convert the header fields into an array
index 009816d..3a2a0bd 100644 (file)
@@ -1639,7 +1639,7 @@ class GServer
                if (!empty($accesstoken)) {
                        $api = 'https://instances.social/api/1.0/instances/list?count=0';
                        $header = ['Authorization: Bearer '.$accesstoken];
-                       $curlResult = DI::httpRequest()->get($api, ['headers' => $header]);
+                       $curlResult = DI::httpRequest()->get($api, ['header' => $header]);
 
                        if ($curlResult->isSuccess()) {
                                $servers = json_decode($curlResult->getBody(), true);
index fc37d91..af8ff36 100644 (file)
@@ -88,19 +88,19 @@ class Magic extends BaseModule
                                $exp = explode('/profile/', $contact['url']);
                                $basepath = $exp[0];
 
-                               $headers = [];
-                               $headers['Accept'] = 'application/x-dfrn+json, application/x-zot+json';
-                               $headers['X-Open-Web-Auth'] = Strings::getRandomHex();
+                               $header = [];
+                               $header['Accept'] = 'application/x-dfrn+json, application/x-zot+json';
+                               $header['X-Open-Web-Auth'] = Strings::getRandomHex();
 
                                // Create a header that is signed with the local users private key.
-                               $headers = HTTPSignature::createSig(
-                                       $headers,
+                               $header = HTTPSignature::createSig(
+                                       $header,
                                        $user['prvkey'],
                                        'acct:' . $user['nickname'] . '@' . DI::baseUrl()->getHostname() . (DI::baseUrl()->getUrlPath() ? '/' . DI::baseUrl()->getUrlPath() : '')
                                );
 
                                // Try to get an authentication token from the other instance.
-                               $curlResult = DI::httpRequest()->get($basepath . '/owa', ['headers' => $headers]);
+                               $curlResult = DI::httpRequest()->get($basepath . '/owa', ['header' => $header]);
 
                                if ($curlResult->isSuccess()) {
                                        $j = json_decode($curlResult->getBody(), true);
index 6442295..a0d9404 100644 (file)
@@ -52,6 +52,17 @@ class HTTPRequest implements IHTTPRequest
                $this->baseUrl  = $baseUrl->get();
        }
 
+       /** {@inheritDoc}
+        *
+        * @throws HTTPException\InternalServerErrorException
+        */
+       public function head(string $url, array $opts = [])
+       {
+               $opts['nobody'] = true;
+
+               return $this->get($url, $opts);
+       }
+
        /**
         * {@inheritDoc}
         *
@@ -130,6 +141,7 @@ class HTTPRequest implements IHTTPRequest
                curl_setopt($ch, CURLOPT_ENCODING, '');
 
                if (!empty($opts['headers'])) {
+                       $this->logger->notice('Wrong option \'headers\' used.');
                        @curl_setopt($ch, CURLOPT_HTTPHEADER, $opts['headers']);
                }
 
@@ -172,8 +184,6 @@ class HTTPRequest implements IHTTPRequest
                        curl_setopt($ch, CURLOPT_IPRESOLVE, CURL_IPRESOLVE_V4);
                }
 
-               $logger = $this->logger;
-
                $s         = @curl_exec($ch);
                $curl_info = @curl_getinfo($ch);
 
index d6bf981..8927941 100644 (file)
@@ -29,12 +29,10 @@ interface IHTTPRequest
        /**
         * Fetches the content of an URL
         *
-        * If binary flag is true, return binary results.
         * Set the cookiejar argument to a string (e.g. "/tmp/friendica-cookies.txt")
         * to preserve cookies from one request to the next.
         *
         * @param string $url             URL to fetch
-        *                                TRUE if asked to return binary results (file download)
         * @param int    $timeout         Timeout in seconds, default system config value or 60 seconds
         * @param string $accept_content  supply Accept: header with 'accept_content' as the value
         * @param string $cookiejar       Path to cookie jar file
@@ -50,7 +48,6 @@ interface IHTTPRequest
         * all the information collected during the fetch.
         *
         * @param string $url             URL to fetch
-        *                                TRUE if asked to return binary results (file download)
         * @param int    $timeout         Timeout in seconds, default system config value or 60 seconds
         * @param string $accept_content  supply Accept: header with 'accept_content' as the value
         * @param string $cookiejar       Path to cookie jar file
@@ -59,17 +56,27 @@ interface IHTTPRequest
         */
        public function fetchFull(string $url, int $timeout = 0, string $accept_content = '', string $cookiejar = '');
 
+       /**
+        * Send a HEAD to an URL.
+        *
+        * @param string $url        URL to fetch
+        * @param array  $opts       (optional parameters) assoziative array with:
+        *                           'accept_content' => supply Accept: header with 'accept_content' as the value
+        *                           'timeout' => int Timeout in seconds, default system config value or 60 seconds
+        *                           'cookiejar' => path to cookie jar file
+        *                           'header' => header array
+        *
+        * @return CurlResult
+        */
+       public function head(string $url, array $opts = []);
+
        /**
         * Send a GET to an URL.
         *
         * @param string $url        URL to fetch
-        *                           TRUE if asked to return binary results (file download)
         * @param array  $opts       (optional parameters) assoziative array with:
         *                           'accept_content' => supply Accept: header with 'accept_content' as the value
         *                           'timeout' => int Timeout in seconds, default system config value or 60 seconds
-        *                           'http_auth' => username:password
-        *                           'novalidate' => do not validate SSL certs, default is to validate using our CA list
-        *                           'nobody' => only return the header
         *                           'cookiejar' => path to cookie jar file
         *                           'header' => header array
         *
index e3ed5d0..e3244fa 100644 (file)
@@ -403,8 +403,6 @@ class HTTPSignature
         * @param array   $opts    (optional parameters) assoziative array with:
         *                         'accept_content' => supply Accept: header with 'accept_content' as the value
         *                         'timeout' => int Timeout in seconds, default system config value or 60 seconds
-        *                         'http_auth' => username:password
-        *                         'novalidate' => do not validate SSL certs, default is to validate using our CA list
         *                         'nobody' => only return the header
         *                         'cookiejar' => path to cookie jar file
         *
@@ -413,7 +411,7 @@ class HTTPSignature
         */
        public static function fetchRaw($request, $uid = 0, $binary = false, $opts = [])
        {
-               $headers = [];
+               $header = [];
 
                if (!empty($uid)) {
                        $owner = User::getOwnerDataById($uid);
@@ -433,23 +431,27 @@ class HTTPSignature
                        $path = parse_url($request, PHP_URL_PATH);
                        $date = DateTimeFormat::utcNow(DateTimeFormat::HTTP);
 
-                       $headers = ['Date: ' . $date, 'Host: ' . $host];
+                       $header = ['Date: ' . $date, 'Host: ' . $host];
 
                        $signed_data = "(request-target): get " . $path . "\ndate: ". $date . "\nhost: " . $host;
 
                        $signature = base64_encode(Crypto::rsaSign($signed_data, $owner['uprvkey'], 'sha256'));
 
-                       $headers[] = 'Signature: keyId="' . $owner['url'] . '#main-key' . '",algorithm="rsa-sha256",headers="(request-target) date host",signature="' . $signature . '"';
+                       $header[] = 'Signature: keyId="' . $owner['url'] . '#main-key' . '",algorithm="rsa-sha256",headers="(request-target) date host",signature="' . $signature . '"';
                }
 
                if (!empty($opts['accept_content'])) {
-                       $headers[] = 'Accept: ' . $opts['accept_content'];
+                       $header[] = 'Accept: ' . $opts['accept_content'];
                }
 
                $curl_opts = $opts;
-               $curl_opts['header'] = $headers;
+               $curl_opts['header'] = $header;
 
-               $curlResult = DI::httpRequest()->get($request, $curl_opts);
+               if ($opts['nobody']) {
+                       $curlResult = DI::httpRequest()->head($request, $curl_opts);
+               } else {
+                       $curlResult = DI::httpRequest()->get($request, $curl_opts);
+               }
                $return_code = $curlResult->getReturnCode();
 
                Logger::log('Fetched for user ' . $uid . ' from ' . $request . ' returned ' . $return_code, Logger::DEBUG);