LDAPAccountManager/lam/lib/3rdParty/composer/pear-pear.horde.org/Horde_Mime/Horde/Mime/Filter/Encoding.php

91 lines
2.4 KiB
PHP

<?php
/**
* Copyright 2014-2017 Horde LLC (http://www.horde.org/)
*
* See the enclosed file COPYING for license information (LGPL). If you
* did not receive this file, see http://www.horde.org/licenses/lgpl21.
*
* @category Horde
* @copyright 2014-2017 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Mime
*/
/**
* Stream filter to determine whether body requires either binary or 8bit
* encoding (RFC 2045 [6]).
*
* @author Michael Slusarz <slusarz@horde.org>
* @category Horde
* @copyright 2014-2017 Horde LLC
* @license http://www.horde.org/licenses/lgpl21 LGPL 2.1
* @package Mime
* @since 2.6.0
*/
class Horde_Mime_Filter_Encoding extends php_user_filter
{
/**
* Number of consecutive non-CR/LF characters.
*
* @var integer
*/
protected $_crlf = 0;
/**
* @see stream_filter_register()
*/
public function onCreate()
{
$this->params->body = false;
return true;
}
/**
* @see stream_filter_register()
*/
public function filter($in, $out, &$consumed, $closing)
{
while ($bucket = stream_bucket_make_writeable($in)) {
if ($this->params->body !== 'binary') {
$len = $bucket->datalen;
$str = $bucket->data;
for ($i = 0; $i < $len; ++$i) {
$chr = ord($str[$i]);
switch ($chr) {
case 0:
/* Only binary data can have NULLs. */
$this->params->body = 'binary';
break 2;
case 10: // LF
case 13: // CR
$this->_crlf = 0;
break;
default:
/* RFC 2045 [2.8]: 8bit data must be less than 998
* characters in length. Otherwise, we are looking at
* binary. */
if (++$this->_crlf > 998) {
$this->params->body = 'binary';
break 2;
} elseif ($chr > 127) {
$this->params->body = '8bit';
}
break;
}
}
}
$consumed += $bucket->datalen;
stream_bucket_append($out, $bucket);
}
return PSFS_PASS_ON;
}
}