1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 package org.htmlunit.httpclient;
16
17 import java.net.MalformedURLException;
18 import java.net.URL;
19 import java.util.ArrayList;
20 import java.util.Collection;
21 import java.util.List;
22 import java.util.Set;
23
24 import org.apache.http.cookie.ClientCookie;
25 import org.apache.http.cookie.Cookie;
26 import org.apache.http.cookie.CookieOrigin;
27 import org.apache.http.cookie.CookieSpec;
28 import org.apache.http.cookie.MalformedCookieException;
29 import org.apache.http.impl.cookie.BasicClientCookie;
30 import org.apache.http.message.BufferedHeader;
31 import org.apache.http.util.CharArrayBuffer;
32 import org.htmlunit.BrowserVersion;
33 import org.htmlunit.util.UrlUtils;
34
35
36
37
38
39
40 public final class HttpClientConverter {
41
42 private HttpClientConverter() {
43
44 }
45
46
47
48
49
50
51 public static CookieOrigin buildCookieOrigin(final URL url) {
52 final URL normalizedUrl = replaceForCookieIfNecessary(url);
53
54 int port = normalizedUrl.getPort();
55 if (port == -1) {
56 port = normalizedUrl.getDefaultPort();
57 }
58
59 return new CookieOrigin(
60 normalizedUrl.getHost(),
61 port,
62 normalizedUrl.getPath(),
63 "https".equals(normalizedUrl.getProtocol()));
64 }
65
66
67
68
69
70
71
72
73
74 public static URL replaceForCookieIfNecessary(URL url) {
75 final String protocol = url.getProtocol();
76 final boolean file = "file".equals(protocol);
77 if (file) {
78 try {
79 url = UrlUtils.getUrlWithNewHostAndPort(url,
80 HtmlUnitBrowserCompatCookieSpec.LOCAL_FILESYSTEM_DOMAIN, 0);
81 }
82 catch (final MalformedURLException e) {
83 throw new RuntimeException(e);
84 }
85 }
86 return url;
87 }
88
89
90
91
92
93
94
95
96
97
98 public static List<org.htmlunit.http.Cookie> parseCookie(final String cookieString, final URL pageUrl,
99 final BrowserVersion browserVersion)
100 throws MalformedCookieException {
101 final CharArrayBuffer buffer = new CharArrayBuffer(cookieString.length() + 22);
102 buffer.append("Set-Cookie: ");
103 buffer.append(cookieString);
104
105 final CookieSpec cookieSpec = new HtmlUnitBrowserCompatCookieSpec(browserVersion);
106 final List<Cookie> cookies = cookieSpec.parse(new BufferedHeader(buffer), buildCookieOrigin(pageUrl));
107
108 final List<org.htmlunit.http.Cookie> htmlUnitCookies = new ArrayList<>(cookies.size());
109 for (final Cookie cookie : cookies) {
110 final org.htmlunit.http.Cookie htmlUnitCookie = new HttpClientCookie((ClientCookie) cookie);
111 htmlUnitCookies.add(htmlUnitCookie);
112 }
113 return htmlUnitCookies;
114 }
115
116
117
118
119
120
121 public static List<Cookie> toHttpClient(final Collection<org.htmlunit.http.Cookie> cookies) {
122 final ArrayList<Cookie> array = new ArrayList<>(cookies.size());
123 for (final org.htmlunit.http.Cookie cookie : cookies) {
124 array.add(toHttpClient(cookie));
125 }
126 return array;
127 }
128
129
130
131
132
133
134
135
136 public static void addMatching(final Set<org.htmlunit.http.Cookie> cookies,
137 final URL normalizedUrl, final BrowserVersion browserVersion,
138 final Set<org.htmlunit.http.Cookie> matches) {
139 if (!cookies.isEmpty()) {
140 final CookieOrigin cookieOrigin = HttpClientConverter.buildCookieOrigin(normalizedUrl);
141 final CookieSpec cookieSpec = new HtmlUnitBrowserCompatCookieSpec(browserVersion);
142 for (final org.htmlunit.http.Cookie cookie : cookies) {
143 if (cookieSpec.match(toHttpClient(cookie), cookieOrigin)) {
144 matches.add(cookie);
145 }
146 }
147 }
148 }
149
150 private static ClientCookie toHttpClient(final org.htmlunit.http.Cookie cookie) {
151 if (cookie instanceof HttpClientCookie) {
152 return ((HttpClientCookie) cookie).getHttpClientCookie();
153 }
154
155 final BasicClientCookie httpClientCookie = new BasicClientCookie(cookie.getName(),
156 cookie.getValue() == null ? "" : cookie.getValue());
157
158 httpClientCookie.setDomain(cookie.getDomain());
159
160 httpClientCookie.setAttribute(ClientCookie.DOMAIN_ATTR, cookie.getDomain());
161
162 httpClientCookie.setPath(cookie.getPath());
163 httpClientCookie.setExpiryDate(cookie.getExpires());
164
165 httpClientCookie.setSecure(cookie.isSecure());
166 if (cookie.isHttpOnly()) {
167 httpClientCookie.setAttribute("httponly", "true");
168 }
169
170 if (cookie.getSameSite() != null) {
171 httpClientCookie.setAttribute("samesite", cookie.getSameSite());
172 }
173
174 return httpClientCookie;
175 }
176 }