public override PhpStream Open(ref string path, string mode, StreamOpenOptions options, StreamContext context) { int level = -1; DeflateFilterMode deflateMode = DeflateFilterMode.Normal; #region Parse mode options // PHP just looks whether there are mode flags in the mode string (skip the first character) // last flag is the valid one for (int i = 1; i < mode.Length; i++) { if (Char.IsDigit(mode[i])) { level = mode[i] - '0'; } else if (mode[i] == 'f') { deflateMode = DeflateFilterMode.Filter; } else if (mode[i] == 'h') { deflateMode = DeflateFilterMode.Huffman; } } #endregion #region Path correction if (path.StartsWith("compress.zlib://")) { path = path.Substring(16); } else if (path.StartsWith("zlib:")) { path = path.Substring(5); } #endregion PhpStream stream = PhpStream.Open(path, mode, options); if (stream != null && stream.CanRead) { stream.AddFilter(new GzipUncompressionFilter(), FilterChainOptions.Read); } if (stream != null && stream.CanWrite) { stream.AddFilter(new GzipCompresionFilter(level, deflateMode), FilterChainOptions.Write); } return(stream); }
/// <summary> /// Insert the filter into the filter chains. /// </summary> /// <param name="ctx">Runtime context.</param> /// <param name="stream">Which stream's filter chains.</param> /// <param name="filter">What filter.</param> /// <param name="where">What position in the chains.</param> /// <param name="parameters">Additional parameters for the filter.</param> /// <returns>Filters that have been added.</returns> internal static (PhpFilter readFilter, PhpFilter writeFilter) AddToStream(Context ctx, PhpStream stream, string filter, FilterChainOptions where, PhpValue parameters) { if ((stream.Options & StreamAccessOptions.Read) == 0) { where &= ~FilterChainOptions.Read; } if ((stream.Options & StreamAccessOptions.Write) == 0) { where &= ~FilterChainOptions.Write; } PhpFilter readFilter = null, writeFilter = null; if ((where & FilterChainOptions.Read) != 0) { if (GetFilter(ctx, filter, true, out readFilter, parameters)) { stream.AddFilter(readFilter, where); readFilter.OnCreate(); // Add to chain, (filters buffers too). } else { PhpException.Throw(PhpError.Warning, Core.Resources.ErrResources.invalid_filter_name, filter); //return false; throw new ArgumentException(nameof(filter)); } } if ((where & FilterChainOptions.Write) != 0) { if (GetFilter(ctx, filter, true, out writeFilter, parameters)) { stream.AddFilter(writeFilter, where); writeFilter.OnCreate(); // Add to chain. } else { PhpException.Throw(PhpError.Warning, Core.Resources.ErrResources.invalid_filter_name, filter); //return false; throw new ArgumentException(nameof(filter)); } } return(readFilter, writeFilter); }
/// <summary> /// Insert the filter into the filter chains. /// </summary> /// <param name="ctx">Runtime context.</param> /// <param name="stream">Which stream's filter chains.</param> /// <param name="filter">What filter.</param> /// <param name="where">What position in the chains.</param> /// <param name="parameters">Additional parameters for the filter.</param> /// <returns>True if successful.</returns> public static bool AddToStream(Context ctx, PhpStream stream, string filter, FilterChainOptions where, PhpValue parameters) { PhpFilter readFilter, writeFilter; if ((stream.Options & StreamAccessOptions.Read) == 0) { where &= ~FilterChainOptions.Read; } if ((stream.Options & StreamAccessOptions.Write) == 0) { where &= ~FilterChainOptions.Write; } if ((where & FilterChainOptions.Read) > 0) { if (!GetFilter(ctx, filter, true, out readFilter, parameters)) { //PhpException.Throw(PhpError.Warning, CoreResources.GetString("invalid_filter_name", filter)); //return false; throw new ArgumentException(nameof(filter)); } stream.AddFilter(readFilter, where); readFilter.OnCreate(); // Add to chain, (filters buffers too). } if ((where & FilterChainOptions.Write) > 0) { if (!GetFilter(ctx, filter, true, out writeFilter, parameters)) { //PhpException.Throw(PhpError.Warning, CoreResources.GetString("invalid_filter_name", filter)); //return false; throw new ArgumentException(nameof(filter)); } stream.AddFilter(writeFilter, where); writeFilter.OnCreate(); // Add to chain. } return(true); }