1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 package org.apache.http.impl.cookie;
29
30 import org.apache.http.annotation.Contract;
31 import org.apache.http.annotation.ThreadingBehavior;
32 import org.apache.http.conn.util.PublicSuffixMatcher;
33 import org.apache.http.cookie.Cookie;
34 import org.apache.http.cookie.CookieOrigin;
35 import org.apache.http.cookie.CookieSpec;
36 import org.apache.http.cookie.CookieSpecProvider;
37 import org.apache.http.cookie.MalformedCookieException;
38 import org.apache.http.protocol.HttpContext;
39
40
41
42
43
44
45
46
47 @Contract(threading = ThreadingBehavior.IMMUTABLE)
48 public class DefaultCookieSpecProvider implements CookieSpecProvider {
49
50 public enum CompatibilityLevel {
51 DEFAULT,
52 IE_MEDIUM_SECURITY
53 }
54
55 private final CompatibilityLevel compatibilityLevel;
56 private final PublicSuffixMatcher publicSuffixMatcher;
57 private final String[] datepatterns;
58 private final boolean oneHeader;
59
60 private volatile CookieSpec cookieSpec;
61
62 public DefaultCookieSpecProvider(
63 final CompatibilityLevel compatibilityLevel,
64 final PublicSuffixMatcher publicSuffixMatcher,
65 final String[] datepatterns,
66 final boolean oneHeader) {
67 super();
68 this.compatibilityLevel = compatibilityLevel != null ? compatibilityLevel : CompatibilityLevel.DEFAULT;
69 this.publicSuffixMatcher = publicSuffixMatcher;
70 this.datepatterns = datepatterns;
71 this.oneHeader = oneHeader;
72 }
73
74 public DefaultCookieSpecProvider(
75 final CompatibilityLevel compatibilityLevel,
76 final PublicSuffixMatcher publicSuffixMatcher) {
77 this(compatibilityLevel, publicSuffixMatcher, null, false);
78 }
79
80 public DefaultCookieSpecProvider(final PublicSuffixMatcher publicSuffixMatcher) {
81 this(CompatibilityLevel.DEFAULT, publicSuffixMatcher, null, false);
82 }
83
84 public DefaultCookieSpecProvider() {
85 this(CompatibilityLevel.DEFAULT, null, null, false);
86 }
87
88 @Override
89 public CookieSpec create(final HttpContext context) {
90 if (cookieSpec == null) {
91 synchronized (this) {
92 if (cookieSpec == null) {
93 final RFC2965SpecC2965Spec.html#RFC2965Spec">RFC2965Spec strict = new RFC2965Spec(this.oneHeader,
94 new RFC2965VersionAttributeHandler(),
95 new BasicPathHandler(),
96 PublicSuffixDomainFilter.decorate(
97 new RFC2965DomainAttributeHandler(), this.publicSuffixMatcher),
98 new RFC2965PortAttributeHandler(),
99 new BasicMaxAgeHandler(),
100 new BasicSecureHandler(),
101 new BasicCommentHandler(),
102 new RFC2965CommentUrlAttributeHandler(),
103 new RFC2965DiscardAttributeHandler());
104 final RFC2109Specc.html#RFC2109Spec">RFC2109Spec obsoleteStrict = new RFC2109Spec(this.oneHeader,
105 new RFC2109VersionHandler(),
106 new BasicPathHandler(),
107 PublicSuffixDomainFilter.decorate(
108 new RFC2109DomainHandler(), this.publicSuffixMatcher),
109 new BasicMaxAgeHandler(),
110 new BasicSecureHandler(),
111 new BasicCommentHandler());
112 final NetscapeDraftSpecec.html#NetscapeDraftSpec">NetscapeDraftSpec netscapeDraft = new NetscapeDraftSpec(
113 PublicSuffixDomainFilter.decorate(
114 new BasicDomainHandler(), this.publicSuffixMatcher),
115 this.compatibilityLevel == CompatibilityLevel.IE_MEDIUM_SECURITY ?
116 new BasicPathHandler() {
117 @Override
118 public void validate(
119 final Cookie cookie,
120 final CookieOrigin origin) throws MalformedCookieException {
121
122 }
123 } : new BasicPathHandler(),
124 new BasicSecureHandler(),
125 new BasicCommentHandler(),
126 new BasicExpiresHandler(this.datepatterns != null ? this.datepatterns.clone() :
127 new String[]{NetscapeDraftSpec.EXPIRES_PATTERN}));
128 this.cookieSpec = new DefaultCookieSpec(strict, obsoleteStrict, netscapeDraft);
129 }
130 }
131 }
132 return this.cookieSpec;
133 }
134
135 }