aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Dag <me@dvikan.no> 2024-03-12 23:59:10 +0100
committerGravatar GitHub <noreply@github.com> 2024-03-12 23:59:10 +0100
commit4bad1c140a25d8ef8577d0fa7b0a60e27a5d7649 (patch)
tree72602a45c05772ddceb8b7aa48120014c1bce77a
parent5b80af978fdd0a7ea566d9a69d669e0b22b0378a (diff)
downloadrss-bridge-4bad1c140a25d8ef8577d0fa7b0a60e27a5d7649.tar.gz
rss-bridge-4bad1c140a25d8ef8577d0fa7b0a60e27a5d7649.tar.zst
rss-bridge-4bad1c140a25d8ef8577d0fa7b0a60e27a5d7649.zip
fix(reddit): url encoding (#4010)
-rw-r--r--bridges/RedditBridge.php55
-rw-r--r--tests/BridgeImplementationTest.php23
-rw-r--r--tests/RedditBridgeTest.php33
3 files changed, 62 insertions, 49 deletions
diff --git a/bridges/RedditBridge.php b/bridges/RedditBridge.php
index 9c72f996..e2f79b11 100644
--- a/bridges/RedditBridge.php
+++ b/bridges/RedditBridge.php
@@ -139,36 +139,13 @@ class RedditBridge extends BridgeAbstract
break;
}
- if (!($this->getInput('search') === '')) {
- $keywords = $this->getInput('search');
- $keywords = str_replace([',', ' '], '%20', $keywords);
- $keywords = $keywords . '%20';
- } else {
- $keywords = '';
- }
-
- if (!empty($this->getInput('f')) && $this->queriedContext == 'single') {
- $flair = $this->getInput('f');
- $flair = str_replace(' ', '%20', $flair);
- $flair = 'flair%3A%22' . $flair . '%22%20';
- } else {
- $flair = '';
- }
+ $search = $this->getInput('search');
+ $flareInput = $this->getInput('f');
foreach ($subreddits as $subreddit) {
- $name = trim($subreddit);
- $url = self::URI
- . '/search.json?q='
- . $keywords
- . $flair
- . ($user ? 'author%3A' : 'subreddit%3A')
- . $name
- . '&sort='
- . $this->getInput('d')
- . '&include_over_18=on';
-
$version = 'v0.0.1';
$useragent = "rss-bridge $version (https://github.com/RSS-Bridge/rss-bridge)";
+ $url = self::createUrl($search, $flareInput, $subreddit, $user, $section, $this->queriedContext);
$json = getContents($url, ['User-Agent: ' . $useragent]);
$parsedJson = Json::decode($json, false);
@@ -278,6 +255,32 @@ class RedditBridge extends BridgeAbstract
});
}
+ public static function createUrl($search, $flareInput, $subreddit, bool $user, $section, $queriedContext): string
+ {
+ if ($search === '') {
+ $keywords = '';
+ } else {
+ $keywords = $search;
+ $keywords = str_replace([',', ' '], ' ', $keywords);
+ $keywords = $keywords . ' ';
+ }
+
+ if ($flareInput && $queriedContext == 'single') {
+ $flair = $flareInput;
+ $flair = str_replace([',', ' '], ' ', $flair);
+ $flair = 'flair:"' . $flair . '" ';
+ } else {
+ $flair = '';
+ }
+ $name = trim($subreddit);
+ $query = [
+ 'q' => $keywords . $flair . ($user ? 'author:' : 'subreddit:') . $name,
+ 'sort' => $section,
+ 'include_over_18' => 'on',
+ ];
+ return 'https://old.reddit.com/search.json?' . http_build_query($query);
+ }
+
public function getIcon()
{
return 'https://www.redditstatic.com/desktop2x/img/favicon/favicon-96x96.png';
diff --git a/tests/BridgeImplementationTest.php b/tests/BridgeImplementationTest.php
index d2f74931..dd68934e 100644
--- a/tests/BridgeImplementationTest.php
+++ b/tests/BridgeImplementationTest.php
@@ -160,29 +160,6 @@ class BridgeImplementationTest extends TestCase
/**
* @dataProvider dataBridgesProvider
*/
- public function testVisibleMethods($path)
- {
- $bridgeAbstractMethods = get_class_methods(BridgeAbstract::class);
- sort($bridgeAbstractMethods);
- $feedExpanderMethods = get_class_methods(FeedExpander::class);
- sort($feedExpanderMethods);
-
- $this->setBridge($path);
-
- $publicMethods = get_class_methods($this->bridge);
- sort($publicMethods);
- foreach ($publicMethods as $publicMethod) {
- if ($this->bridge instanceof FeedExpander) {
- $this->assertContains($publicMethod, $feedExpanderMethods);
- } else {
- $this->assertContains($publicMethod, $bridgeAbstractMethods);
- }
- }
- }
-
- /**
- * @dataProvider dataBridgesProvider
- */
public function testMethodValues($path)
{
$this->setBridge($path);
diff --git a/tests/RedditBridgeTest.php b/tests/RedditBridgeTest.php
new file mode 100644
index 00000000..17a62e68
--- /dev/null
+++ b/tests/RedditBridgeTest.php
@@ -0,0 +1,33 @@
+<?php
+
+declare(strict_types=1);
+
+use PHPUnit\Framework\TestCase;
+
+class RedditBridgeTest extends TestCase
+{
+ public function test()
+ {
+ $sut = new RedditBridge(new NullCache(), new NullLogger());
+
+ // https://old.reddit.com/search.json?q=cats dogs hen subreddit:php&sort=hot&include_over_18=on
+ $expected = 'https://old.reddit.com/search.json?q=cats+dogs+hen+subreddit%3Aphp&sort=hot&include_over_18=on';
+ $actual = RedditBridge::createUrl('cats,dogs hen', '', 'php', false, 'hot', 'single');
+ $this->assertSame($expected, $actual);
+
+ // https://old.reddit.com/search.json?q=author:RavenousRandy&sort=hot&include_over_18=on
+ $expected = 'https://old.reddit.com/search.json?q=author%3ARavenousRandy&sort=hot&include_over_18=on';
+ $actual = RedditBridge::createUrl('', '', 'RavenousRandy', true, 'hot', 'user');
+ $this->assertSame($expected, $actual);
+
+ // https://old.reddit.com/search.json?q=cats dogs hen flair:"Proxy" subreddit:php&sort=hot&include_over_18=on
+ $expected = 'https://old.reddit.com/search.json?q=cats+dogs+hen+flair%3A%22Proxy%22+subreddit%3Aphp&sort=hot&include_over_18=on';
+ $actual = RedditBridge::createUrl('cats,dogs hen', 'Proxy', 'php', false, 'hot', 'single');
+ $this->assertSame($expected, $actual);
+
+ // https://old.reddit.com/search.json?q=cats dogs hen flair:"Proxy Linux Server" subreddit:php&sort=hot&include_over_18=on
+ $expected = 'https://old.reddit.com/search.json?q=cats+dogs+hen+flair%3A%22Proxy+Linux+Server%22+subreddit%3Aphp&sort=hot&include_over_18=on';
+ $actual = RedditBridge::createUrl('cats,dogs hen', 'Proxy,Linux Server', 'php', false, 'hot', 'single');
+ $this->assertSame($expected, $actual);
+ }
+}
tar/0d3ef17c9a536577f26a8b8d4094a979?s=13&d=retro' width='13' height='13' alt='Gravatar' /> Mikhail 1-3/+3 2023-10-16Fix formattingGravatar Ashcon Partovi 1-3/+1 2023-10-16fix(test): when tests run with --only the nested describe blocks `.on… (#5616)Gravatar Igor Shapiro 2-13/+45 2023-10-16perf(node:events): optimize `emit(...)` function (#5485)Gravatar Yannik Schröder 3-11/+132 2023-10-16fix: don't remove content-encoding header from header table (#5743)Gravatar Liz 2-2/+25 2023-10-16fix(sqlite) Insert .all() does not return an array #5872 (#5946)Gravatar Hugo Galan 2-7/+11 2023-10-16Fix formattingGravatar Ashcon Partovi 2-5/+4 2023-10-16Fix `Response.statusText` (#6151)Gravatar Chris Toshok 10-238/+269 2023-10-16fix-subprocess-argument-missing (#6407)Gravatar Nicolae-Rares Ailincai 4-2/+40 2023-10-16Add type parameter to `expect` (#6128)Gravatar Voldemat 1-3/+3 2023-10-16fix(node:worker_threads): ensure threadId property is exposed on worker_threa...Gravatar Jérôme Benoit 6-15/+75 2023-10-16Fix use before define bug in sqliteGravatar Ashcon Partovi 2-5/+5 2023-10-16fix(jest): fix toStrictEqual on same URLs (#6528)Gravatar João Alisson 2-13/+16 2023-10-16Fix `toHaveBeenCalled` having wrong error signatureGravatar Ashcon Partovi 1-2/+2 2023-10-16Fix formattingGravatar Ashcon Partovi 1-2/+1 2023-10-16Add `reusePort` to `Bun.serve` typesGravatar Ashcon Partovi 1-0/+9 2023-10-16Fix `request.url` having incorrect portGravatar Ashcon Partovi 4-1/+92 2023-10-16Remove uWebSockets header from Bun.serve responsesGravatar Ashcon Partovi 1-6/+6 2023-10-16Rename some testsGravatar Ashcon Partovi 3-0/+0 2023-10-16Fix #6467Gravatar Ashcon Partovi 2-3/+10 2023-10-16Update InternalModuleRegistryConstants.hGravatar Dylan Conway 1-3/+3 2023-10-16Development -> Contributing (#6538)Gravatar Colin McDonnell 2-1/+1 2023-10-14fix(net/tls) fix pg hang on end + hanging on query (#6487)Gravatar Ciro Spaciari 3-8/+36 2023-10-13fix installing dependencies that match workspace versions (#6494)Gravatar Dylan Conway 4-2/+64 2023-10-13fix lockfile struct padding (#6495)Gravatar Dylan Conway 3-3/+18