Browse Source

Merge branch 'http2_headers' into dev

Alexandre Alapetite 10 years ago
parent
commit
ae6ade25d5
9 changed files with 89 additions and 81 deletions
  1. 1 1
      README.fr.md
  2. 1 1
      README.md
  3. 33 31
      app/Controllers/indexController.php
  4. 19 18
      app/FreshRSS.php
  5. 0 4
      app/Models/Themes.php
  6. 21 19
      app/layout/layout.phtml
  7. 2 3
      lib/Minz/Request.php
  8. 8 4
      lib/Minz/Url.php
  9. 4 0
      lib/lib_rss.php

+ 1 - 1
README.fr.md

@@ -33,7 +33,7 @@ Nous sommes une communauté amicale.
 * Serveur modeste, par exemple sous Linux ou Windows
 	* Fonctionne même sur un Raspberry Pi 1 avec des temps de réponse < 1s (testé sur 150 flux, 22k articles)
 * Serveur Web Apache2 (recommandé), ou nginx, lighttpd (non testé sur les autres)
-* PHP 5.2.1+ (PHP 5.3.7+ recommandé, et PHP 5.5+ pour les performances) (support bêta de PHP 7 avec encore meilleures performances)
+* PHP 5.3+ (PHP 5.3.7+ recommandé, et PHP 5.5+ pour les performances, et PHP 7+ pour d’encore meilleures performances)
 	* Requis : [PDO_MySQL](http://php.net/pdo-mysql) ou [PDO_SQLite](http://php.net/pdo-sqlite), [cURL](http://php.net/curl), [GMP](http://php.net/gmp) (pour accès API sur plateformes < 64 bits), [IDN](http://php.net/intl.idn) (pour les noms de domaines internationalisés)
 	* Recommandés : [iconv](http://php.net/iconv), [JSON](http://php.net/json), [mbstring](http://php.net/mbstring), [Zip](http://php.net/zip), [zlib](http://php.net/zlib)
 	* Inclus par défaut : [DOM](http://php.net/dom), [XML](http://php.net/xml)…

+ 1 - 1
README.md

@@ -33,7 +33,7 @@ We are a friendly community.
 * Light server running Linux or Windows
 	* It even works on Raspberry Pi 1 with response time under a second (tested with 150 feeds, 22k articles)
 * A web server: Apache2 (recommended), nginx, lighttpd (not tested on others)
-* PHP 5.2.1+ (PHP 5.3.7+ recommended, and PHP 5.5+ for performance) (beta support for PHP 7 with even higher performance)
+* PHP 5.3+ (PHP 5.3.7+ recommended, and PHP 5.5+ for performance, and PHP 7 for even higher performance)
 	* Required extensions: [PDO_MySQL](http://php.net/pdo-mysql) or [PDO_SQLite](http://php.net/pdo-sqlite), [cURL](http://php.net/curl), [GMP](http://php.net/gmp) (for API access on platforms < 64 bits), [IDN](http://php.net/intl.idn) (for Internationalized Domain Names)
 	* Recommended extensions: [iconv](http://php.net/iconv), [JSON](http://php.net/json), [mbstring](http://php.net/mbstring), [Zip](http://php.net/zip), [zlib](http://php.net/zlib)
 	* Enabled by default: [DOM](http://php.net/dom), [XML](http://php.net/xml)…

+ 33 - 31
app/Controllers/indexController.php

@@ -32,42 +32,44 @@ class FreshRSS_index_Controller extends Minz_ActionController {
 			Minz_Error::error(404);
 		}
 
-		try {
-			$entries = $this->listEntriesByContext();
-
-			$nb_entries = count($entries);
-			if ($nb_entries > FreshRSS_Context::$number) {
-				// We have more elements for pagination
-				$last_entry = array_pop($entries);
-				FreshRSS_Context::$next_id = $last_entry->id();
-			}
+		$this->view->callbackBeforeContent = function() {
+			try {
+				$entries = $this->listEntriesByContext();
+
+				$nb_entries = count($entries);
+				if ($nb_entries > FreshRSS_Context::$number) {
+					// We have more elements for pagination
+					$last_entry = array_pop($entries);
+					FreshRSS_Context::$next_id = $last_entry->id();
+				}
 
-			$first_entry = $nb_entries > 0 ? $entries[0] : null;
-			FreshRSS_Context::$id_max = $first_entry === null ?
-			                            (time() - 1) . '000000' :
-			                            $first_entry->id();
-			if (FreshRSS_Context::$order === 'ASC') {
-				// In this case we do not know but we guess id_max
-				$id_max = (time() - 1) . '000000';
-				if (strcmp($id_max, FreshRSS_Context::$id_max) > 0) {
-					FreshRSS_Context::$id_max = $id_max;
+				$first_entry = $nb_entries > 0 ? $entries[0] : null;
+				FreshRSS_Context::$id_max = $first_entry === null ?
+											(time() - 1) . '000000' :
+											$first_entry->id();
+				if (FreshRSS_Context::$order === 'ASC') {
+					// In this case we do not know but we guess id_max
+					$id_max = (time() - 1) . '000000';
+					if (strcmp($id_max, FreshRSS_Context::$id_max) > 0) {
+						FreshRSS_Context::$id_max = $id_max;
+					}
 				}
-			}
 
-			$this->view->entries = $entries;
-		} catch (FreshRSS_EntriesGetter_Exception $e) {
-			Minz_Log::notice($e->getMessage());
-			Minz_Error::error(404);
-		}
+				$this->view->entries = $entries;
+			} catch (FreshRSS_EntriesGetter_Exception $e) {
+				Minz_Log::notice($e->getMessage());
+				Minz_Error::error(404);
+			}
 
-		$this->view->categories = FreshRSS_Context::$categories;
+			$this->view->categories = FreshRSS_Context::$categories;
 
-		$this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
-		$title = FreshRSS_Context::$name;
-		if (FreshRSS_Context::$get_unread > 0) {
-			$title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
-		}
-		Minz_View::prependTitle($title . ' · ');
+			$this->view->rss_title = FreshRSS_Context::$name . ' | ' . Minz_View::title();
+			$title = FreshRSS_Context::$name;
+			if (FreshRSS_Context::$get_unread > 0) {
+				$title = '(' . FreshRSS_Context::$get_unread . ') ' . $title;
+			}
+			Minz_View::prependTitle($title . ' · ');
+		};
 	}
 
 	/**

+ 19 - 18
app/FreshRSS.php

@@ -34,7 +34,7 @@ class FreshRSS extends Minz_FrontController {
 
 		// Auth has to be initialized before using currentUser session parameter
 		// because it's this part which create this parameter.
-		$this->initAuth();
+		self::initAuth();
 
 		// Then, register the user configuration and use the configuration setter
 		// created above.
@@ -46,10 +46,7 @@ class FreshRSS extends Minz_FrontController {
 
 		// Finish to initialize the other FreshRSS / Minz components.
 		FreshRSS_Context::init();
-		$this->initI18n();
-		FreshRSS_Share::load(join_path(DATA_PATH, 'shares.php'));
-		$this->loadStylesAndScripts();
-		$this->loadNotifications();
+		self::initI18n();
 		// Enable extensions for the current (logged) user.
 		if (FreshRSS_Auth::hasAccess()) {
 			$ext_list = FreshRSS_Context::$user_conf->extensions_enabled;
@@ -57,7 +54,7 @@ class FreshRSS extends Minz_FrontController {
 		}
 	}
 
-	private function initAuth() {
+	private static function initAuth() {
 		FreshRSS_Auth::init();
 		if (Minz_Request::isPost() && !is_referer_from_same_domain()) {
 			// Basic protection against XSRF attacks
@@ -74,12 +71,12 @@ class FreshRSS extends Minz_FrontController {
 		}
 	}
 
-	private function initI18n() {
+	private static function initI18n() {
 		Minz_Session::_param('language', FreshRSS_Context::$user_conf->language);
 		Minz_Translate::init(FreshRSS_Context::$user_conf->language);
 	}
 
-	private function loadStylesAndScripts() {
+	private static function loadStylesAndScripts() {
 		$theme = FreshRSS_Themes::load(FreshRSS_Context::$user_conf->theme);
 		if ($theme) {
 			foreach($theme['files'] as $file) {
@@ -91,9 +88,9 @@ class FreshRSS extends Minz_FrontController {
 					$filename = $file;
 				}
 				$filetime = @filemtime(PUBLIC_PATH . '/themes/' . $theme_id . '/' . $filename);
-				Minz_View::appendStyle(Minz_Url::display(
-					'/themes/' . $theme_id . '/' . $filename . '?' . $filetime
-				));
+				$url = '/themes/' . $theme_id . '/' . $filename . '?' . $filetime;
+				header('Link: <' . Minz_Url::display($url, '', 'root') . '>;rel=preload', false);	//HTTP2
+				Minz_View::appendStyle(Minz_Url::display($url));
 			}
 		}
 
@@ -110,6 +107,14 @@ class FreshRSS extends Minz_FrontController {
 		}
 	}
 
+	private static function loadNotifications() {
+		$notif = Minz_Session::param('notification');
+		if ($notif) {
+			Minz_View::_param('notification', $notif);
+			Minz_Session::_param('notification');
+		}
+	}
+
 	public static function preLayout() {
 		switch (Minz_Request::controllerName()) {
 			case 'index':
@@ -123,13 +128,9 @@ class FreshRSS extends Minz_FrontController {
 				break;
 		}
 		header("X-Content-Type-Options: nosniff");
-	}
 
-	private function loadNotifications() {
-		$notif = Minz_Session::param('notification');
-		if ($notif) {
-			Minz_View::_param('notification', $notif);
-			Minz_Session::_param('notification');
-		}
+		FreshRSS_Share::load(join_path(DATA_PATH, 'shares.php'));
+		self::loadStylesAndScripts();
+		self::loadNotifications();
 	}
 }

+ 0 - 4
app/Models/Themes.php

@@ -116,7 +116,3 @@ class FreshRSS_Themes extends Minz_Model {
 			'<img class="icon" src="' . Minz_Url::display($url) . '" alt="' . $alts[$name] . '" />';
 	}
 }
-
-function _i($icon, $url_only = false) {
-	return FreshRSS_Themes::icon($icon, $url_only);
-}

+ 21 - 19
app/layout/layout.phtml

@@ -1,17 +1,32 @@
-<?php
-	FreshRSS::preLayout();
-?>
+<?php FreshRSS::preLayout(); ?>
 <!DOCTYPE html>
 <html lang="<?php echo FreshRSS_Context::$user_conf->language; ?>" xml:lang="<?php echo FreshRSS_Context::$user_conf->language; ?>">
 	<head>
 		<meta charset="UTF-8" />
 		<meta name="viewport" content="initial-scale=1.0" />
-		<?php echo self::headTitle(); ?>
 		<?php echo self::headStyle(); ?>
 		<script id="jsonVars" type="application/json">
 <?php $this->renderHelper('javascript_vars'); ?>
 		</script>
 		<?php echo self::headScript(); ?>
+		<link rel="shortcut icon" id="favicon" type="image/x-icon" sizes="16x16 64x64" href="<?php echo Minz_Url::display('/favicon.ico'); ?>" />
+		<link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="<?php echo Minz_Url::display('/themes/icons/favicon-256.png'); ?>" />
+		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('starred', true); ?>">
+		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('non-starred', true); ?>">
+		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('read', true); ?>">
+		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('unread', true); ?>">
+		<link rel="apple-touch-icon" href="<?php echo Minz_Url::display('/themes/icons/apple-touch-icon.png'); ?>">
+		<meta name="apple-mobile-web-app-capable" content="yes" />
+		<meta name="apple-mobile-web-app-status-bar-style" content="black" />
+		<meta name="apple-mobile-web-app-title" content="<?php echo FreshRSS_Context::$system_conf->title; ?>">
+		<meta name="msapplication-TileColor" content="#FFF" />
+<?php
+	flush();
+	if (isset($this->callbackBeforeContent)) {
+		call_user_func($this->callbackBeforeContent);
+	}
+?>
+		<?php echo self::headTitle(); ?>
 <?php
 	$url_base = Minz_Request::currentRequest();
 	if (FreshRSS_Context::$next_id !== '') {
@@ -20,26 +35,13 @@
 		$url_next['params']['ajax'] = 1;
 ?>
 		<link id="prefetch" rel="next prefetch" href="<?php echo Minz_Url::display($url_next); ?>" />
-<?php } ?>
-		<link rel="shortcut icon" id="favicon" type="image/x-icon" sizes="16x16 64x64" href="<?php echo Minz_Url::display('/favicon.ico'); ?>" />
-		<link rel="icon msapplication-TileImage apple-touch-icon" type="image/png" sizes="256x256" href="<?php echo Minz_Url::display('/themes/icons/favicon-256.png'); ?>" />
 <?php
-	if (isset($this->rss_title)) {
+	} if (isset($this->rss_title)) {
 		$url_rss = $url_base;
 		$url_rss['a'] = 'rss';
 ?>
 		<link rel="alternate" type="application/rss+xml" title="<?php echo $this->rss_title; ?>" href="<?php echo Minz_Url::display($url_rss); ?>" />
-<?php } ?>
-		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('starred', true); ?>">
-		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('non-starred', true); ?>">
-		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('read', true); ?>">
-		<link rel="prefetch" href="<?php echo FreshRSS_Themes::icon('unread', true); ?>">
-		<link rel="apple-touch-icon" href="<?php echo Minz_Url::display('/themes/icons/apple-touch-icon.png'); ?>">
-		<meta name="apple-mobile-web-app-capable" content="yes" />
-		<meta name="apple-mobile-web-app-status-bar-style" content="black" />
-		<meta name="apple-mobile-web-app-title" content="<?php echo FreshRSS_Context::$system_conf->title; ?>">
-		<meta name="msapplication-TileColor" content="#FFF" />
-<?php if (FreshRSS_Context::$system_conf->allow_robots) { ?>
+<?php } if (FreshRSS_Context::$system_conf->allow_robots) { ?>
 		<meta name="description" content="<?php echo htmlspecialchars(FreshRSS_Context::$name . ' | ' . FreshRSS_Context::$description, ENT_COMPAT, 'UTF-8'); ?>" />
 <?php } else { ?>
 		<meta name="robots" content="noindex,nofollow" />

+ 2 - 3
lib/Minz/Request.php

@@ -137,12 +137,11 @@ class Minz_Request {
 	/**
 	 * Return the base_url from configuration and add a suffix if given.
 	 *
-	 * @param $base_url_suffix a string to add at base_url (default: empty string)
 	 * @return the base_url with a suffix.
 	 */
-	public static function getBaseUrl($base_url_suffix = '') {
+	public static function getBaseUrl() {
 		$conf = Minz_Configuration::get('system');
-		$url = rtrim($conf->base_url, '/\\') . $base_url_suffix;
+		$url = rtrim($conf->base_url, '/\\');
 		return filter_var($url, FILTER_SANITIZE_URL);
 	}
 

+ 8 - 4
lib/Minz/Url.php

@@ -24,11 +24,15 @@ class Minz_Url {
 		$url_string = '';
 
 		if ($absolute) {
-			$url_string = Minz_Request::getBaseUrl(PUBLIC_TO_INDEX_PATH);
-			if ($url_string === PUBLIC_TO_INDEX_PATH) {
+			$url_string = Minz_Request::getBaseUrl();
+			if ($url_string == '') {
 				$url_string = Minz_Request::guessBaseUrl();
-			} else {
-				$url_string .= '/';
+			}
+			if ($isArray) {
+				$url_string .= PUBLIC_TO_INDEX_PATH;
+			}
+			if ($absolute === 'root') {
+				$url_string = parse_url($url_string, PHP_URL_PATH);
 			}
 		} else {
 			$url_string = $isArray ? '.' : PUBLIC_RELATIVE;

+ 4 - 0
lib/lib_rss.php

@@ -548,3 +548,7 @@ function base64url_encode($data) {
 function base64url_decode($data) {
 	return base64_decode(strtr($data, '-_', '+/'));
 }
+
+function _i($icon, $url_only = false) {
+	return FreshRSS_Themes::icon($icon, $url_only);
+}