PageRenderTime 66ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/hphp/system/php/stream/default-filters.php

http://github.com/facebook/hiphop-php
PHP | 143 lines | 128 code | 14 blank | 1 comment | 12 complexity | 2f2df590f884d63ddd60a78f8b242a70 MD5 | raw file
Possible License(s): LGPL-2.1, BSD-2-Clause, BSD-3-Clause, MPL-2.0-no-copyleft-exception, MIT, LGPL-2.0, Apache-2.0
  1. <?php
  2. namespace __SystemLib {
  3. function register_default_stream_filters() {
  4. \stream_filter_register('zlib.deflate', '__SystemLib\DeflateStreamFilter');
  5. \stream_filter_register('zlib.inflate', '__SystemLib\InflateStreamFilter');
  6. \stream_filter_register(
  7. 'string.rot13',
  8. '__SystemLib\StringRot13StreamFilter'
  9. );
  10. \stream_filter_Register(
  11. 'string.toupper',
  12. '__SystemLib\StringToUpperStreamFilter'
  13. );
  14. \stream_filter_Register(
  15. 'string.tolower',
  16. '__SystemLib\StringToLowerStreamFilter'
  17. );
  18. \stream_filter_Register(
  19. 'convert.iconv.*',
  20. '__SystemLib\ConvertIconvFilter'
  21. );
  22. }
  23. class ConvertIconvFilter extends \php_user_filter {
  24. private $fromEncoding;
  25. private $toEncoding;
  26. public function onCreate(): bool {
  27. /* strip out prefix "convert.iconv." */
  28. $filter = substr($this->filtername, 14);
  29. if (false === strpos($filter, '/')) {
  30. return false;
  31. }
  32. $encodingPair = explode('/', $filter, 2);
  33. $this->fromEncoding = strtolower($encodingPair[0]);
  34. $this->toEncoding = strtolower($encodingPair[1]);
  35. return true;
  36. }
  37. public function filter($in, $out, &$consumed, $closing): int {
  38. while ($bucket = stream_bucket_make_writeable($in)) {
  39. $convertedData = iconv(
  40. $this->fromEncoding,
  41. $this->toEncoding,
  42. $bucket->data
  43. );
  44. stream_bucket_append(
  45. $out,
  46. stream_bucket_new($this->stream, $convertedData)
  47. );
  48. }
  49. return \PSFS_PASS_ON;
  50. }
  51. }
  52. class DeflateStreamFilter extends \php_user_filter {
  53. private $level = -1; // zlib default
  54. private $buffer = '';
  55. public function filter($in, $out, &$consumed, $closing): int {
  56. while ($bucket = stream_bucket_make_writeable($in)) {
  57. $this->buffer .= $bucket->data;
  58. }
  59. if ($closing) {
  60. if (is_int($this->params)) {
  61. $this->level = $this->params;
  62. }
  63. if (is_array($this->params) && isset($this->params['level'])) {
  64. $this->level = $this->params['level'];
  65. }
  66. stream_bucket_append(
  67. $out,
  68. stream_bucket_new(
  69. $this->stream,
  70. gzdeflate($this->buffer, $this->level)
  71. )
  72. );
  73. }
  74. return \PSFS_PASS_ON;
  75. }
  76. }
  77. class InflateStreamFilter extends \php_user_filter {
  78. public function onCreate(): bool {
  79. $this->impl = new \__SystemLib\ChunkedInflator();
  80. return true;
  81. }
  82. public function filter($in, $out, &$consumed, $closing): int {
  83. while ($bucket = stream_bucket_make_writeable($in)) {
  84. if ($this->impl->eof()) {
  85. return \PSFS_ERR_FATAL;
  86. }
  87. $this_chunk = $this->impl->inflateChunk($bucket->data);
  88. stream_bucket_append(
  89. $out,
  90. stream_bucket_new($this->stream, $this_chunk)
  91. );
  92. }
  93. return \PSFS_PASS_ON;
  94. }
  95. }
  96. class StringToUpperStreamFilter extends \php_user_filter {
  97. public function filter($in, $out, &$consumed, $closing): int {
  98. while ($bucket = stream_bucket_make_writeable($in)) {
  99. stream_bucket_append(
  100. $out,
  101. stream_bucket_new($this->stream, strtoupper($bucket->data))
  102. );
  103. }
  104. return \PSFS_PASS_ON;
  105. }
  106. }
  107. class StringToLowerStreamFilter extends \php_user_filter {
  108. public function filter($in, $out, &$consumed, $closing): int {
  109. while ($bucket = stream_bucket_make_writeable($in)) {
  110. stream_bucket_append(
  111. $out,
  112. stream_bucket_new($this->stream, strtolower($bucket->data))
  113. );
  114. }
  115. return \PSFS_PASS_ON;
  116. }
  117. }
  118. class StringRot13StreamFilter extends \php_user_filter {
  119. public function filter($in, $out, &$consumed, $closing): int {
  120. while ($bucket = stream_bucket_make_writeable($in)) {
  121. stream_bucket_append(
  122. $out,
  123. stream_bucket_new($this->stream, str_rot13($bucket->data))
  124. );
  125. }
  126. return \PSFS_PASS_ON;
  127. }
  128. }
  129. }