summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2023-10-24 22:27:27 +0300
committerAndrew Dolgov <[email protected]>2023-10-24 22:27:27 +0300
commit69c1c629927cd78286fc6c8d61b5b5ad78245508 (patch)
tree01cf192af1d71f6406aed02e492749f70d96d4c8
parentde2830b241dc393695fe9278d431d412c1be6266 (diff)
add a workaround for make_self_url() when invoked off /api/ endpoint, add unit tests for this method
-rw-r--r--.vscode/tasks.json28
-rw-r--r--classes/config.php6
-rw-r--r--tests/SelfUrlPathTest.php106
-rwxr-xr-xutils/phpunit.sh6
4 files changed, 133 insertions, 13 deletions
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index d59e3ff10..11fd2c305 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -6,22 +6,30 @@
"label": "phpstan (watcher)",
"isBackground": true,
"problemMatcher": {
- "fileLocation": ["relative", "${workspaceRoot}"],
+ "fileLocation": [
+ "relative",
+ "${workspaceRoot}"
+ ],
"owner": "phpstan-watcher",
"pattern": {
- "regexp": "^/app/(.*?):([0-9\\?]*):(.*)$",
- "file": 1,
- "line": 2,
- "message": 3
+ "regexp": "^/app/(.*?):([0-9\\?]*):(.*)$",
+ "file": 1,
+ "line": 2,
+ "message": 3
},
"background": {
"activeOnStart": true,
"beginsPattern": "Using configuration file",
"endsPattern": "All done"
-
}
- },
- "command": "chmod +x ${workspaceRoot}/utils/phpstan-watcher.sh && ${workspaceRoot}/utils/phpstan-watcher.sh",
+ },
+ "command": "chmod +x ${workspaceRoot}/utils/phpstan-watcher.sh && ${workspaceRoot}/utils/phpstan-watcher.sh"
+ },
+ {
+ "type": "shell",
+ "label": "phpunit",
+ "command": "chmod +x ${workspaceRoot}/utils/phpunit.sh && ${workspaceRoot}/utils/phpunit.sh",
+ "problemMatcher": []
},
{
"type": "gulp",
@@ -30,9 +38,9 @@
"label": "gulp: default",
"options": {
"env": {
- "PATH": "${env:PATH}:/usr/lib/sdk/node16/bin/"
+ "PATH": "${env:PATH}:/usr/lib/sdk/node16/bin/"
}
- }
+ }
}
]
}
diff --git a/classes/config.php b/classes/config.php
index 17c555fa9..72d6c5106 100644
--- a/classes/config.php
+++ b/classes/config.php
@@ -479,14 +479,14 @@ class Config {
/** returns fully-qualified external URL to tt-rss (no trailing slash)
* SELF_URL_PATH configuration variable is used as a fallback for the CLI SAPI
* */
- static function get_self_url() : string {
- if (php_sapi_name() == "cli") {
+ static function get_self_url(bool $always_detect = false) : string {
+ if (!$always_detect && php_sapi_name() == "cli") {
return self::get(Config::SELF_URL_PATH);
} else {
$proto = self::is_server_https() ? 'https' : 'http';
$self_url_path = $proto . '://' . $_SERVER["HTTP_HOST"] . parse_url($_SERVER["REQUEST_URI"], PHP_URL_PATH);
- $self_url_path = preg_replace("/\w+\.php(\?.*$)?$/", "", $self_url_path);
+ $self_url_path = preg_replace("/(\/api\/{1,})?(\w+\.php)?(\?.*$)?$/", "", $self_url_path);
if (substr($self_url_path, -1) === "/") {
return substr($self_url_path, 0, -1);
diff --git a/tests/SelfUrlPathTest.php b/tests/SelfUrlPathTest.php
new file mode 100644
index 000000000..b8892f84b
--- /dev/null
+++ b/tests/SelfUrlPathTest.php
@@ -0,0 +1,106 @@
+<?php
+use PHPUnit\Framework\TestCase;
+
+final class SelfUrlPathTest extends TestCase {
+ public function test_a(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_X_FORWARDED_PROTO"] = "http";
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/tt-rss/api/index.php";
+
+ $this->assertEquals(
+ 'http://example.com/tt-rss',
+ Config::get_self_url(true)
+ );
+
+ }
+
+ public function test_b(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_X_FORWARDED_PROTO"] = "https";
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/api/";
+
+ $this->assertEquals(
+ 'https://example.com',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_c(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_X_FORWARDED_PROTO"] = "https";
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/api/index.php";
+
+ $this->assertEquals(
+ 'https://example.com',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_d(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_X_FORWARDED_PROTO"] = "https";
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/api//";
+
+ $this->assertEquals(
+ 'https://example.com',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_e(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_X_FORWARDED_PROTO"] = "https";
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/";
+
+ $this->assertEquals(
+ 'https://example.com',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_f(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/tt-rss/index.php";
+
+ $this->assertEquals(
+ 'http://example.com/tt-rss',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_g(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/tt-rss/";
+
+ $this->assertEquals(
+ 'http://example.com/tt-rss',
+ Config::get_self_url(true)
+ );
+ }
+
+ public function test_h(): void {
+ $_SERVER = [];
+
+ $_SERVER["HTTP_HOST"] = "example.com";
+ $_SERVER["REQUEST_URI"] = "/tt-rss";
+
+ $this->assertEquals(
+ 'http://example.com/tt-rss',
+ Config::get_self_url(true)
+ );
+ }
+}
diff --git a/utils/phpunit.sh b/utils/phpunit.sh
new file mode 100755
index 000000000..2aa166283
--- /dev/null
+++ b/utils/phpunit.sh
@@ -0,0 +1,6 @@
+#!/bin/sh
+
+docker run --rm -v $(pwd):/app \
+ --workdir /app registry.fakecake.org/ci/php8.2-alpine:3.18 php82 -d memory_limit=-1 ./vendor/bin/phpunit
+
+