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.hc.client5.http.impl.cookie;
29
30 import java.util.concurrent.locks.ReentrantLock;
31
32 import org.apache.hc.client5.http.cookie.Cookie;
33 import org.apache.hc.client5.http.cookie.CookieOrigin;
34 import org.apache.hc.client5.http.cookie.CookieSpec;
35 import org.apache.hc.client5.http.cookie.CookieSpecFactory;
36 import org.apache.hc.client5.http.cookie.MalformedCookieException;
37 import org.apache.hc.client5.http.psl.PublicSuffixMatcher;
38 import org.apache.hc.client5.http.utils.DateUtils;
39 import org.apache.hc.core5.annotation.Contract;
40 import org.apache.hc.core5.annotation.ThreadingBehavior;
41 import org.apache.hc.core5.http.protocol.HttpContext;
42
43
44
45
46
47
48
49
50 @Contract(threading = ThreadingBehavior.SAFE)
51 public class RFC6265CookieSpecFactory implements CookieSpecFactory {
52
53 private final ReentrantLock lock;
54
55 public enum CompatibilityLevel {
56 STRICT,
57 RELAXED,
58 IE_MEDIUM_SECURITY
59 }
60
61 private final CompatibilityLevel compatibilityLevel;
62 private final PublicSuffixMatcher publicSuffixMatcher;
63
64 private volatile CookieSpec cookieSpec;
65
66 public RFC6265CookieSpecFactory(
67 final CompatibilityLevel compatibilityLevel,
68 final PublicSuffixMatcher publicSuffixMatcher) {
69 super();
70 this.compatibilityLevel = compatibilityLevel != null ? compatibilityLevel : CompatibilityLevel.RELAXED;
71 this.publicSuffixMatcher = publicSuffixMatcher;
72 this.lock = new ReentrantLock();
73 }
74
75 public RFC6265CookieSpecFactory(final PublicSuffixMatcher publicSuffixMatcher) {
76 this(CompatibilityLevel.RELAXED, publicSuffixMatcher);
77 }
78
79 public RFC6265CookieSpecFactory() {
80 this(CompatibilityLevel.RELAXED, null);
81 }
82
83 @Override
84 public CookieSpec create(final HttpContext context) {
85 if (cookieSpec == null) {
86 lock.lock();
87 try {
88 if (cookieSpec == null) {
89 switch (this.compatibilityLevel) {
90 case STRICT:
91 this.cookieSpec = new RFC6265StrictSpec(
92 BasicPathHandler.INSTANCE,
93 PublicSuffixDomainFilter.decorate(
94 BasicDomainHandler.INSTANCE, this.publicSuffixMatcher),
95 BasicMaxAgeHandler.INSTANCE,
96 BasicSecureHandler.INSTANCE,
97 BasicHttpOnlyHandler.INSTANCE,
98 new BasicExpiresHandler(DateUtils.STANDARD_PATTERNS));
99 break;
100 case IE_MEDIUM_SECURITY:
101 this.cookieSpec = new RFC6265LaxSpec(
102 new BasicPathHandler() {
103 @Override
104 public void validate(
105 final Cookie cookie,
106 final CookieOrigin origin) throws MalformedCookieException {
107
108 }
109 },
110 PublicSuffixDomainFilter.decorate(
111 BasicDomainHandler.INSTANCE, this.publicSuffixMatcher),
112 BasicMaxAgeHandler.INSTANCE,
113 BasicSecureHandler.INSTANCE,
114 BasicHttpOnlyHandler.INSTANCE,
115 new BasicExpiresHandler(DateUtils.STANDARD_PATTERNS));
116 break;
117 default:
118 this.cookieSpec = new RFC6265LaxSpec(
119 BasicPathHandler.INSTANCE,
120 PublicSuffixDomainFilter.decorate(
121 BasicDomainHandler.INSTANCE, this.publicSuffixMatcher),
122 LaxMaxAgeHandler.INSTANCE,
123 BasicSecureHandler.INSTANCE,
124 LaxExpiresHandler.INSTANCE);
125 }
126 }
127 } finally {
128 lock.unlock();
129 }
130 }
131 return this.cookieSpec;
132 }
133
134 }