source: trunk/www/includes/AcceptAbstract.class.php @ 73358

Last change on this file since 73358 was 43660, checked in by ryandesign@…, 12 years ago

Only send application/xhtml+xml Content-Type header if the browser indicates it supports it; otherwise use text/html. Web site is now viewable on Internet Explorer 6 for Windows. See #14062.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
File size: 2.3 KB
Line 
1<?php
2
3# -*- coding: utf-8; mode: php; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- vim:fenc=utf-8:filetype=php:et:sw=4:ts=4:sts=4
4# $Id: AcceptAbstract.class.php 43660 2008-12-13 06:12:05Z ryandesign@macports.org $
5# Copyright (c) 2008, The MacPorts Project.
6
7class AcceptAbstract {
8   
9    function AcceptAbstract($accept_header) {
10        $this->accept = array();
11       
12        if (empty($accept_header)) {
13            return;
14        }
15       
16        $fudge_factor = 0.00001;
17       
18        $components = preg_split('%\s*,\s*%', $accept_header);
19        $temp = array();
20        foreach ($components as $i => $component) {
21           
22            // Find the parts of the string.
23            preg_match('%^
24                ([^\s;]+)            # one or more chars -- the value -- match 1
25                (?:                  # begin group (optional)
26                    \s*;\s*              # semicolon optionally surrounded by whitespace
27                    q=                   # literal text "q="
28                    ([01](?:\.\d+)?)     # floating-point number, 0 >= n >= 1 -- the quality -- match 2
29                )?                   # end group
30                $%ix',
31                $component, $matches
32            );
33           
34            $value = $matches[1];
35           
36            // If no quality is given, quality 1 is assumed.
37            $q = isset($matches[2]) ? (float)$matches[2] : (float)1;
38           
39            // Stuff it in the array, if the quality is non-zero.
40            if ($q > 0) {
41                $temp[$value] = array(
42                    'value' => $value,
43                    'q' => $q - ($i * $fudge_factor),
44                    'i' => $i,
45                );
46            }
47           
48        }
49       
50        // Sort descending by quality.
51        usort($temp, create_function('$a, $b', 'return ($a["q"] == $b["q"]) ? 0 : ($a["q"] > $b["q"]) ? -1 : 1;'));
52       
53        // Unfudge the quality parameter and simplify the array.
54        foreach ($temp as $x) {
55            $this->accept[$x['value']] = $x['q'] + $x['i'] * $fudge_factor;
56        }
57    }
58   
59    function getPreferred() {
60        if (empty($this->accept)) {
61            return false;
62        } else {
63            $keys = array_keys($this->accept);
64            return $this->accept[$keys[0]];
65        }
66    }
67   
68    function acceptable($value) {
69        return array_key_exists($value, $this->accept);
70    }
71   
72}
Note: See TracBrowser for help on using the repository browser.