]> granicus.if.org Git - php/commitdiff
Added simple HTTP utility class, currently with Date() and
authorStig Bakken <ssb@php.net>
Sat, 26 Feb 2000 03:38:27 +0000 (03:38 +0000)
committerStig Bakken <ssb@php.net>
Sat, 26 Feb 2000 03:38:27 +0000 (03:38 +0000)
negotiateLanguage().

pear/HTTP.php [new file with mode: 0644]

diff --git a/pear/HTTP.php b/pear/HTTP.php
new file mode 100644 (file)
index 0000000..3947c06
--- /dev/null
@@ -0,0 +1,110 @@
+<?php
+//
+// +----------------------------------------------------------------------+
+// | PHP version 4.0                                                      |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group                   |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 2.0 of the PHP license,       |
+// | that is bundled with this package in the file LICENSE, and is        |
+// | available at through the world-wide-web at                           |
+// | http://www.php.net/license/2_0.txt.                                  |
+// | If you did not receive a copy of the PHP license and are unable to   |
+// | obtain it through the world-wide-web, please send a note to          |
+// | license@php.net so we can mail you a copy immediately.               |
+// +----------------------------------------------------------------------+
+// | Authors: Stig Bakken <ssb@fast.no>                                   |
+// |                                                                      |
+// +----------------------------------------------------------------------+
+//
+// $Id$
+//
+// HTTP utility functions.
+//
+
+class HTTP {
+    /**
+     * Format a date according to RFC-XXXX (can't remember the HTTP
+     * RFC number off-hand anymore, shame on me).  This function
+     * honors the "y2k_compliance" php.ini directive.
+     *
+     * @param $time int UNIX timestamp
+     *
+     * @return HTTP date string, or false for an invalid timestamp.
+     *
+     * @author Stig Bakken <ssb@fast.no>
+     */
+    function Date($time) {
+       $y = ini_get("y2k_compliance") ? "Y" : "y";
+       return gmdate("D, d M $y H:i:s", $time);
+    }
+
+    /**
+     * Negotiate language with the user's browser through the
+     * Accept-Language HTTP header or the user's host address.
+     * Language codes are generally in the form "ll" for a language
+     * spoken in only one country, or "ll_CC" for a language spoken in
+     * a particular country.  For example, U.S. English is "en_US",
+     * while British English is "en_UK".  Portugese as spoken in
+     * Portugal is "pt_PT", while Brazilian Portugese is "pt_BR".
+     * Two-letter country codes can be found in the ISO 3166 standard.
+     *
+     * Quantities in the Accept-Language: header are supported, for
+     * example:
+     *
+     *  Accept-Language: en_UK;q=0.7, en_US;q=0.6, no;q=1.0, dk;q=0.8
+     *
+     * @param $supported an associative array indexed by language
+     * codes (country codes) supported by the application.  Values
+     * must evaluate to true.
+     *
+     * @param $default the default language to use if none is found
+     * during negotiation, defaults to "en_US" for U.S. English
+     *
+     * @author Stig Bakken <ssb@fast.no>
+     */
+    function negotiateLanguage(&$supported, $default = 'en_US') {
+       global $HTTP_ACCEPT_LANGUAGE;
+
+       /* If the client has sent an Accept-Language: header, see if
+        * it contains a language we support.
+        */
+       if ($HTTP_ACCEPT_LANGUAGE) {
+           $accepted = split(',[[:space:]]*', $HTTP_ACCEPT_LANGUAGE);
+           for ($i = 0; $i < count($accepted); $i++) {
+               if (eregi('^([a-z]+);[[:space:]]*q=([0-9\.]+)', $accepted[$i], &$arr)) {
+                   $q = (double)$arr[2];
+                   $l = $arr[1];
+               } else {
+                   $q = 42;
+                   $l = $accepted[$i];
+               }
+               if ($supported[$l] && $q > 0.0) {
+                   if ($q == 42) {
+                       return $l;
+                   }
+                   $candidates[$l] = $q;
+               }
+           }
+           if (isset($candidates)) {
+               arsort($candidates);
+               reset($candidates);
+               return key($candidates);
+           }
+       }
+
+       /* Check for a valid language code in the top-level domain of
+        * the client's host address.
+        */
+       if (eregi("\.[^\.]+$", $REMOTE_HOST, &$arr)) {
+           $lang = strtolower($arr[1]);
+           if ($supported[$lang]) {
+               return $lang;
+           }
+       }
+
+       return $default;
+    }
+}
+
+?>