Quellcode durchsuchen

Better merging of custom HTTP headers (#8251)

Alternative to https://github.com/FreshRSS/FreshRSS/pull/8246
See https://github.com/FreshRSS/FreshRSS/issues/8189#issuecomment-3569434305
Alexandre Alapetite vor 4 Monaten
Ursprung
Commit
76f5bee76d
2 geänderte Dateien mit 27 neuen und 2 gelöschten Zeilen
  1. 1 1
      app/Models/SimplePieCustom.php
  2. 26 1
      app/Models/SimplePieFetch.php

+ 1 - 1
app/Models/SimplePieCustom.php

@@ -11,7 +11,7 @@ final class FreshRSS_SimplePieCustom extends \SimplePie\SimplePie
 	public function __construct(array $attributes = [], array $curl_options = []) {
 		parent::__construct();
 		$limits = FreshRSS_Context::systemConf()->limits;
-		$this->get_registry()->register(\SimplePie\File::class, FreshRSS_SimplePieResponse::class);
+		$this->get_registry()->register(\SimplePie\File::class, FreshRSS_SimplePieFetch::class);
 		$this->set_useragent(FRESHRSS_USERAGENT);
 		$this->set_cache_name_function('sha1');
 		$this->set_cache_location(CACHE_PATH);

+ 26 - 1
app/Models/SimplePieResponse.php → app/Models/SimplePieFetch.php

@@ -1,8 +1,33 @@
 <?php
 declare(strict_types=1);
 
-final class FreshRSS_SimplePieResponse extends \SimplePie\File
+final class FreshRSS_SimplePieFetch extends \SimplePie\File
 {
+	public function __construct(string $url, int $timeout = 10, int $redirects = 5,
+		?array $headers = null, ?string $useragent = null, bool $force_fsockopen = false, array $curl_options = []) {
+
+		// Remove case-insensitively default HTTP headers passed by $headers if they are overridden by $curl_options[CURLOPT_HTTPHEADER]
+		if (is_array($curl_options[CURLOPT_HTTPHEADER] ?? null) && is_array($headers)) {
+			$existingKeys = [];
+			foreach ($curl_options[CURLOPT_HTTPHEADER] as $headerLine) {
+				if (!is_string($headerLine)) {
+					continue;
+				}
+				$parts = explode(':', $headerLine, 2);
+				if (count($parts) >= 2) {
+					$existingKeys[strtolower(trim($parts[0]))] = true;
+				}
+			}
+			foreach ($headers as $key => $value) {
+				if (isset($existingKeys[strtolower($key)])) {
+					unset($headers[$key]);
+				}
+			}
+		}
+
+		parent::__construct($url, $timeout, $redirects, $headers, $useragent, $force_fsockopen, $curl_options);
+	}
+
 	#[\Override]
 	protected function on_http_response($response, array $curl_options = []): void {
 		if (FreshRSS_Context::systemConf()->simplepie_syslog_enabled) {