apache
wp-content
mu-plugins
plugins
activitypub
audioigniter
authldap
companion-auto-update
gitium
gp-premium
jetpack-protect
menu-icons
simple-local-avatars
smtp-mailer
two-factor
w3-total-cache
extension-example
inc
ini
languages
lib
Azure
GuzzleHttp
Cookie
Exception
Handler
Promise
Psr7
AppendStream.php
BufferStream.php
CachingStream.php
DroppingStream.php
FnStream.php
InflateStream.php
LazyOpenStream.php
LimitStream.php
MessageTrait.php
MultipartStream.php
NoSeekStream.php
PumpStream.php
Request.php
Response.php
ServerRequest.php
Stream.php
StreamDecoratorTrait.php
StreamWrapper.php
UploadedFile.php
Uri.php
functions.php
functions_include.php
Client.php
ClientInterface.php
HandlerStack.php
MessageFormatter.php
Middleware.php
Pool.php
PrepareBodyMiddleware.php
RedirectMiddleware.php
RequestOptions.php
RetryMiddleware.php
TransferStats.php
UriTemplate.php
functions.php
functions_include.php
MicrosoftAzureStorage
PsrHttpMessage
loader.php
CSSTidy
Db
Google
Minify
NetDNA
NewRelic
Nusoap
OAuth
SNS
YuiCssMin
S3Compatible.php
index.html
pub
vendor
wp-content
Base_Page_Settings.php
BrowserCache_ConfigLabels.php
BrowserCache_Core.php
BrowserCache_Environment.php
BrowserCache_Environment_Apache.php
BrowserCache_Environment_LiteSpeed.php
BrowserCache_Environment_Nginx.php
BrowserCache_Page.php
BrowserCache_Page_View_QuickReference.php
BrowserCache_Page_View_SectionSecurity.php
BrowserCache_Plugin.php
BrowserCache_Plugin_Admin.php
Cache.php
CacheFlush.php
CacheFlush_Locally.php
CacheGroups_Plugin_Admin.php
CacheGroups_Plugin_Admin_View.js
CacheGroups_Plugin_Admin_View.php
Cache_Apc.php
Cache_Apcu.php
Cache_Base.php
Cache_Eaccelerator.php
Cache_File.php
Cache_File_Cleaner.php
Cache_File_Cleaner_Generic.php
Cache_File_Cleaner_Generic_HardDelete.php
Cache_File_Generic.php
Cache_Memcache.php
Cache_Memcached.php
Cache_Memcached_Stats.php
Cache_Nginx_Memcached.php
Cache_Redis.php
Cache_Wincache.php
Cache_Xcache.php
CdnEngine.php
CdnEngine_Azure.php
CdnEngine_Base.php
CdnEngine_CloudFront.php
CdnEngine_Ftp.php
CdnEngine_GoogleDrive.php
CdnEngine_Mirror.php
CdnEngine_Mirror_Akamai.php
CdnEngine_Mirror_Att.php
CdnEngine_Mirror_BunnyCdn.php
CdnEngine_Mirror_CloudFront.php
CdnEngine_Mirror_Cotendo.php
CdnEngine_Mirror_Edgecast.php
CdnEngine_Mirror_Highwinds.php
CdnEngine_Mirror_LimeLight.php
CdnEngine_Mirror_RackSpaceCdn.php
CdnEngine_Mirror_StackPath.php
CdnEngine_Mirror_StackPath2.php
CdnEngine_RackSpaceCloudFiles.php
CdnEngine_S3.php
CdnEngine_S3_Compatible.php
Cdn_AdminActions.php
Cdn_AdminNotes.php
Cdn_BunnyCdn_Api.php
Cdn_BunnyCdn_Page.php
Cdn_BunnyCdn_Page_View.js
Cdn_BunnyCdn_Page_View.php
Cdn_BunnyCdn_Page_View_Purge_Urls.php
Cdn_BunnyCdn_Popup.php
Cdn_BunnyCdn_Popup_View_Configured.php
Cdn_BunnyCdn_Popup_View_Deauthorize.php
Cdn_BunnyCdn_Popup_View_Deauthorized.php
Cdn_BunnyCdn_Popup_View_Intro.php
Cdn_BunnyCdn_Popup_View_Pull_Zones.php
Cdn_BunnyCdn_Widget.php
Cdn_BunnyCdn_Widget_View.css
Cdn_BunnyCdn_Widget_View_Authorized.php
Cdn_BunnyCdn_Widget_View_Unauthorized.php
Cdn_CacheFlush.php
Cdn_ConfigLabels.php
Cdn_Core.php
Cdn_Core_Admin.php
Cdn_Environment.php
Cdn_Environment_LiteSpeed.php
Cdn_Environment_Nginx.php
Cdn_GeneralPage_View.php
Cdn_GoogleDrive_AdminActions.php
Cdn_GoogleDrive_Page.php
Cdn_GoogleDrive_Page_View.js
Cdn_GoogleDrive_Page_View.php
Cdn_GoogleDrive_Popup_AuthReturn.php
Cdn_GoogleDrive_Popup_AuthReturn_View.php
Cdn_Highwinds_Api.php
Cdn_Highwinds_Page.php
Cdn_Highwinds_Page_View.js
Cdn_Highwinds_Page_View.php
Cdn_Highwinds_Popup.php
Cdn_Highwinds_Popup_View_ConfigureCnamesForm.php
Cdn_Highwinds_Popup_View_Intro.php
Cdn_Highwinds_Popup_View_SelectHost.php
Cdn_Highwinds_Widget.php
Cdn_Highwinds_Widget_View.css
Cdn_Highwinds_Widget_View.js
Cdn_Highwinds_Widget_View.php
Cdn_Highwinds_Widget_View_NotConfigured.php
Cdn_LimeLight_Page.php
Cdn_LimeLight_Page_View.js
Cdn_LimeLight_Page_View.php
Cdn_LimeLight_Popup.php
Cdn_LimeLight_Popup_View_Intro.php
Cdn_LimeLight_Popup_View_Success.php
Cdn_Page.php
Cdn_Page_View_Fsd_HeaderActions.php
Cdn_Plugin.php
Cdn_Plugin_Admin.php
Cdn_RackSpaceCdn_AdminActions.php
Cdn_RackSpaceCdn_Page.php
Cdn_RackSpaceCdn_Page_View.js
Cdn_RackSpaceCdn_Page_View.php
Cdn_RackSpaceCdn_Popup.php
Cdn_RackSpaceCdn_Popup_View_ConfigureDomains.php
Cdn_RackSpaceCdn_Popup_View_Intro.php
Cdn_RackSpaceCdn_Popup_View_Regions.php
Cdn_RackSpaceCdn_Popup_View_Service_Actualize.php
Cdn_RackSpaceCdn_Popup_View_Service_Create.php
Cdn_RackSpaceCdn_Popup_View_Service_Created.php
Cdn_RackSpaceCdn_Popup_View_Services.php
Cdn_RackSpaceCloudFiles_Page.php
Cdn_RackSpaceCloudFiles_Page_View.js
Cdn_RackSpaceCloudFiles_Page_View.php
Cdn_RackSpaceCloudFiles_Popup.php
Cdn_RackSpaceCloudFiles_Popup_View_Containers.php
Cdn_RackSpaceCloudFiles_Popup_View_Intro.php
Cdn_RackSpaceCloudFiles_Popup_View_Regions.php
Cdn_RackSpace_Api_CaCert-example.pem
Cdn_RackSpace_Api_Cdn.php
Cdn_RackSpace_Api_CloudFiles.php
Cdn_RackSpace_Api_CloudFilesCdn.php
Cdn_RackSpace_Api_Tokens.php
Cdn_StackPath2_Api.php
Cdn_StackPath2_Page.php
Cdn_StackPath2_Page_View.js
Cdn_StackPath2_Page_View.php
Cdn_StackPath2_Popup.php
Cdn_StackPath2_Popup_View_Intro.php
Cdn_StackPath2_Popup_View_Sites.php
Cdn_StackPath2_Popup_View_Stacks.php
Cdn_StackPath2_Popup_View_Success.php
Cdn_StackPath2_Widget.php
Cdn_StackPath2_Widget_View.css
Cdn_StackPath2_Widget_View.js
Cdn_StackPath2_Widget_View_Authorized.php
Cdn_StackPath2_Widget_View_Unauthorized.php
Cdn_StackPath_Api.php
Cdn_StackPath_Page.php
Cdn_StackPath_Page_View.js
Cdn_StackPath_Page_View.php
Cdn_StackPath_Popup.php
Cdn_StackPath_Popup_View_Intro.php
Cdn_StackPath_Popup_View_Success.php
Cdn_StackPath_Popup_View_Zone.php
Cdn_StackPath_Popup_View_Zones.php
Cdn_StackPath_Widget.php
Cdn_StackPath_Widget_View.css
Cdn_StackPath_Widget_View.js
Cdn_StackPath_Widget_View_Authorized.php
Cdn_StackPath_Widget_View_Unauthorized.php
Cdn_Util.php
Cdnfsd_BunnyCdn_Engine.php
Cdnfsd_BunnyCdn_Page.php
Cdnfsd_BunnyCdn_Page_View.js
Cdnfsd_BunnyCdn_Page_View.php
Cdnfsd_BunnyCdn_Popup.php
Cdnfsd_BunnyCdn_Popup_View_Configured.php
Cdnfsd_BunnyCdn_Popup_View_Deauthorize.php
Cdnfsd_BunnyCdn_Popup_View_Deauthorized.php
Cdnfsd_BunnyCdn_Popup_View_Intro.php
Cdnfsd_BunnyCdn_Popup_View_Pull_Zones.php
Cdnfsd_CacheFlush.php
Cdnfsd_CloudFront_Engine.php
Cdnfsd_CloudFront_Page.php
Cdnfsd_CloudFront_Page_View.js
Cdnfsd_CloudFront_Page_View.php
Cdnfsd_CloudFront_Popup.php
Cdnfsd_CloudFront_Popup_View_Distribution.php
Cdnfsd_CloudFront_Popup_View_Distributions.php
Cdnfsd_CloudFront_Popup_View_Intro.php
Cdnfsd_CloudFront_Popup_View_Success.php
Cdnfsd_Core.php
Cdnfsd_GeneralPage_View.php
Cdnfsd_LimeLight_Api.php
Cdnfsd_LimeLight_Engine.php
Cdnfsd_LimeLight_Page.php
Cdnfsd_LimeLight_Page_View.js
Cdnfsd_LimeLight_Page_View.php
Cdnfsd_LimeLight_Popup.php
Cdnfsd_LimeLight_Popup_View_Intro.php
Cdnfsd_LimeLight_Popup_View_Success.php
Cdnfsd_Plugin.php
Cdnfsd_Plugin_Admin.php
Cdnfsd_StackPath2_Engine.php
Cdnfsd_StackPath2_Page.php
Cdnfsd_StackPath2_Page_View.js
Cdnfsd_StackPath2_Page_View.php
Cdnfsd_StackPath2_Popup.php
Cdnfsd_StackPath2_Popup_View_Intro.php
Cdnfsd_StackPath2_Popup_View_Sites.php
Cdnfsd_StackPath2_Popup_View_Stacks.php
Cdnfsd_StackPath2_Popup_View_Success.php
Cdnfsd_StackPath_Engine.php
Cdnfsd_StackPath_Page.php
Cdnfsd_StackPath_Page_View.js
Cdnfsd_StackPath_Page_View.php
Cdnfsd_StackPath_Popup.php
Cdnfsd_StackPath_Popup_View_Intro.php
Cdnfsd_StackPath_Popup_View_Success.php
Cdnfsd_StackPath_Popup_View_Zone.php
Cdnfsd_StackPath_Popup_View_Zones.php
Cdnfsd_TransparentCDN_Engine.php
Cdnfsd_TransparentCDN_Page.php
Cdnfsd_TransparentCDN_Page_View.js
Cdnfsd_TransparentCDN_Page_View.php
Cdnfsd_Util.php
Cli.php
Config.php
ConfigCache.php
ConfigCompiler.php
ConfigDbStorage.php
ConfigKeys.php
ConfigState.php
ConfigStateNote.php
ConfigUtil.php
DbCache_ConfigLabels.php
DbCache_Core.php
DbCache_Environment.php
DbCache_Page.php
DbCache_Plugin.php
DbCache_Plugin_Admin.php
DbCache_Wpdb.php
DbCache_WpdbBase.php
DbCache_WpdbInjection.php
DbCache_WpdbInjection_QueryCaching.php
DbCache_WpdbLegacy.php
DbCache_WpdbNew.php
Dispatcher.php
Enterprise_CacheFlush_MakeSnsEvent.php
Enterprise_Dbcache_WpdbInjection_Cluster.php
Enterprise_SnsBase.php
Enterprise_SnsServer.php
Extension_Amp_Page_View.php
Extension_Amp_Plugin.php
Extension_Amp_Plugin_Admin.php
Extension_CloudFlare_AdminActions.php
Extension_CloudFlare_Api.php
Extension_CloudFlare_Cdn_Page_View.php
Extension_CloudFlare_GeneralPage_View.php
Extension_CloudFlare_Page.php
Extension_CloudFlare_Page_View.js
Extension_CloudFlare_Page_View.php
Extension_CloudFlare_Plugin.php
Extension_CloudFlare_Plugin_Admin.php
Extension_CloudFlare_Popup.php
Extension_CloudFlare_Popup_View_Intro.php
Extension_CloudFlare_Popup_View_Zones.php
Extension_CloudFlare_SettingsForUi.php
Extension_CloudFlare_View_Dashboard.js
Extension_CloudFlare_Widget.php
Extension_CloudFlare_Widget_Logo.png
Extension_CloudFlare_Widget_View.css
Extension_CloudFlare_Widget_View.php
Extension_FragmentCache_Api.php
Extension_FragmentCache_Core.php
Extension_FragmentCache_Environment.php
Extension_FragmentCache_GeneralPage.php
Extension_FragmentCache_GeneralPage_View.php
Extension_FragmentCache_Page.php
Extension_FragmentCache_Page_View.php
Extension_FragmentCache_Plugin.php
Extension_FragmentCache_Plugin_Admin.php
Extension_FragmentCache_WpObjectCache.php
Extension_Genesis_Page.php
Extension_Genesis_Page_View.php
Extension_Genesis_Plugin.php
Extension_Genesis_Plugin_Admin.php
Extension_ImageService_Api.php
Extension_ImageService_Cron.php
Extension_ImageService_Environment.php
Extension_ImageService_Page_View.php
Extension_ImageService_Plugin.php
Extension_ImageService_Plugin_Admin.css
Extension_ImageService_Plugin_Admin.js
Extension_ImageService_Plugin_Admin.php
Extension_NewRelic_AdminActions.php
Extension_NewRelic_AdminNotes.php
Extension_NewRelic_Api.php
Extension_NewRelic_Core.php
Extension_NewRelic_GeneralPage.php
Extension_NewRelic_GeneralPage_View.php
Extension_NewRelic_Page.php
Extension_NewRelic_Page_View_Apm.php
Extension_NewRelic_Plugin.php
Extension_NewRelic_Plugin_Admin.php
Extension_NewRelic_Popup.php
Extension_NewRelic_Popup_View.js
Extension_NewRelic_Popup_View_Intro.php
Extension_NewRelic_Popup_View_ListApplications.php
Extension_NewRelic_Service.php
Extension_NewRelic_Widget.php
Extension_NewRelic_Widget_View.css
Extension_NewRelic_Widget_View.js
Extension_NewRelic_Widget_View_Apm.php
Extension_NewRelic_Widget_View_Browser.php
Extension_NewRelic_Widget_View_NotConfigured.php
Extension_Swarmify_AdminActions.php
Extension_Swarmify_Core.php
Extension_Swarmify_Page.php
Extension_Swarmify_Page_View.php
Extension_Swarmify_Plugin.php
Extension_Swarmify_Plugin_Admin.php
Extension_Swarmify_Widget.php
Extension_Swarmify_Widget_View.css
Extension_Swarmify_Widget_View_NotConfigured.php
Extension_WordPressSeo_Plugin.php
Extension_WordPressSeo_Plugin_Admin.php
Extension_Wpml_Plugin.php
Extension_Wpml_Plugin_Admin.php
Extensions_AdminActions.php
Extensions_Page.php
Extensions_Plugin_Admin.php
Extensions_Util.php
FeatureShowcase_Plugin_Admin.php
FeatureShowcase_Plugin_Admin_View.php
Generic_AdminActions_Config.php
Generic_AdminActions_Default.php
Generic_AdminActions_Flush.php
Generic_AdminActions_Test.php
Generic_AdminNotes.php
Generic_ConfigLabels.php
Generic_Environment.php
Generic_Faq.php
Generic_GeneralPage_View_ShowEdge.js
Generic_GeneralPage_View_ShowSupportUs.js
Generic_Page_About.php
Generic_Page_Dashboard.php
Generic_Page_Dashboard_View.css
Generic_Page_General.php
Generic_Page_Install.php
Generic_Page_PurgeLog.php
Generic_Page_PurgeLog_View.php
Generic_Plugin.php
Generic_Plugin_Admin.php
Generic_Plugin_AdminCompatibility.php
Generic_Plugin_AdminNotifications.php
Generic_Plugin_AdminRowActions.php
Generic_Plugin_Admin_View_Faq.php
Generic_Plugin_WidgetForum.php
Generic_Plugin_WidgetNews.php
Generic_WidgetBoldGrid.php
Generic_WidgetBoldGrid_AdminActions.php
Generic_WidgetBoldGrid_Logo.svg
Generic_WidgetBoldGrid_View.js
Generic_WidgetBoldGrid_View.php
Generic_WidgetCommunity.php
Generic_WidgetCommunity_View.php
Generic_WidgetServices.php
Generic_WidgetServices_View.php
Generic_WidgetSpreadTheWord.js
Generic_WidgetSpreadTheWord_Plugin.php
Generic_WidgetSpreadTheWord_View.php
LICENSE
Licensing_AdminActions.php
Licensing_Core.php
Licensing_Plugin_Admin.php
Minify_AutoCss.php
Minify_AutoJs.php
Minify_ConfigLabels.php
Minify_ContentMinifier.php
Minify_Core.php
Minify_Environment.php
Minify_Environment_LiteSpeed.php
Minify_Extract.php
Minify_GeneralPage_View_ShowHelp.js
Minify_GeneralPage_View_ShowHelpForce.js
Minify_HelpPopup_View.php
Minify_MinifiedFileRequestHandler.php
Minify_Page.php
Minify_Plugin.php
Minify_Plugin_Admin.php
Mobile_Base.php
Mobile_Redirect.php
Mobile_Referrer.php
Mobile_UserAgent.php
ModuleStatus.php
ObjectCache_ConfigLabels.php
ObjectCache_Environment.php
ObjectCache_Page.php
ObjectCache_Page_View_PurgeLog.php
ObjectCache_Plugin.php
ObjectCache_Plugin_Admin.php
ObjectCache_WpObjectCache.php
ObjectCache_WpObjectCache_Regular.php
PageSpeed_Api.php
PageSpeed_Data.php
PageSpeed_Instructions.php
PageSpeed_Page.php
PageSpeed_Page_View.css
PageSpeed_Page_View.js
PageSpeed_Page_View.php
PageSpeed_Page_View_FromAPI.php
PageSpeed_Widget.php
PageSpeed_Widget_View.css
PageSpeed_Widget_View.js
PageSpeed_Widget_View.php
PageSpeed_Widget_View_FromApi.php
PgCache_ConfigLabels.php
PgCache_ContentGrabber.php
PgCache_Environment.php
PgCache_Flush.php
PgCache_Page.php
PgCache_Page_View.js
PgCache_Plugin.php
PgCache_Plugin_Admin.php
PgCache_QsExempts.php
Root_AdminActions.php
Root_AdminActivation.php
Root_AdminMenu.php
Root_Environment.php
Root_Loader.php
SetupGuide_Plugin_Admin.php
Support_AdminActions.php
Support_Page.php
Support_Page_View_DoneContent.php
Support_Page_View_PageContent.php
SystemOpCache_AdminActions.php
SystemOpCache_Core.php
SystemOpCache_GeneralPage_View.php
SystemOpCache_Plugin_Admin.php
UsageStatistics_AdminActions.php
UsageStatistics_Core.php
UsageStatistics_GeneralPage.php
UsageStatistics_GeneralPage_View.php
UsageStatistics_Page.php
UsageStatistics_Page_DbRequests_View.php
UsageStatistics_Page_ObjectCacheLog_View.php
UsageStatistics_Page_PageCacheRequests_View.php
UsageStatistics_Page_View.css
UsageStatistics_Page_View.js
UsageStatistics_Page_View.php
UsageStatistics_Page_View_Ad.php
UsageStatistics_Page_View_Disabled.php
UsageStatistics_Page_View_Free.php
UsageStatistics_Page_View_NoDebugMode.php
UsageStatistics_Plugin.php
UsageStatistics_Plugin_Admin.php
UsageStatistics_Source_AccessLog.php
UsageStatistics_Source_DbQueriesLog.php
UsageStatistics_Source_ObjectCacheLog.php
UsageStatistics_Source_PageCacheLog.php
UsageStatistics_Source_Wpdb.php
UsageStatistics_Sources.php
UsageStatistics_Sources_Apc.php
UsageStatistics_Sources_Memcached.php
UsageStatistics_Sources_Redis.php
UsageStatistics_StorageReader.php
UsageStatistics_StorageWriter.php
UsageStatistics_Widget.php
UsageStatistics_Widget_View.js
UsageStatistics_Widget_View.php
UsageStatistics_Widget_View_Disabled.php
UserExperience_DeferScripts_Extension.php
UserExperience_DeferScripts_Mutator.php
UserExperience_DeferScripts_Page_View.php
UserExperience_DeferScripts_Script.js
UserExperience_Emoji_Extension.php
UserExperience_GeneralPage.php
UserExperience_GeneralPage_View.php
UserExperience_LazyLoad_GoogleMaps_GoogleMapsEasy.php
UserExperience_LazyLoad_GoogleMaps_WPGoogleMapPlugin.php
UserExperience_LazyLoad_GoogleMaps_WPGoogleMaps.php
UserExperience_LazyLoad_Mutator.php
UserExperience_LazyLoad_Mutator_Picture.php
UserExperience_LazyLoad_Mutator_Unmutable.php
UserExperience_LazyLoad_Page_View.php
UserExperience_LazyLoad_Plugin.php
UserExperience_OEmbed_Extension.php
UserExperience_Page.php
UserExperience_Page_View.php
UserExperience_Plugin_Admin.php
UserExperience_Plugin_Jquery.php
UserExperience_Preload_Requests_Extension.php
UserExperience_Preload_Requests_Page_View.php
Util_Activation.php
Util_Admin.php
Util_AttachToActions.php
Util_Bus.php
Util_ConfigLabel.php
Util_Content.php
Util_Debug.php
Util_DebugPurgeLog_Reader.php
Util_Environment.php
Util_Environment_Exception.php
Util_Environment_Exceptions.php
Util_File.php
Util_Http.php
Util_Installed.php
Util_Mime.php
Util_PageSpeed.php
Util_PageUrls.php
Util_Request.php
Util_Rule.php
Util_Theme.php
Util_Ui.php
Util_UsageStatistics.php
Util_Widget.php
Util_WpFile.php
Util_WpFile_FilesystemChmodException.php
Util_WpFile_FilesystemCopyException.php
Util_WpFile_FilesystemMkdirException.php
Util_WpFile_FilesystemModifyException.php
Util_WpFile_FilesystemOperationException.php
Util_WpFile_FilesystemRmException.php
Util_WpFile_FilesystemRmdirException.php
Util_WpFile_FilesystemWriteException.php
Util_WpmuBlogmap.php
Varnish_Flush.php
Varnish_Plugin.php
index.html
press.txt
readme.txt
w3-total-cache-api.php
w3-total-cache-old-php.php
w3-total-cache.php
wp-piwik
wp-webauthn
index.php
themes
upgrade-temp-backup
w3tc-config
index.php
.dbsetup
.gitignore
htaccess
php.ini
234 lines
5.4 KiB
PHP
234 lines
5.4 KiB
PHP
<?php
|
|
namespace GuzzleHttp\Psr7;
|
|
|
|
use Psr\Http\Message\StreamInterface;
|
|
|
|
/**
|
|
* Reads from multiple streams, one after the other.
|
|
*
|
|
* This is a read-only stream decorator.
|
|
*/
|
|
class AppendStream implements StreamInterface
|
|
{
|
|
/** @var StreamInterface[] Streams being decorated */
|
|
private $streams = [];
|
|
|
|
private $seekable = true;
|
|
private $current = 0;
|
|
private $pos = 0;
|
|
private $detached = false;
|
|
|
|
/**
|
|
* @param StreamInterface[] $streams Streams to decorate. Each stream must
|
|
* be readable.
|
|
*/
|
|
public function __construct(array $streams = [])
|
|
{
|
|
foreach ($streams as $stream) {
|
|
$this->addStream($stream);
|
|
}
|
|
}
|
|
|
|
public function __toString()
|
|
{
|
|
try {
|
|
$this->rewind();
|
|
return $this->getContents();
|
|
} catch (\Exception $e) {
|
|
return '';
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Add a stream to the AppendStream
|
|
*
|
|
* @param StreamInterface $stream Stream to append. Must be readable.
|
|
*
|
|
* @throws \InvalidArgumentException if the stream is not readable
|
|
*/
|
|
public function addStream(StreamInterface $stream)
|
|
{
|
|
if (!$stream->isReadable()) {
|
|
throw new \InvalidArgumentException('Each stream must be readable');
|
|
}
|
|
|
|
// The stream is only seekable if all streams are seekable
|
|
if (!$stream->isSeekable()) {
|
|
$this->seekable = false;
|
|
}
|
|
|
|
$this->streams[] = $stream;
|
|
}
|
|
|
|
public function getContents()
|
|
{
|
|
return copy_to_string($this);
|
|
}
|
|
|
|
/**
|
|
* Closes each attached stream.
|
|
*
|
|
* {@inheritdoc}
|
|
*/
|
|
public function close()
|
|
{
|
|
$this->pos = $this->current = 0;
|
|
|
|
foreach ($this->streams as $stream) {
|
|
$stream->close();
|
|
}
|
|
|
|
$this->streams = [];
|
|
}
|
|
|
|
/**
|
|
* Detaches each attached stream
|
|
*
|
|
* {@inheritdoc}
|
|
*/
|
|
public function detach()
|
|
{
|
|
$this->close();
|
|
$this->detached = true;
|
|
}
|
|
|
|
public function tell()
|
|
{
|
|
return $this->pos;
|
|
}
|
|
|
|
/**
|
|
* Tries to calculate the size by adding the size of each stream.
|
|
*
|
|
* If any of the streams do not return a valid number, then the size of the
|
|
* append stream cannot be determined and null is returned.
|
|
*
|
|
* {@inheritdoc}
|
|
*/
|
|
public function getSize()
|
|
{
|
|
$size = 0;
|
|
|
|
foreach ($this->streams as $stream) {
|
|
$s = $stream->getSize();
|
|
if ($s === null) {
|
|
return null;
|
|
}
|
|
$size += $s;
|
|
}
|
|
|
|
return $size;
|
|
}
|
|
|
|
public function eof()
|
|
{
|
|
return !$this->streams ||
|
|
($this->current >= count($this->streams) - 1 &&
|
|
$this->streams[$this->current]->eof());
|
|
}
|
|
|
|
public function rewind()
|
|
{
|
|
$this->seek(0);
|
|
}
|
|
|
|
/**
|
|
* Attempts to seek to the given position. Only supports SEEK_SET.
|
|
*
|
|
* {@inheritdoc}
|
|
*/
|
|
public function seek($offset, $whence = SEEK_SET)
|
|
{
|
|
if (!$this->seekable) {
|
|
throw new \RuntimeException('This AppendStream is not seekable');
|
|
} elseif ($whence !== SEEK_SET) {
|
|
throw new \RuntimeException('The AppendStream can only seek with SEEK_SET');
|
|
}
|
|
|
|
$this->pos = $this->current = 0;
|
|
|
|
// Rewind each stream
|
|
foreach ($this->streams as $i => $stream) {
|
|
try {
|
|
$stream->rewind();
|
|
} catch (\Exception $e) {
|
|
throw new \RuntimeException('Unable to seek stream '
|
|
. $i . ' of the AppendStream', 0, $e);
|
|
}
|
|
}
|
|
|
|
// Seek to the actual position by reading from each stream
|
|
while ($this->pos < $offset && !$this->eof()) {
|
|
$result = $this->read(min(8096, $offset - $this->pos));
|
|
if ($result === '') {
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Reads from all of the appended streams until the length is met or EOF.
|
|
*
|
|
* {@inheritdoc}
|
|
*/
|
|
public function read($length)
|
|
{
|
|
$buffer = '';
|
|
$total = count($this->streams) - 1;
|
|
$remaining = $length;
|
|
$progressToNext = false;
|
|
|
|
while ($remaining > 0) {
|
|
|
|
// Progress to the next stream if needed.
|
|
if ($progressToNext || $this->streams[$this->current]->eof()) {
|
|
$progressToNext = false;
|
|
if ($this->current === $total) {
|
|
break;
|
|
}
|
|
$this->current++;
|
|
}
|
|
|
|
$result = $this->streams[$this->current]->read($remaining);
|
|
|
|
// Using a loose comparison here to match on '', false, and null
|
|
if ($result == null) {
|
|
$progressToNext = true;
|
|
continue;
|
|
}
|
|
|
|
$buffer .= $result;
|
|
$remaining = $length - strlen($buffer);
|
|
}
|
|
|
|
$this->pos += strlen($buffer);
|
|
|
|
return $buffer;
|
|
}
|
|
|
|
public function isReadable()
|
|
{
|
|
return true;
|
|
}
|
|
|
|
public function isWritable()
|
|
{
|
|
return false;
|
|
}
|
|
|
|
public function isSeekable()
|
|
{
|
|
return $this->seekable;
|
|
}
|
|
|
|
public function write($string)
|
|
{
|
|
throw new \RuntimeException('Cannot write to an AppendStream');
|
|
}
|
|
|
|
public function getMetadata($key = null)
|
|
{
|
|
return $key ? null : [];
|
|
}
|
|
}
|