<?php
+/**
+ * @copyright Copyright (C) 2020, Friendica
+ *
+ * @license GNU AGPL version 3 or any later version
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ */
namespace Friendica\App;
*/
private $argc;
- public function __construct(string $queryString = '', string $command = '', array $argv = [Module::DEFAULT], int $argc = 1)
+ public function __construct(string $queryString = '', string $command = '', array $argv = [], int $argc = 0)
{
$this->queryString = $queryString;
$this->command = $command;
}
/**
- * @return string The whole query string of this call
+ * @return string The whole query string of this call with url-encoded query parameters
*/
public function getQueryString()
{
/**
* Returns the value of a argv key
- * @todo there are a lot of $a->argv usages in combination with defaults() which can be replaced with this method
+ * @todo there are a lot of $a->argv usages in combination with ?? which can be replaced with this method
*
* @param int $position the position of the argument
* @param mixed $default the default value if not found
*/
public function determine(array $server, array $get)
{
- $queryString = '';
-
- if (!empty($server['QUERY_STRING']) && strpos($server['QUERY_STRING'], 'pagename=') === 0) {
- $queryString = substr($server['QUERY_STRING'], 9);
- } elseif (!empty($server['QUERY_STRING']) && strpos($server['QUERY_STRING'], 'q=') === 0) {
- $queryString = substr($server['QUERY_STRING'], 2);
- }
+ // removing leading / - maybe a nginx problem
+ $server['QUERY_STRING'] = ltrim($server['QUERY_STRING'] ?? '', '/');
- // eventually strip ZRL
- $queryString = $this->stripZRLs($queryString);
-
- // eventually strip OWT
- $queryString = $this->stripQueryParam($queryString, 'owt');
-
- // removing trailing / - maybe a nginx problem
- $queryString = ltrim($queryString, '/');
+ $queryParameters = [];
+ parse_str($server['QUERY_STRING'], $queryParameters);
if (!empty($get['pagename'])) {
$command = trim($get['pagename'], '/\\');
+ } elseif (!empty($queryParameters['pagename'])) {
+ $command = trim($queryParameters['pagename'], '/\\');
} elseif (!empty($get['q'])) {
+ // Legacy page name parameter, now conflicts with the search query parameter
$command = trim($get['q'], '/\\');
} else {
- $command = Module::DEFAULT;
- }
-
-
- // fix query_string
- if (!empty($command)) {
- $queryString = str_replace(
- $command . '&',
- $command . '?',
- $queryString
- );
+ $command = '';
}
- // unix style "homedir"
- if (substr($command, 0, 1) === '~') {
- $command = 'profile/' . substr($command, 1);
- }
-
- // Diaspora style profile url
- if (substr($command, 0, 2) === 'u/') {
- $command = 'profile/' . substr($command, 2);
- }
+ // Remove generated and one-time use parameters
+ unset($queryParameters['pagename']);
+ unset($queryParameters['zrl']);
+ unset($queryParameters['owt']);
/*
* Break the URL path into C style argc/argv style arguments for our
* [0] => 'module'
* [1] => 'arg1'
* [2] => 'arg2'
- *
- *
- * There will always be one argument. If provided a naked domain
- * URL, $this->argv[0] is set to "home".
*/
+ if ($command) {
+ $argv = explode('/', $command);
+ } else {
+ $argv = [];
+ }
- $argv = explode('/', $command);
$argc = count($argv);
+ $queryString = $command . ($queryParameters ? '?' . http_build_query($queryParameters) : '');
return new Arguments($queryString, $command, $argv, $argc);
}
-
- /**
- * Strip zrl parameter from a string.
- *
- * @param string $queryString The input string.
- *
- * @return string The zrl.
- */
- public function stripZRLs(string $queryString)
- {
- return preg_replace('/[?&]zrl=(.*?)(&|$)/ism', '$2', $queryString);
- }
-
- /**
- * Strip query parameter from a string.
- *
- * @param string $queryString The input string.
- * @param string $param
- *
- * @return string The query parameter.
- */
- public function stripQueryParam(string $queryString, string $param)
- {
- return preg_replace('/[?&]' . $param . '=(.*?)(&|$)/ism', '$2', $queryString);
- }
-}
\ No newline at end of file
+}