Annotation of embedaddon/php/ext/xml/tests/bug32001b.phpt, revision 1.1

1.1     ! misho       1: --TEST--
        !             2: Bug #32001 (xml_parse*() goes into infinite loop when autodetection in effect), using EUC-JP, Shift_JIS, GB2312
        !             3: --SKIPIF--
        !             4: <?php
        !             5: require_once("skipif.inc");
        !             6: if (!extension_loaded('iconv')) die ("skip iconv extension not available");
        !             7: foreach(array('EUC-JP', 'Shift_JISP', 'GB2312') as $encoding) {
        !             8:        if (@xml_parser_create($encoding) === false) die("skip libxml2 does not support $encoding encoding");
        !             9: }
        !            10: ?>
        !            11: --FILE--
        !            12: <?php
        !            13: class testcase {
        !            14:        private $encoding;
        !            15:        private $bom;
        !            16:        private $prologue;
        !            17:        private $tags;
        !            18:        private $chunk_size;
        !            19: 
        !            20:        function testcase($enc, $chunk_size = 0, $bom = 0, $omit_prologue = 0) {
        !            21:                $this->encoding = $enc;
        !            22:                $this->chunk_size = $chunk_size;
        !            23:                $this->bom = $bom;
        !            24:                $this->prologue = !$omit_prologue;
        !            25:                $this->tags = array();
        !            26:        }
        !            27: 
        !            28:        function start_element($parser, $name, $attrs) {
        !            29:                $attrs = array_map('bin2hex', $attrs);
        !            30:                $this->tags[] = bin2hex($name).": ".implode(', ', $attrs);
        !            31:        }
        !            32: 
        !            33:        function end_element($parser, $name) {
        !            34:        }
        !            35: 
        !            36:        function run() {
        !            37:                $data = '';
        !            38: 
        !            39:                if ($this->prologue) {
        !            40:                        $canonical_name = preg_replace('/BE|LE/i', '', $this->encoding);
        !            41:                        $data .= "<?xml version=\"1.0\" encoding=\"$canonical_name\" ?>\n";
        !            42:                }
        !            43: 
        !            44:                $data .= <<<HERE
        !            45: <テスト:テスト1 xmlns:テスト="http://www.example.com/テスト/" テスト="テスト">
        !            46:   <テスト:テスト2 テスト="テスト">
        !            47:        <テスト:テスト3>
        !            48:          test! 
        !            49:        </テスト:テスト3>
        !            50:   </テスト:テスト2>
        !            51: </テスト:テスト1>
        !            52: HERE;
        !            53: 
        !            54:                $data = iconv("UTF-8", $this->encoding, $data);
        !            55: 
        !            56:                $parser = xml_parser_create(NULL);
        !            57:                xml_parser_set_option($parser, XML_OPTION_CASE_FOLDING, 0);
        !            58:                xml_set_element_handler($parser, "start_element", "end_element");
        !            59:                xml_set_object($parser, $this);
        !            60: 
        !            61:                if ($this->chunk_size == 0) {
        !            62:                        $success = @xml_parse($parser, $data, true);
        !            63:                } else {
        !            64:                        for ($offset = 0; $offset < strlen($data);
        !            65:                                        $offset += $this->chunk_size) {
        !            66:                                $success = @xml_parse($parser, substr($data, $offset, $this->chunk_size), false);
        !            67:                                if (!$success) {
        !            68:                                        break;
        !            69:                                }
        !            70:                        }
        !            71:                        if ($success) {
        !            72:                                $success = @xml_parse($parser, "", true);
        !            73:                        }
        !            74:                }
        !            75: 
        !            76:                echo "Encoding: $this->encoding\n";
        !            77:                echo "XML Prologue: ".($this->prologue ? 'present': 'not present'), "\n";
        !            78:                echo "Chunk size: ".($this->chunk_size ? "$this->chunk_size byte(s)\n": "all data at once\n");
        !            79:                echo "BOM: ".($this->bom ? 'prepended': 'not prepended'), "\n";
        !            80: 
        !            81:                if ($success) { 
        !            82:                        var_dump($this->tags);
        !            83:                } else {
        !            84:                        echo "[Error] ", xml_error_string(xml_get_error_code($parser)), "\n";
        !            85:                }
        !            86:        }
        !            87: }
        !            88: $suite = array(
        !            89:        new testcase("EUC-JP"  ,  0),
        !            90:        new testcase("EUC-JP"  ,  1),
        !            91:        new testcase("Shift_JIS", 0),
        !            92:        new testcase("Shift_JIS", 1),
        !            93:        new testcase("GB2312",    0),
        !            94:        new testcase("GB2312",    1),
        !            95: );
        !            96: 
        !            97: if (XML_SAX_IMPL == 'libxml') {
        !            98:   echo "libxml2 Version => " . LIBXML_DOTTED_VERSION. "\n";
        !            99: } else {
        !           100:   echo "libxml2 Version => NONE\n";  
        !           101: }
        !           102: 
        !           103: foreach ($suite as $testcase) {
        !           104:        $testcase->run();
        !           105: }
        !           106: 
        !           107: // vim600: sts=4 sw=4 ts=4 encoding=UTF-8
        !           108: ?>
        !           109: --EXPECTF--
        !           110: libxml2 Version => %s
        !           111: Encoding: EUC-JP
        !           112: XML Prologue: present
        !           113: Chunk size: all data at once
        !           114: BOM: not prepended
        !           115: array(3) {
        !           116:   [0]=>
        !           117:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           118:   [1]=>
        !           119:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           120:   [2]=>
        !           121:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           122: }
        !           123: Encoding: EUC-JP
        !           124: XML Prologue: present
        !           125: Chunk size: 1 byte(s)
        !           126: BOM: not prepended
        !           127: array(3) {
        !           128:   [0]=>
        !           129:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           130:   [1]=>
        !           131:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           132:   [2]=>
        !           133:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           134: }
        !           135: Encoding: Shift_JIS
        !           136: XML Prologue: present
        !           137: Chunk size: all data at once
        !           138: BOM: not prepended
        !           139: array(3) {
        !           140:   [0]=>
        !           141:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           142:   [1]=>
        !           143:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           144:   [2]=>
        !           145:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           146: }
        !           147: Encoding: Shift_JIS
        !           148: XML Prologue: present
        !           149: Chunk size: 1 byte(s)
        !           150: BOM: not prepended
        !           151: array(3) {
        !           152:   [0]=>
        !           153:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           154:   [1]=>
        !           155:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           156:   [2]=>
        !           157:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           158: }
        !           159: Encoding: GB2312
        !           160: XML Prologue: present
        !           161: Chunk size: all data at once
        !           162: BOM: not prepended
        !           163: array(3) {
        !           164:   [0]=>
        !           165:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           166:   [1]=>
        !           167:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           168:   [2]=>
        !           169:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           170: }
        !           171: Encoding: GB2312
        !           172: XML Prologue: present
        !           173: Chunk size: 1 byte(s)
        !           174: BOM: not prepended
        !           175: array(3) {
        !           176:   [0]=>
        !           177:   string(128) "e38386e382b9e383883ae38386e382b9e3838831: 687474703a2f2f7777772e6578616d706c652e636f6d2fe38386e382b9e383882f, e38386e382b9e38388"
        !           178:   [1]=>
        !           179:   string(60) "e38386e382b9e383883ae38386e382b9e3838832: e38386e382b9e38388"
        !           180:   [2]=>
        !           181:   string(42) "e38386e382b9e383883ae38386e382b9e3838833: "
        !           182: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>