diff options
author | Stig Bakken <ssb@php.net> | 2000-02-26 03:38:27 +0000 |
---|---|---|
committer | Stig Bakken <ssb@php.net> | 2000-02-26 03:38:27 +0000 |
commit | 4d7150657c6fb4154beecdfa6308e6bec5810c37 (patch) | |
tree | c35ca100bd360f23cdff00dfc10ad8d2d1a429c9 | |
parent | bf5cb890b05504fc4299ec154c00c483130f0602 (diff) | |
download | php-git-4d7150657c6fb4154beecdfa6308e6bec5810c37.tar.gz |
Added simple HTTP utility class, currently with Date() and
negotiateLanguage().
-rw-r--r-- | pear/HTTP.php | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/pear/HTTP.php b/pear/HTTP.php new file mode 100644 index 0000000000..3947c06d6d --- /dev/null +++ b/pear/HTTP.php @@ -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; + } +} + +?> |