public function testCrc32() { $filter = stream_filter_prepend($this->fp, 'horde_bin2hex', STREAM_FILTER_READ); rewind($this->fp); $this->assertEquals(bin2hex($this->testdata), stream_get_contents($this->fp)); stream_filter_remove($filter); }
public function testNull() { $filter = stream_filter_prepend($this->fp, 'horde_null', STREAM_FILTER_READ); rewind($this->fp); $this->assertEquals('abcdefghij', stream_get_contents($this->fp)); stream_filter_remove($filter); }
function sgprepend($stream, $callback, $read_write = STREAM_FILTER_ALL) { $ret = @stream_filter_prepend($stream, sgregister(), $read_write, $callback); if ($ret === false) { $error = error_get_last() + array('message' => ''); throw new RuntimeException('Unable to prepend filter: ' . $error['message']); } return $ret; }
public function testCrc32() { $params = new stdClass(); $filter = stream_filter_prepend($this->fp, 'horde_crc32', STREAM_FILTER_READ, $params); rewind($this->fp); while (fread($this->fp, 1024)) { } $this->assertObjectHasAttribute('crc32', $params); $this->assertEquals(crc32($this->testdata), $params->crc32); stream_filter_remove($filter); }
function filter_test($names) { $fp = tmpfile(); fwrite($fp, $GLOBALS["text"]); rewind($fp); foreach ($names as $name) { echo "filter: {$name}\n"; var_dump(stream_filter_prepend($fp, $name)); } var_dump(fgets($fp)); fclose($fp); }
public function testBug12673() { $test = str_repeat(str_repeat("A", 1) . "\r\n", 4000); rewind($this->fp); fwrite($this->fp, $test); $filter = stream_filter_prepend($this->fp, 'horde_eol', STREAM_FILTER_READ, array('eol' => "\r\n")); rewind($this->fp); $this->assertEquals($test, stream_get_contents($this->fp)); $test = str_repeat(str_repeat("A", 14) . "\r\n", 2); rewind($this->fp); ftruncate($this->fp, 0); fwrite($this->fp, $test); stream_filter_prepend($this->fp, 'horde_eol', STREAM_FILTER_READ, array('eol' => "\r\n")); rewind($this->fp); $this->assertEquals($test, fread($this->fp, 14) . fread($this->fp, 1) . fread($this->fp, 1) . fread($this->fp, 14) . fread($this->fp, 2) . fread($this->fp, 100)); }
/** * Checks if the data needs to be encoded like e.g., when outputing binary * data in-line during ITEMOPERATIONS requests. * * @param mixed $data The data to check. A string or stream resource. * @param string $tag The tag we are outputing. * * @return mixed The encoded data. A string or stream resource with * a filter attached. */ protected function _checkEncoding($data, $tag) { if ($tag == Horde_ActiveSync_Request_ItemOperations::ITEMOPERATIONS_DATA) { // See Bug: 14086. Use a STREAM_FILTER_WRITE and perform the // filtering here instead of using the currently broken behavior of // PHP when using base64-encode as STREAM_FILTER_READ. feof() is // apparently not safe to use when using STREAM_FILTER_READ. if (is_resource($data)) { $temp = fopen('php://temp/', 'r+'); $filter = stream_filter_prepend($temp, 'convert.base64-encode', STREAM_FILTER_WRITE); rewind($data); while (!feof($data)) { fwrite($temp, fread($data, 8192)); } stream_filter_remove($filter); rewind($temp); return $temp; } else { return base64_encode($data); } } return $data; }
function &prependFilter($filtername, $read_write = STREAM_FILTER_READ, $params = array()) { $res = false; if ($this->_fh) { // Capture PHP errors $php_errormsg = ''; $track_errors = ini_get('track_errors'); ini_set('track_errors', true); $res = @stream_filter_prepend($this->_fh, $filername, $read_write, $params); if (!$res && $php_errormsg) { $this->setError($php_errormsg); } else { JUtility::array_unshift_ref($res, $this->filters); } // push the new resource onto the filter stack // restore error tracking to what it was before ini_set('track_errors', $track_errors); } return $res; }
if ($closed > 0) { var_dump($closed++); } return PSFS_PASS_ON; } } class SecondFilter extends php_user_filter { public function filter($in, $out, &$consumed, $closing) { static $closed = 0; while ($bucket = stream_bucket_make_writeable($in)) { stream_bucket_append($out, stream_bucket_new($this->stream, $bucket->data)); } if ($closing) { $closed++; } if ($closed > 0) { var_dump($closed++); } return PSFS_PASS_ON; } } $r = fopen("php://stdout", "w+"); stream_filter_register("first", "FirstFilter"); stream_filter_register("second", "SecondFilter"); $first = stream_filter_prepend($r, "first", STREAM_FILTER_WRITE, []); $second = stream_filter_prepend($r, "second", STREAM_FILTER_WRITE, []); fwrite($r, "test\n"); stream_filter_remove($second); stream_filter_remove($first);
public function CheckBack($header) { $statuscode = intval(substr($header, 9, 3)); if ($statuscode != 200) { switch ($statuscode) { case 509: html_error('[Mega] Transfer quota exeeded.'); case 503: html_error('Too many connections for this download.'); case 403: html_error('Link used/expired.'); case 404: html_error('Link expired.'); default: html_error('[HTTP] ' . trim(substr($header, 9, strpos($header, "\n") - 8))); } } global $fp; if (empty($fp) || !is_resource($fp)) { html_error("Error: Your rapidleech version is outdated and it doesn't support this plugin."); } if (!empty($_GET['T8']['fkey'])) { $key = $this->base64_to_a32(urldecode($_GET['T8']['fkey'])); } elseif (preg_match('@^(T8)?!([^!]{8})!([\\w\\-\\,]{43})@i', parse_url($_GET['referer'], PHP_URL_FRAGMENT), $dat)) { $key = $this->base64_to_a32($dat[2]); } else { html_error("[CB] File's key not found."); } $iv = array_merge(array_slice($key, 4, 2), array(0, 0)); $key = array($key[0] ^ $key[4], $key[1] ^ $key[5], $key[2] ^ $key[6], $key[3] ^ $key[7]); $opts = array('iv' => $this->a32_to_str($iv), 'key' => $this->a32_to_str($key), 'mode' => 'ctr'); stream_filter_register('MegaDlDecrypt', 'Th3822_MegaDlDecrypt'); stream_filter_prepend($fp, 'MegaDlDecrypt', STREAM_FILTER_READ, $opts); }
/** * attempt enable IMAP COMPRESS extension * @todo: currently does not work ... * @return void */ public function enable_compression() { if ($this->is_supported('COMPRESS=DEFLATE')) { $this->send_command("COMPRESS DEFLATE\r\n"); $res = $this->get_response(false, true); if ($this->check_response($res, true)) { stream_filter_prepend($this->handle, 'zlib.inflate', STREAM_FILTER_READ); stream_filter_append($this->handle, 'zlib.deflate', STREAM_FILTER_WRITE, 6); $this->debug[] = 'DEFLATE compression extension activated'; } } }
<?php var_dump(stream_get_filters("a")); var_dump(stream_filter_register()); var_dump(stream_filter_append()); var_dump(stream_filter_prepend()); var_dump(stream_filter_remove()); var_dump(stream_bucket_make_writeable()); var_dump(stream_bucket_append()); var_dump(stream_bucket_prepend());
/** * * Change file encoding * * @param string $file file path * @param string $from original file encoding * @param string $to target file encoding * @throws waException * @return string converted file path */ public static function convert($file, $from, $to = 'UTF-8') { if ($src = fopen($file, 'rb')) { $filter = sprintf('convert.iconv.%s/%s//IGNORE', $from, $to); if (!@stream_filter_prepend($src, $filter)) { throw new waException("error while register file filter"); } $file = preg_replace('/(\\.[^\\.]+)$/', '.' . $to . '$1', $file); if ($this->fp && ($dst = fopen($file, 'wb'))) { stream_copy_to_stream($this->fp, $dst); fclose($src); fclose($dst); } else { throw new waException("Error while convert file encoding"); } return $file; } else { return false; } }
/** * * Changes text file character encoding. * * @param string $file Path to file * @param string $from Original encoding * @param string $to Target encoding * @param string $target Optional path to save encoded file to * @throws waException * @return string Path to file containing converted text */ public static function convert($file, $from, $to = 'UTF-8', $target = null) { if ($src = fopen($file, 'rb')) { $filter = sprintf('convert.iconv.%s/%s//IGNORE', $from, $to); if (!@stream_filter_prepend($src, $filter)) { throw new waException("error while register file filter"); } if ($target === null) { $extension = pathinfo($file, PATHINFO_EXTENSION); if ($extension) { $extension = '.' . $extension; } $target = preg_replace('@\\.[^\\.]+$@', '', $file) . '_' . $to . $extension; } if ($dst = fopen($target, 'wb')) { stream_copy_to_stream($src, $dst); fclose($src); fclose($dst); } else { fclose($src); throw new waException("Error while convert file encoding"); } return $target; } else { return false; } }
/** * Prepend a filter to the chain * * @param string $filtername The key name of the filter. * @param integer $read_write Optional. Defaults to STREAM_FILTER_READ. * @param array $params An array of params for the stream_filter_prepend call. * * @return mixed * * @see http://php.net/manual/en/function.stream-filter-prepend.php * @since 11.1 */ public function prependFilter($filtername, $read_write = STREAM_FILTER_READ, $params = array()) { $res = false; if ($this->_fh) { // Capture PHP errors $php_errormsg = ''; $track_errors = ini_get('track_errors'); ini_set('track_errors', true); $res = @stream_filter_prepend($this->_fh, $filtername, $read_write, $params); if (!$res && $php_errormsg) { $this->setError($php_errormsg); // set the error msg } else { array_unshift($res, ''); $res[0] =& $this->filters; } // Restore error tracking to what it was before. ini_set('track_errors', $track_errors); } return $res; }
/** * Adds a "file" to the ZIP archive. * * @param array $file See self::createZipFile(). */ protected function _addToZipFile($file) { $name = str_replace('\\', '/', $file['name']); /* See if time/date information has been provided. */ $ftime = isset($file['time']) ? $file['time'] : null; /* Get the hex time. */ $dtime = dechex($this->_unix2DosTime($ftime)); $hexdtime = chr(hexdec($dtime[6] . $dtime[7])) . chr(hexdec($dtime[4] . $dtime[5])) . chr(hexdec($dtime[2] . $dtime[3])) . chr(hexdec($dtime[0] . $dtime[1])); /* "Local file header" segment. */ if (is_resource($file['data'])) { $zdata = fopen('php://temp', 'r+'); $params = new stdClass(); stream_filter_register('horde_compress_filter_crc32', 'Horde_Stream_Filter_Crc32'); $filter = stream_filter_prepend($file['data'], 'horde_compress_filter_crc32', STREAM_FILTER_READ, $params); $filter2 = stream_filter_append($zdata, 'zlib.deflate', STREAM_FILTER_WRITE); rewind($file['data']); stream_copy_to_stream($file['data'], $zdata); $crc = $params->crc32; $unc_len = ftell($file['data']); stream_filter_remove($filter2); stream_filter_remove($filter); fseek($zdata, 0, SEEK_END); $c_len = ftell($zdata); } else { $unc_len = strlen($file['data']); $crc = crc32($file['data']); $zdata = gzdeflate($file['data']); $c_len = strlen($zdata); } /* Common data for the two entries. */ $common = "" . "" . "" . $hexdtime . pack('V', $crc) . pack('V', $c_len) . pack('V', $unc_len) . pack('v', strlen($name)) . pack('v', 0); /* Extra field length. */ /* Add this entry to zip data. */ fseek($this->_tmp, 0, SEEK_END); $old_offset = ftell($this->_tmp); fwrite($this->_tmp, self::FILE_HEADER . $common . $name); /* "File data" segment. */ if (is_resource($zdata)) { rewind($zdata); stream_copy_to_stream($zdata, $this->_tmp); } else { fwrite($this->_tmp, $zdata); } /* Add to central directory record. */ $this->_ctrldir[] = self::CTRL_DIR_HEADER . "" . $common . pack('v', 0) . pack('v', 0) . pack('v', 0) . pack('V', 32) . pack('V', $old_offset) . $name; /* File name. */ }
private function restore() { setlocale(LC_CTYPE, 'ru_RU.UTF-8', 'en_US.UTF-8'); if ($this->file) { $fsize = file_exists($this->file) ? filesize($this->file) : false; $this->fp = @fopen($this->file, 'a'); if (!$this->fp) { throw new waException("error while open CSV file"); } fseek($this->fp, 0, SEEK_END); if (strtolower($this->encoding) != 'utf-8') { switch ($this->method) { case 'mb': if (class_exists('waFilesFilter')) { waFilesFilter::register(); if (!@stream_filter_prepend($this->fp, 'convert.mb.UTF-8/' . $this->encoding)) { throw new waException("error while register file filter"); } } else { throw new waException("error while search filter class"); } break; case 'iconv': default: if (!@stream_filter_prepend($this->fp, 'convert.iconv.UTF-8/' . $this->encoding . '//TRANSLIT//IGNORE')) { throw new waException("error while register file filter"); } break; } } if (!$this->offset) { if ($fsize) { fseek($this->fp, 0); ftruncate($this->fp, 0); fseek($this->fp, 0); } if ($this->data_mapping) { $this->write($this->data_mapping, true); } } else { fseek($this->fp, 0); ftruncate($this->fp, $this->offset); fseek($this->fp, 0, SEEK_END); } } else { throw new waException("CSV file not found"); } }
/** * Checks if the data needs to be encoded like e.g., when outputing binary * data in-line during ITEMOPERATIONS requests. Concrete classes should * override this if needed. * * @param mixed $data The data to check. A string or stream resource. * @param string $tag The tag we are outputing. * * @return mixed The encoded data. A string or stream resource with * a filter attached. */ protected function _checkEncoding($data, $tag) { if (is_resource($data)) { stream_filter_register('horde_null', 'Horde_Stream_Filter_Null'); stream_filter_register('horde_eol', 'Horde_Stream_Filter_Eol'); $filter_null = stream_filter_prepend($data, 'horde_null', STREAM_FILTER_READ); $filter_eol = stream_filter_prepend($data, 'horde_eol', STREAM_FILTER_READ); } return $data; }
private function createResponse(TransactionInterface $transaction) { $errorNo = null; $errorMsg = null; $request = $transaction->getRequest(); $config = $request->getConfig(); if (isset($config['stream']) && $config['stream']) { $request->setHeader('Transfer-Encoding', 'chunked'); } elseif ($request->getBody() !== null) { $request->setHeader('Content-Length', $request->getBody()->getSize()); } $socket = @stream_socket_client($this->entrypoint, $errorNo, $errorMsg, $this->getDefaultTimeout($transaction), STREAM_CLIENT_CONNECT, $this->context); if (!$socket) { throw new RequestException(sprintf('Cannot open socket connection: %s [code %d] [%s]', $errorMsg, $errorNo, $this->entrypoint), $request); } // Check if tls is needed if ($this->useTls) { if (!@stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_TLS_CLIENT)) { throw new RequestException(sprintf('Cannot enable tls: %s', error_get_last()['message']), $request); } } // Write headers $isWrite = $this->fwrite($socket, $this->getRequestHeaderAsString($request)); // Write body if set if ($request->getBody() !== null && $isWrite !== false) { $stream = $request->getBody(); $filter = null; if ($request->getHeader('Transfer-Encoding') == 'chunked') { $filter = stream_filter_prepend($socket, 'chunk', STREAM_FILTER_WRITE); } while (!$stream->eof() && $isWrite) { $isWrite = $this->fwrite($socket, $stream->read(self::CHUNK_SIZE)); } if ($request->getHeader('Transfer-Encoding') == 'chunked') { stream_filter_remove($filter); if (false !== $isWrite) { $isWrite = $this->fwrite($socket, "0\r\n\r\n"); } } } stream_set_timeout($socket, $this->getDefaultTimeout($transaction)); // Response should be available, extract headers do { $response = $this->getResponseWithHeaders($socket); } while ($response !== null && $response->getStatusCode() == 100); // Check timeout $metadata = stream_get_meta_data($socket); if ($metadata['timed_out']) { throw new RequestException('Timed out while reading socket', $request, $response); } if (false === $isWrite) { // When an error happen and no response it is most probably due to TLS configuration if ($response === null) { throw new RequestException('Error while sending request (Broken Pipe), check your TLS configuration and logs in docker daemon for more information ', $request); } throw new RequestException('Error while sending request (Broken Pipe)', $request, $response); } if (null == $response) { throw new RequestException('No response could be parsed: check server log', $request); } $this->setResponseStream($response, $socket, $request->getEmitter(), $config->hasKey('attach_filter') && $config->get('attach_filter')); $transaction->setResponse($response); // If wait read all contents if ($config->hasKey('wait') && $config->get('wait')) { $response->getBody()->getContents(); } return $response; }
/** * import from an uploaded file * * @param array $vars array of parameters * * @return status */ function Products_importFile($vars = false) { // { set up variables if ($vars === false) { return false; } if (!@$vars->productsImportDeleteAfter['varvalue']) { $vars->productsImportDeleteAfter = array('varvalue' => false); } if (!@$vars->productsImportDelimiter['varvalue']) { $vars->productsImportDelimiter = array('varvalue' => ','); } if (!@$vars->productsImportFileUrl['varvalue']) { $vars->productsImportFileUrl = array('varvalue' => 'ww.cache/products/import.csv'); } if (!@$vars->productsImportImagesDir['varvalue']) { $vars->productsImportImagesDir = array('varvalue' => 'ww.cache/products/images'); } $fname = USERBASE . '/' . $vars->productsImportFileUrl['varvalue']; // } if (strpos($fname, '..') !== false) { return array('message' => __('Invalid file URL')); } if (!file_exists($fname)) { return array('message' => __('File not uploaded')); } if (function_exists('mb_detect_encoding')) { $charset = mb_detect_encoding(file_get_contents($fname), 'UTF-8', true); } else { $charset = 'UTF-8'; } $handle = fopen($fname, 'r'); if ($charset != 'UTF-8') { stream_filter_register("utf8encode", "Utf8encode_Filter") or die(__('Failed to register filter')); stream_filter_prepend($handle, "utf8encode"); } $row = fgetcsv($handle, 1000, $vars->productsImportDelimiter['varvalue']); // { check the headers $headers = array(); foreach ($row as $k => $v) { if ($v) { $headers[$v] = $k; } } if (!isset($headers['_name']) || !isset($headers['_ean']) || !isset($headers['_stocknumber']) || !isset($headers['_type']) || !isset($headers['_categories'])) { $req = '_name, _ean, _stocknumber, _type, _categories'; return array('message' => __('Missing required headers (%1)', array($req), 'core') . '. ' . __('Please use the Download link to get a sample import file.'), 'headers-found' => $headers); } // } $product_types = array(); $imported = 0; $categoriesByName = array(); $preUpload = (int) @$vars->productsImportSetExisting['varvalue']; $postUpload = (int) @$vars->productsImportSetImported['varvalue']; if ($preUpload) { dbQuery('update products set enabled=' . ($preUpload - 1) . ', date_edited=now()'); } // { do the import while (($data = fgetcsv($handle, 1000, $vars->productsImportDelimiter['varvalue'])) !== false) { $id = 0; $stocknumber = $data[$headers['_stocknumber']]; // { stockcontrol_total (how many are in stock) $stockcontrol_total = ''; if (isset($headers['_stockcontrol_total']) && isset($data[$headers['_stockcontrol_total']])) { $stockcontrol_total = ',stockcontrol_total=' . (int) $data[$headers['_stockcontrol_total']]; } // } $type = $data[$headers['_type']]; if (!$type) { $type = 'default'; } if (isset($product_types[$type]) && $product_types[$type]) { $type_id = $product_types[$type]; } else { $type_id = (int) dbOne('select id from products_types where name="' . addslashes($type) . '"', 'id'); if (!$type_id) { $type_id = (int) dbOne('select id from products_types limit 1', 'id'); } $product_types[$type] = $type_id; } $name = $data[$headers['_name']]; $ean = $data[$headers['_ean']]; if ($stocknumber) { $id = (int) dbOne('select id from products where stock_number="' . addslashes($stocknumber) . '"', 'id'); if ($id) { dbQuery('update products set ean="' . addslashes($ean) . '"' . ',product_type_id=' . $type_id . ',name="' . addslashes($name) . '",date_edited=now()' . $stockcontrol_total . ' where id=' . $id); } } if (!$id) { $sql = 'insert into products set ' . 'stock_number="' . addslashes($stocknumber) . '"' . $stockcontrol_total . ',product_type_id=' . $type_id . ',name="' . addslashes($name) . '"' . ',ean="' . addslashes($ean) . '"' . ',date_created=now()' . ',date_edited=now()' . ',activates_on=now()' . ',expires_on="2100-01-01"' . ',enabled=1' . ',data_fields="{}"' . ',online_store_fields="{}"'; dbQuery($sql); $id = dbLastInsertId(); } // { get data from Products table $row = dbRow('select data_fields,online_store_fields,activates_on,expires_on' . ' from products where id=' . $id); // } $data_fields = json_decode($row['data_fields'], true); $os_fields = json_decode($row['online_store_fields'], true); foreach ($headers as $k => $v) { if (preg_match('/^_/', $k)) { continue; } foreach ($data_fields as $k2 => $v2) { if ($v2['n'] == $k) { unset($data_fields[$k2]); } } $data_fields[] = array('n' => $k, 'v' => $data[$v]); } if (@$data[$headers['_price']]) { $os_fields['_price'] = Products_importParseNumber(@$data[$headers['_price']]); $os_fields['_saleprice'] = Products_importParseNumber(@$data[$headers['_saleprice']]); $os_fields['_bulkprice'] = Products_importParseNumber(@$data[$headers['_bulkprice']]); $os_fields['_bulkamount'] = (int) @$data[$headers['_bulkamount']]; } else { $os_fields = array(); } $dates = ''; $now = date('Y-m-d'); if ($postUpload && ($row['activates_on'] > $now || $row['expires_on'] < $now)) { $dates = ',activates_on="' . $now . '",expires_on="2100-01-01"'; } if (!$postUpload && ($row['activates_on'] < $now && $row['expires_on'] > $now)) { $dates = ',activates_on="' . $now . '",expires_on="' . $now . '"'; } // { update the product row dbQuery('update products set ' . 'data_fields="' . addslashes(json_encode($data_fields)) . '"' . ',online_store_fields="' . addslashes(json_encode($os_fields)) . '"' . ',date_edited=now()' . $dates . ',enabled=' . $postUpload . ' where id=' . $id); // } $cid = (int) @$vars->productsImportCategory['varvalue']; switch ($cid) { case '-1': // { from file ProductsCategoriesProducts::deleteByProductId($id); dbQuery('update products set num_of_categories=0 where id=' . $id); Core_cacheClear('products'); if (@$data[$headers['_categories']]) { $catnames = explode('|', $data[$headers['_categories']]); foreach ($catnames as $catname) { $cat = ProductCategory::getInstanceByName($catname); if (!$cat) { continue; } ProductsCategoriesProducts::insert($cat->vals['id'], $id); Products_categoriesRecount(array($id)); } } break; // } // } case '0': break; default: // { ProductsCategoriesProducts::deleteByProductId($id); ProductsCategoriesProducts::insert($cid, $id); break; // } } $imported++; } // } Core_cacheClear('products'); if ($imported) { return array('message' => __('Imported %1 products', array($imported), 'core')); } return array('message' => __('No products imported')); }
/** * Prepend a filter to the list of filters. * * @param mixed $stream Stream which received the filter. * Should be resource or an object * \Hoa\Stream. * @param string $name Filter name. * @param int $mode self::READ, self::WRITE or * self::READ_AND_WRITE. * @param mixed $parameters Parameters. * @return resource */ public static function prepend($stream, $name, $mode = self::READ, $parameters = null) { if ($stream instanceof Stream) { $stream = $stream->getStream(); } if (null === $parameters) { return self::$_resources[$name] = stream_filter_prepend($stream, $name, $mode); } return self::$_resources[$name] = stream_filter_prepend($stream, $name, $mode, $parameters); }
/** * Opens the file resource * * @return resource */ protected function openResource() { $this->fileHandle = fopen($this->path, 'r'); $currentEncoding = $this->getCurrentEncoding(); if (isset($this->options['encoding']) && $currentEncoding !== $this->options['encoding']) { stream_filter_prepend($this->fileHandle, sprintf("convert.iconv.%s/%s", $this->options['encoding'], $this->getCurrentEncoding())); } }
private function inflateGzipBody(Response $response) { $src = $response->getBody(); if (is_resource($src)) { $destination = fopen('php://memory', 'r+'); fseek($src, 10, SEEK_SET); stream_filter_prepend($src, 'zlib.inflate', STREAM_FILTER_READ); stream_copy_to_stream($src, $destination); rewind($destination); $response->setBody($destination); } elseif (strlen($src)) { $body = gzdecode($src); $response->setBody($body); } }
function fileHandleFromIso8859($handle) { stream_filter_register("utf8encode", "utf8encode_filter") or die("Failed to register filter"); stream_filter_prepend($handle, "utf8encode"); return $handle; }