summaryrefslogtreecommitdiff
path: root/pear/HTTP.php
blob: b66554925b289d67c2ce47caf3d6667aeb1f9f13 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
<?php
//
// +----------------------------------------------------------------------+
// | PHP version 4.0                                                      |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997, 1998, 1999, 2000 The PHP Group                   |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.02 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_02.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.
//

if (!empty($GLOBALS['USED_PACKAGES']['HTTP'])) return;
$GLOBALS['USED_PACKAGES']['HTTP'] = true;

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;
    }
}

?>