001/*
002 * ====================================================================
003 * Licensed to the Apache Software Foundation (ASF) under one
004 * or more contributor license agreements.  See the NOTICE file
005 * distributed with this work for additional information
006 * regarding copyright ownership.  The ASF licenses this file
007 * to you under the Apache License, Version 2.0 (the
008 * "License"); you may not use this file except in compliance
009 * with the License.  You may obtain a copy of the License at
010 *
011 *   http://www.apache.org/licenses/LICENSE-2.0
012 *
013 * Unless required by applicable law or agreed to in writing,
014 * software distributed under the License is distributed on an
015 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
016 * KIND, either express or implied.  See the License for the
017 * specific language governing permissions and limitations
018 * under the License.
019 * ====================================================================
020 *
021 * This software consists of voluntary contributions made by many
022 * individuals on behalf of the Apache Software Foundation.  For more
023 * information on the Apache Software Foundation, please see
024 * <http://www.apache.org/>.
025 *
026 */
027
028package org.apache.http.impl.cookie;
029
030import org.apache.http.annotation.Contract;
031import org.apache.http.annotation.Obsolete;
032import org.apache.http.annotation.ThreadingBehavior;
033import org.apache.http.conn.util.PublicSuffixMatcher;
034import org.apache.http.cookie.CookieSpec;
035import org.apache.http.cookie.CookieSpecProvider;
036import org.apache.http.protocol.HttpContext;
037
038/**
039 * {@link org.apache.http.cookie.CookieSpecProvider} implementation that provides an instance of
040 * {@link RFC2965Spec}. The instance returned by this factory can
041 * be shared by multiple threads.
042 * <p>
043 * Rendered obsolete by {@link org.apache.http.impl.cookie.RFC6265CookieSpecProvider}
044 *
045 * @since 4.4
046 * @see org.apache.http.impl.cookie.RFC6265CookieSpecProvider
047 */
048@Obsolete
049@Contract(threading = ThreadingBehavior.IMMUTABLE_CONDITIONAL)
050public class RFC2965SpecProvider implements CookieSpecProvider {
051
052    private final PublicSuffixMatcher publicSuffixMatcher;
053    private final boolean oneHeader;
054
055    private volatile CookieSpec cookieSpec;
056
057    public RFC2965SpecProvider(final PublicSuffixMatcher publicSuffixMatcher, final boolean oneHeader) {
058        super();
059        this.oneHeader = oneHeader;
060        this.publicSuffixMatcher = publicSuffixMatcher;
061    }
062
063    public RFC2965SpecProvider(final PublicSuffixMatcher publicSuffixMatcher) {
064        this(publicSuffixMatcher, false);
065    }
066
067    public RFC2965SpecProvider() {
068        this(null, false);
069    }
070
071    @Override
072    public CookieSpec create(final HttpContext context) {
073        if (cookieSpec == null) {
074            synchronized (this) {
075                if (cookieSpec == null) {
076                    this.cookieSpec = new RFC2965Spec(this.oneHeader,
077                            new RFC2965VersionAttributeHandler(),
078                            new BasicPathHandler(),
079                            PublicSuffixDomainFilter.decorate(
080                                    new RFC2965DomainAttributeHandler(), this.publicSuffixMatcher),
081                            new RFC2965PortAttributeHandler(),
082                            new BasicMaxAgeHandler(),
083                            new BasicSecureHandler(),
084                            new BasicCommentHandler(),
085                            new RFC2965CommentUrlAttributeHandler(),
086                            new RFC2965DiscardAttributeHandler());
087                }
088            }
089        }
090        return this.cookieSpec;
091    }
092
093}