377 foreach ( $this->versions as $version ) {
393 $semiPos = strpos( $proposed,
';' );
394 if ( $semiPos !==
false ) {
395 $proposed = substr( $proposed, 0, $semiPos );
398 $proposedFormat = $this->
getDataFormat( $version, $proposed );
399 if ( $proposedFormat ==
'unknown'
400 && $proposed !=
'multipart/mixed'
401 && $proposed !=
'multipart/x-mixed-replace'
405 if ( strval( $chunk ) ===
'' ) {
410 $chunk = substr( $chunk, 0, 255 );
415 $result = $this->
sampleData( $version, $chunk );
416 $sampleFound = $result[
'found'];
417 $counters = $result[
'counters'];
421 if ( $proposed ==
'text/html' && isset( $sampleFound[
'html'] ) ) {
424 if ( $proposed ==
'image/gif' && $binaryType ==
'image/gif' ) {
427 if ( ( $proposed ==
'image/pjpeg' || $proposed ==
'image/jpeg' )
428 && $binaryType ==
'image/pjpeg'
433 if ( $version >=
'ie07'
434 && ( $proposed ==
'image/x-png' || $proposed ==
'image/png' )
435 && $binaryType ==
'image/x-png'
441 if ( isset( $sampleFound[
'cdf'] ) ) {
442 return 'application/x-cdf';
447 if ( isset( $sampleFound[
'rss'] ) ) {
448 return 'application/rss+xml';
450 if ( isset( $sampleFound[
'rdf-tag'] )
451 && isset( $sampleFound[
'rdf-url'] )
452 && isset( $sampleFound[
'rdf-purl'] )
454 return 'application/rss+xml';
456 if ( isset( $sampleFound[
'atom'] ) ) {
457 return 'application/atom+xml';
460 if ( isset( $sampleFound[
'xml'] ) ) {
462 if ( strpos( $version,
'strict' ) !==
false ) {
463 if ( $proposed ==
'text/html' || $proposed ==
'text/xml' ) {
470 if ( isset( $sampleFound[
'html'] ) ) {
472 if ( strpos( $version,
'nohtml' ) !==
false ) {
473 if ( $proposed ==
'text/plain' ) {
480 if ( isset( $sampleFound[
'xbm'] ) ) {
481 return 'image/x-bitmap';
483 if ( isset( $sampleFound[
'binhex'] ) ) {
484 return 'application/macbinhex40';
486 if ( isset( $sampleFound[
'scriptlet'] ) ) {
487 if ( strpos( $version,
'strict' ) !==
false ) {
488 if ( $proposed ==
'text/plain' || $proposed ==
'text/scriptlet' ) {
489 return 'text/scriptlet';
492 return 'text/scriptlet';
498 if ( $counters[
'ctrl'] != 0 && ( $counters[
'ff'] + $counters[
'low'] )
499 < ( $counters[
'ctrl'] + $counters[
'high'] ) * 16
501 $kindOfBinary =
true;
502 $type = $binaryType ?: $textType;
503 if (
$type ===
false ) {
504 $type =
'application/octet-stream';
507 $kindOfBinary =
false;
508 $type = $textType ?: $binaryType;
509 if (
$type ===
false ) {
510 $type =
'text/plain';
517 if ( $detectedFormat !=
'ambiguous' ) {
521 if ( $proposedFormat !=
'ambiguous' ) {
523 if ( $proposedFormat ==
'text' && !$kindOfBinary ) {
526 if ( $proposedFormat ==
'binary' && $kindOfBinary ) {
529 if ( $proposedFormat ==
'html' ) {
535 $dotPos = strrpos( $fileName,
'.' );
536 if ( $dotPos ===
false ) {
539 $ext = substr( $fileName, $dotPos );
540 if ( isset( $this->registry[
$ext] ) ) {
541 return $this->registry[
$ext];
560 $chunk2 = substr( $chunk, 0, 2 );
561 $chunk4 = substr( $chunk, 0, 4 );
562 $chunk5 = substr( $chunk, 0, 5 );
563 if ( $chunk4 ==
'%PDF' ) {
564 return 'application/pdf';
566 if ( $chunk2 ==
'%!' ) {
567 return 'application/postscript';
569 if ( $chunk5 ==
'{\\rtf' ) {
570 return 'text/richtext';
572 if ( $chunk5 ==
'begin' ) {
573 return 'application/base64';
586 $chunk2 = substr( $chunk, 0, 2 );
587 $chunk3 = substr( $chunk, 0, 3 );
588 $chunk4 = substr( $chunk, 0, 4 );
589 $chunk5 = substr( $chunk, 0, 5 );
590 $chunk5uc = strtoupper( $chunk5 );
591 $chunk8 = substr( $chunk, 0, 8 );
592 if ( $chunk5uc ==
'GIF87' || $chunk5uc ==
'GIF89' ) {
595 if ( $chunk2 ==
"\xff\xd8" ) {
596 return 'image/pjpeg';
600 && substr( $chunk, 6, 2 ) ==
"\000\000"
601 && substr( $chunk, 8, 2 ) ==
"\000\000"
605 if ( $chunk4 ==
'RIFF'
606 && substr( $chunk, 8, 4 ) ==
'WAVE'
612 if ( $chunk4 ==
".sd\000"
614 || $chunk4 ==
"\000ds."
617 return 'audio/basic';
619 if ( $chunk3 ==
"MM\000" ) {
622 if ( $chunk2 ==
'MZ' ) {
623 return 'application/x-msdownload';
625 if ( $chunk8 ==
"\x89PNG\x0d\x0a\x1a\x0a" ) {
626 return 'image/x-png';
628 if ( strlen( $chunk ) >= 5 ) {
629 $byte2 = ord( $chunk[2] );
630 $byte4 = ord( $chunk[4] );
631 if ( $byte2 >= 3 && $byte2 <= 31 && $byte4 == 0 && $chunk2 ==
'JG' ) {
636 if ( $chunk4 ==
'MROF' ) {
637 return 'audio/x-aiff';
639 $chunk4_8 = substr( $chunk, 8, 4 );
640 if ( $chunk4 ==
'FORM' && ( $chunk4_8 ==
'AIFF' || $chunk4_8 ==
'AIFC' ) ) {
641 return 'audio/x-aiff';
643 if ( $chunk4 ==
'RIFF' && $chunk4_8 ==
'AVI ' ) {
646 if ( $chunk4 ==
"\x00\x00\x01\xb3" || $chunk4 ==
"\x00\x00\x01\xba" ) {
649 if ( $chunk4 ==
"\001\000\000\000"
650 && substr( $chunk, 40, 4 ) ==
' EMF'
652 return 'image/x-emf';
654 if ( $chunk4 ==
"\xd7\xcd\xc6\x9a" ) {
655 return 'image/x-wmf';
657 if ( $chunk4 ==
"\xca\xfe\xba\xbe" ) {
658 return 'application/java';
660 if ( $chunk2 ==
'PK' ) {
661 return 'application/x-zip-compressed';
663 if ( $chunk2 ==
"\x1f\x9d" ) {
664 return 'application/x-compressed';
666 if ( $chunk2 ==
"\x1f\x8b" ) {
667 return 'application/x-gzip-compressed';
670 if ( $chunk5 ==
"MThd\000" ) {
673 if ( $chunk4 ==
'%PDF' ) {
674 return 'application/pdf';
708 $rdfUrl =
'http://www.w3.org/1999/02/22-rdf-syntax-ns#';
709 $rdfPurl =
'http://purl.org/rss/1.0/';
710 $xbmMagic1 =
'#define';
711 $xbmMagic2 =
'_width';
712 $xbmMagic3 =
'_bits';
713 $binhexMagic =
'converted with BinHex';
714 $chunkLength = strlen( $chunk );
716 for ( $offset = 0; $offset < $chunkLength; $offset++ ) {
717 $curChar = $chunk[$offset];
718 if ( $curChar ==
"\x0a" ) {
721 } elseif ( $curChar ==
"\x0d" ) {
724 } elseif ( $curChar ==
"\x0c" ) {
727 } elseif ( $curChar ==
"\t" ) {
730 } elseif ( ord( $curChar ) < 32 ) {
733 } elseif ( ord( $curChar ) >= 128 ) {
739 if ( $curChar ==
'<' ) {
741 $remainder = substr( $chunk, $offset + 1 );
742 if ( !strncasecmp( $remainder,
'?XML', 4 ) ) {
743 $nextChar = substr( $chunk, $offset + 5, 1 );
744 if ( $nextChar ==
':' || $nextChar ==
' ' || $nextChar ==
"\t" ) {
745 $found[
'xml'] =
true;
749 if ( !strncasecmp( $remainder,
'SCRIPTLET', 9 ) ) {
750 $found[
'scriptlet'] =
true;
754 foreach ( $htmlTags as $tag ) {
755 if ( !strncasecmp( $remainder, $tag, strlen( $tag ) ) ) {
756 $found[
'html'] =
true;
762 if ( $version <
'ie07' ) {
763 if ( !strncasecmp( $remainder,
'CHANNEL', 7 ) ) {
764 $found[
'cdf'] =
true;
768 if ( !strncasecmp( $remainder,
'RSS', 3 ) ) {
769 $found[
'rss'] =
true;
772 if ( !strncasecmp( $remainder,
'rdf:RDF', 7 ) ) {
773 $found[
'rdf-tag'] =
true;
776 if ( !strncasecmp( $remainder,
'FEED', 4 ) ) {
777 $found[
'atom'] =
true;
787 $remainder = substr( $chunk, $offset );
788 if ( !strncasecmp( $remainder, $rdfUrl, strlen( $rdfUrl ) ) ) {
789 $found[
'rdf-url'] =
true;
790 if ( isset( $found[
'rdf-tag'] )
791 && isset( $found[
'rdf-purl'] )
798 if ( !strncasecmp( $remainder, $rdfPurl, strlen( $rdfPurl ) ) ) {
799 if ( isset( $found[
'rdf-tag'] )
800 && isset( $found[
'rdf-url'] )
808 if ( !strncasecmp( $remainder, $xbmMagic1, strlen( $xbmMagic1 ) ) ) {
809 $found[
'xbm1'] =
true;
812 if ( $curChar ==
'_' ) {
813 if ( isset( $found[
'xbm2'] ) ) {
814 if ( !strncasecmp( $remainder, $xbmMagic3, strlen( $xbmMagic3 ) ) ) {
815 $found[
'xbm'] =
true;
818 } elseif ( isset( $found[
'xbm1'] ) ) {
819 if ( !strncasecmp( $remainder, $xbmMagic2, strlen( $xbmMagic2 ) ) ) {
820 $found[
'xbm2'] =
true;
826 if ( !strncmp( $remainder, $binhexMagic, strlen( $binhexMagic ) ) ) {
827 $found[
'binhex'] =
true;
830 return [
'found' => $found,
'counters' => $counters ];