private CacheControlHeaderValue(CacheControlHeaderValue source)
        {
            Contract.Requires(source != null);

            _noCache         = source._noCache;
            _noStore         = source._noStore;
            _maxAge          = source._maxAge;
            _sharedMaxAge    = source._sharedMaxAge;
            _maxStale        = source._maxStale;
            _maxStaleLimit   = source._maxStaleLimit;
            _minFresh        = source._minFresh;
            _noTransform     = source._noTransform;
            _onlyIfCached    = source._onlyIfCached;
            _publicField     = source._publicField;
            _privateField    = source._privateField;
            _mustRevalidate  = source._mustRevalidate;
            _proxyRevalidate = source._proxyRevalidate;

            if (source._noCacheHeaders != null)
            {
                foreach (var noCacheHeader in source._noCacheHeaders)
                {
                    NoCacheHeaders.Add(noCacheHeader);
                }
            }

            if (source._privateHeaders != null)
            {
                foreach (var privateHeader in source._privateHeaders)
                {
                    PrivateHeaders.Add(privateHeader);
                }
            }

            if (source._extensions != null)
            {
                foreach (var extension in source._extensions)
                {
                    Extensions.Add((NameValueHeaderValue)((ICloneable)extension).Clone());
                }
            }
        }
        public override bool Equals(object obj)
        {
            CacheControlHeaderValue other = obj as CacheControlHeaderValue;

            if (other == null)
            {
                return(false);
            }

            if ((_noCache != other._noCache) || (_noStore != other._noStore) || (_maxAge != other._maxAge) ||
                (_sharedMaxAge != other._sharedMaxAge) || (_maxStale != other._maxStale) ||
                (_maxStaleLimit != other._maxStaleLimit) || (_minFresh != other._minFresh) ||
                (_noTransform != other._noTransform) || (_onlyIfCached != other._onlyIfCached) ||
                (_publicField != other._publicField) || (_privateField != other._privateField) ||
                (_mustRevalidate != other._mustRevalidate) || (_proxyRevalidate != other._proxyRevalidate))
            {
                return(false);
            }

            if (!HeaderUtilities.AreEqualCollections(_noCacheHeaders, other._noCacheHeaders,
                                                     StringComparer.OrdinalIgnoreCase))
            {
                return(false);
            }

            if (!HeaderUtilities.AreEqualCollections(_privateHeaders, other._privateHeaders,
                                                     StringComparer.OrdinalIgnoreCase))
            {
                return(false);
            }

            if (!HeaderUtilities.AreEqualCollections(_extensions, other._extensions))
            {
                return(false);
            }

            return(true);
        }
        private static bool TrySetCacheControlValues(CacheControlHeaderValue cc,
                                                     List <NameValueHeaderValue> nameValueList)
        {
            foreach (NameValueHeaderValue nameValue in nameValueList)
            {
                bool   success = true;
                string name    = nameValue.Name.ToLowerInvariant();

                switch (name)
                {
                case noCacheString:
                    success = TrySetOptionalTokenList(nameValue, ref cc._noCache, ref cc._noCacheHeaders);
                    break;

                case noStoreString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._noStore);
                    break;

                case maxAgeString:
                    success = TrySetTimeSpan(nameValue, ref cc._maxAge);
                    break;

                case maxStaleString:
                    success = ((nameValue.Value == null) || TrySetTimeSpan(nameValue, ref cc._maxStaleLimit));
                    if (success)
                    {
                        cc._maxStale = true;
                    }
                    break;

                case minFreshString:
                    success = TrySetTimeSpan(nameValue, ref cc._minFresh);
                    break;

                case noTransformString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._noTransform);
                    break;

                case onlyIfCachedString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._onlyIfCached);
                    break;

                case publicString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._publicField);
                    break;

                case privateString:
                    success = TrySetOptionalTokenList(nameValue, ref cc._privateField, ref cc._privateHeaders);
                    break;

                case mustRevalidateString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._mustRevalidate);
                    break;

                case proxyRevalidateString:
                    success = TrySetTokenOnlyValue(nameValue, ref cc._proxyRevalidate);
                    break;

                case sharedMaxAgeString:
                    success = TrySetTimeSpan(nameValue, ref cc._sharedMaxAge);
                    break;

                default:
                    cc.Extensions.Add(nameValue);     // success is always true
                    break;
                }

                if (!success)
                {
                    return(false);
                }
            }

            return(true);
        }