Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        /// <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);
        }