Fix IHTTPResult::getHeader/s()

- Split functionality "getHeader()" and "getHeaders()" analog to IMessageInterface::getHeader/s()
- Fix functionality at various places
- Adapt CurlResultTest
This commit is contained in:
Philipp 2020-10-09 19:33:19 +02:00
parent fff94563d7
commit 933ea7c9ce
No known key found for this signature in database
GPG key ID: 9A28B7D4FF5667BD
11 changed files with 96 additions and 28 deletions

View file

@ -90,12 +90,13 @@ function parse_url_content(App $a)
if ($curlResponse->isSuccess()) {
// Convert the header fields into an array
$hdrs = [];
$h = explode("\n", $curlResponse->getHeader());
$h = $curlResponse->getHeaders();
foreach ($h as $l) {
$header = array_map('trim', explode(':', trim($l), 2));
if (count($header) == 2) {
list($k, $v) = $header;
$hdrs[$k] = $v;
foreach ($l as $k => $v) {
if (empty($hdrs[$k])) {
$hdrs[$k] = $v;
}
$hdrs[$k] .= " " . $v;
}
}
$type = null;

View file

@ -242,23 +242,29 @@ class CurlResult implements IHTTPResult
}
/** {@inheritDoc} */
public function getHeader(string $field = '')
public function getHeader($header)
{
if (empty($field)) {
return $this->header;
if (empty($header)) {
return '';
}
$field = strtolower(trim($field));
$header = strtolower(trim($header));
$headers = $this->getHeaderArray();
if (isset($headers[$field])) {
return $headers[$field];
if (isset($headers[$header])) {
return $headers[$header];
}
return '';
}
/** {@inheritDoc} */
public function getHeaders()
{
return $this->getHeaderArray();
}
/** {@inheritDoc} */
public function inHeader(string $field)
{

View file

@ -454,8 +454,7 @@ class HTTPRequest implements IHTTPRequest
'timeout' => $timeout,
'accept_content' => $accept_content,
'cookiejar' => $cookiejar
],
$redirects
]
);
}

View file

@ -2,6 +2,8 @@
namespace Friendica\Network;
use Psr\Http\Message\MessageInterface;
/**
* Temporary class to map Friendica used variables based on PSR-7 HTTPResponse
*/
@ -23,15 +25,25 @@ interface IHTTPResult
/**
* Returns the headers
* @see MessageInterface::getHeader()
*
* @param string $field optional header field. Return all fields if empty
* @param string $header optional header field. Return all fields if empty
*
* @return string the headers or the specified content of the header variable
*/
public function getHeader(string $field = '');
public function getHeader($header);
/**
* Returns all headers
* @see MessageInterface::getHeaders()
*
* @return string[][]
*/
public function getHeaders();
/**
* Check if a specified header exists
* @see MessageInterface::hasHeader()
*
* @param string $field header field
*
@ -41,8 +53,10 @@ interface IHTTPResult
/**
* Returns the headers as an associated array
* @see MessageInterface::getHeaders()
* @deprecated
*
* @return array associated header array
* @return string[][] associated header array
*/
public function getHeaderArray();
@ -62,6 +76,8 @@ interface IHTTPResult
public function getRedirectUrl();
/**
* @see MessageInterface::getBody()
*
* @return string
*/
public function getBody();

View file

@ -1358,7 +1358,7 @@ class DFRN
return -9; // timed out
}
if (($curl_stat == 503) && stristr($postResult->getHeader(), 'retry-after')) {
if (($curl_stat == 503) && $postResult->inHeader('retry-after')) {
return -10;
}
@ -1453,7 +1453,7 @@ class DFRN
return -9; // timed out
}
if (($curl_stat == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
if (($curl_stat == 503) && $postResult->inHeader('retry-after')) {
return -10;
}

View file

@ -746,7 +746,8 @@ class OStatus
$xml = '';
if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) {
if ($curlResult->inHeader('Content-Type') &&
stristr($curlResult->getHeader('Content-Type'), 'application/atom+xml')) {
$xml = $curlResult->getBody();
}
@ -939,7 +940,8 @@ class OStatus
$xml = '';
if (stristr($curlResult->getHeader(), 'Content-Type: application/atom+xml')) {
if ($curlResult->inHeader('Content-Type') &&
stristr($curlResult->getHeader('Content-Type'), 'application/atom+xml')) {
Logger::log('Directly fetched XML for URI ' . $related_uri, Logger::DEBUG);
$xml = $curlResult->getBody();
}

View file

@ -215,7 +215,7 @@ class Salmon
return -1;
}
if (($return_code == 503) && (stristr($postResult->getHeader(), 'retry-after'))) {
if (($return_code == 503) && $postResult->inHeader('retry-after')) {
return -1;
}

View file

@ -175,7 +175,6 @@ class ParseUrl
return $siteinfo;
}
$header = $curlResult->getHeader();
$body = $curlResult->getBody();
if ($do_oembed) {
@ -204,7 +203,7 @@ class ParseUrl
$charset = '';
// Look for a charset, first in headers
// Expected form: Content-Type: text/html; charset=ISO-8859-4
if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $header, $matches)) {
if (preg_match('/charset=([a-z0-9-_.\/]+)/i', $curlResult->getContentType(), $matches)) {
$charset = trim(trim(trim(array_pop($matches)), ';,'));
}

View file

@ -0,0 +1,20 @@
<?php
return [
'http/2 200' => '',
'date' => 'Thu, 11 Oct 2018 18:43:54 GMT',
'content-type' => 'text/html; charset=utf-8',
'vary' => 'Accept-Encoding',
'server' => 'Mastodon',
'x-frame-options' => 'SAMEORIGIN',
'x-content-type-options' => 'nosniff',
'x-xss-protection' => '1; mode=block',
'etag' => 'W/"706e6c48957e1d46ecf9d7597a7880af"',
'cache-control' => 'max-age=0, private, must-revalidate',
'set-cookie' => '_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly',
'x-request-id' => 'a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784',
'x-runtime' => '0.049566',
'strict-transport-security' => 'max-age=31536000; includeSubDomains; preload',
'referrer-policy' => 'same-origin',
'content-security-policy' => "frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de",
];

View file

@ -0,0 +1,21 @@
<?php
return [
'http/2 301' => '',
'date' => 'Thu, 11 Oct 2018 18:43:54 GMT',
'content-type' => 'text/html; charset=utf-8',
'vary' => 'Accept-Encoding',
'server' => 'Mastodon',
'location' => 'https://test.other/some/',
'x-frame-options' => 'SAMEORIGIN',
'x-content-type-options' => 'nosniff',
'x-xss-protection' => '1; mode=block',
'etag' => 'W/"706e6c48957e1d46ecf9d7597a7880af"',
'cache-control' => 'max-age=0, private, must-revalidate',
'set-cookie' => '_mastodon_session=v3kcy%2FW3aZYBBvZUohuwksEKwzYIyEUlEuJ1KqTAfWPKvVQq%2F4UuJ39zp621VyfpQNlvY46TL%2FYutzXowSLYQBNFCJcrEiF04aU0TdtHls9zynMiyeHhoVgCijOXWXNt9%2FCmpQ49RkNEujkv9NaJ0cum32MCVZKjE9%2BMKmLM%2F8ZygZeLBGJ7sg%3D%3D--QGIiU0%2FpXc3Aym8F--he2iRRPePOdtEs3z%2BufSXg%3D%3D; path=/; secure; HttpOnly',
'x-request-id' => 'a0c0b8e7-cd60-4efa-b79b-cf1b0d5a0784',
'x-runtime' => '0.049566',
'strict-transport-security' => 'max-age=31536000; includeSubDomains; preload',
'referrer-policy' => 'same-origin',
'content-security-policy' => "frame-ancestors 'none'; script-src 'self'; object-src 'self'; img-src * data: blob:; media-src 'self' data:; font-src 'self' data: https://fonts.gstatic.com/; connect-src 'self' blob: wss://mastodonten.de",
];

View file

@ -53,6 +53,7 @@ class CurlResultTest extends TestCase
public function testNormal()
{
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
@ -65,7 +66,7 @@ class CurlResultTest extends TestCase
$this->assertTrue($curlResult->isSuccess());
$this->assertFalse($curlResult->isTimeout());
$this->assertFalse($curlResult->isRedirectUrl());
$this->assertSame($header, $curlResult->getHeader());
$this->assertSame($headerArray, $curlResult->getHeaders());
$this->assertSame($body, $curlResult->getBody());
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
$this->assertSame('https://test.local', $curlResult->getUrl());
@ -80,6 +81,7 @@ class CurlResultTest extends TestCase
public function testRedirect()
{
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
@ -93,7 +95,7 @@ class CurlResultTest extends TestCase
$this->assertTrue($curlResult->isSuccess());
$this->assertFalse($curlResult->isTimeout());
$this->assertTrue($curlResult->isRedirectUrl());
$this->assertSame($header, $curlResult->getHeader());
$this->assertSame($headerArray, $curlResult->getHeaders());
$this->assertSame($body, $curlResult->getBody());
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
$this->assertSame('https://test.local/test/it', $curlResult->getUrl());
@ -106,6 +108,7 @@ class CurlResultTest extends TestCase
public function testTimeout()
{
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.head');
$headerArray = include(__DIR__ . '/../../datasets/curl/about.head.php');
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
@ -119,7 +122,7 @@ class CurlResultTest extends TestCase
$this->assertFalse($curlResult->isSuccess());
$this->assertTrue($curlResult->isTimeout());
$this->assertFalse($curlResult->isRedirectUrl());
$this->assertSame($header, $curlResult->getHeader());
$this->assertSame($headerArray, $curlResult->getHeaders());
$this->assertSame($body, $curlResult->getBody());
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
$this->assertSame('https://test.local/test/it', $curlResult->getRedirectUrl());
@ -134,6 +137,7 @@ class CurlResultTest extends TestCase
public function testRedirectHeader()
{
$header = file_get_contents(__DIR__ . '/../../datasets/curl/about.redirect');
$headerArray = include(__DIR__ . '/../../datasets/curl/about.redirect.php');
$body = file_get_contents(__DIR__ . '/../../datasets/curl/about.body');
@ -146,7 +150,7 @@ class CurlResultTest extends TestCase
$this->assertTrue($curlResult->isSuccess());
$this->assertFalse($curlResult->isTimeout());
$this->assertTrue($curlResult->isRedirectUrl());
$this->assertSame($header, $curlResult->getHeader());
$this->assertSame($headerArray, $curlResult->getHeaders());
$this->assertSame($body, $curlResult->getBody());
$this->assertSame('text/html; charset=utf-8', $curlResult->getContentType());
$this->assertSame('https://test.local/test/it?key=value', $curlResult->getUrl());
@ -204,7 +208,7 @@ class CurlResultTest extends TestCase
'url' => 'https://test.local'
]);
$this->assertNotEmpty($curlResult->getHeader());
$this->assertNotEmpty($curlResult->getHeaders());
$this->assertEmpty($curlResult->getHeader('wrongHeader'));
}
}