Skip to content

Commit 4f1a068

Browse files
committed
[fit] resolve review comments
- Add notes for deprecated fields `comment` and `version` - Split long Set-Cookie parsing method into smaller parts - Remove unnecessary variable `header1`
1 parent 3b9ca54 commit 4f1a068

File tree

4 files changed

+78
-62
lines changed

4 files changed

+78
-62
lines changed

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/Cookie.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,11 @@ interface Builder {
117117

118118
/**
119119
* 向当前构建器中设置 Cookie 的版本。
120+
* <p>
121+
* 此属性源自 <a href="https://datatracker.ietf.org/doc/html/rfc2965">RFC 2965</a>,
122+
* 但已在 <a href="https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.2">RFC 6265</a>
123+
* 中移出标准定义。现代浏览器会忽略该属性。
124+
* </p>
120125
*
121126
* @param version 表示待设置的 Cookie 版本的 {@code int}。
122127
* @return 表示当前构建器的 {@link Builder}。
@@ -126,6 +131,11 @@ interface Builder {
126131

127132
/**
128133
* 向当前构建器中设置 Cookie 的注释。
134+
* <p>
135+
* 此属性源自 <a href="https://datatracker.ietf.org/doc/html/rfc2965">RFC 2965</a>,
136+
* 但已在 <a href="https://datatracker.ietf.org/doc/html/rfc6265#section-4.1.2">RFC 6265</a>
137+
* 中移出标准定义。现代浏览器会忽略该属性。
138+
* </p>
129139
*
130140
* @param comment 表示待设置的 Cookie 注释的 {@link String}。
131141
* @return 表示当前构建器的 {@link Builder}。
@@ -175,6 +185,11 @@ interface Builder {
175185

176186
/**
177187
* 向当前构建器中设置 Cookie 限制跨站请求时发送行为安全级别。
188+
* <p>
189+
* 该属性定义于 <a href="https://datatracker.ietf.org/doc/html/draft-ietf-httpbis-rfc6265bis#section-4.1.2.7">
190+
* RFC 6265bis 草案第 4.1.2.7 节</a>,用于控制跨站请求时是否发送 Cookie。
191+
* 尽管该规范尚处于草案阶段,但已被主流浏览器(如 Chrome、Firefox、Safari、Edge)广泛支持。
192+
* </p>
178193
*
179194
* @param sameSite SameSite 值,如 "Strict", "Lax", "None"。
180195
* @return 表示当前构建器的 {@link Builder}。

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/support/AbstractHttpClassicResponse.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@ public abstract class AbstractHttpClassicResponse extends AbstractHttpMessage im
3939
public AbstractHttpClassicResponse(HttpResource httpResource, StatusLine startLine, MessageHeaders headers) {
4040
super(httpResource, startLine, headers);
4141
this.startLine = notNull(startLine, "The status line cannot be null.");
42-
MessageHeaders headers1 = notNull(headers, "The headers cannot be null.");
43-
List<String> actualCookies = headers1.all(SET_COOKIE);
42+
notNull(headers, "The headers cannot be null.");
43+
List<String> actualCookies = headers.all(SET_COOKIE);
4444
this.cookies = ConfigurableCookieCollection.create();
4545
actualCookies.stream().map(HttpUtils::parseSetCookie).forEach(cookies::add);
4646
}

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/support/DefaultCookieCollection.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ public void add(Cookie cookie) {
9090
if (cookie == null || StringUtils.isBlank(cookie.name())) {
9191
return;
9292
}
93-
if (!HttpUtils.isValidCookiePair(cookie.name(), cookie.value())) {
93+
if (HttpUtils.isInvalidCookiePair(cookie.name(), cookie.value())) {
9494
throw new IllegalArgumentException("Invalid cookie: name or value is not allowed");
9595
}
9696
store.computeIfAbsent(cookie.name(), k -> new ArrayList<>());

framework/fit/java/fit-builtin/services/fit-http-classic/definition/src/main/java/modelengine/fit/http/util/HttpUtils.java

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -116,50 +116,13 @@ public static Cookie parseSetCookie(String rawCookie) {
116116
return Cookie.builder().build();
117117
}
118118

119-
Cookie.Builder builder = Cookie.builder();
120-
121-
String[] parts = rawCookie.split(COOKIES_PARSE_SEPARATOR);
122-
String[] nameValue = parts[0].split(COOKIE_PAIR_SEPARATOR, 2);
123-
124-
String name = nameValue[0].trim();
125-
String value = nameValue.length > 1 ? nameValue[1].trim() : StringUtils.EMPTY;
126-
127-
if (isValueSurrounded(value)) {
128-
value = value.substring(1, value.length() - 1);
129-
}
130-
if (!isValidCookiePair(name, value)) {
119+
var parts = rawCookie.split(COOKIES_PARSE_SEPARATOR);
120+
var builder = parseCookieNameValue(parts[0]);
121+
if (builder == null) {
131122
return Cookie.builder().build();
132123
}
133124

134-
builder.name(name);
135-
builder.value(value);
136-
137-
for (int i = 1; i < parts.length; i++) {
138-
String part = parts[i].trim();
139-
if (part.isEmpty()) {
140-
continue;
141-
}
142-
143-
String[] kv = part.split(COOKIE_PAIR_SEPARATOR, 2);
144-
String key = kv[0].trim().toLowerCase(Locale.ROOT);
145-
String val = kv.length > 1 ? kv[1].trim() : StringUtils.EMPTY;
146-
147-
if (PATH_KEY.equals(key)) {
148-
builder.path(val);
149-
} else if (DOMAIN_KEY.equals(key)) {
150-
builder.domain(val);
151-
} else if (MAX_AGE_KEY.equals(key)) {
152-
builder.maxAge(safeParseInt(val));
153-
} else if (EXPIRES_KEY.equals(key)) {
154-
builder.maxAge(convertExpiresToMaxAge(val));
155-
} else if (SECURE_KEY.equals(key)) {
156-
builder.secure(true);
157-
} else if (HTTP_ONLY_KEY.equals(key)) {
158-
builder.httpOnly(true);
159-
} else if (SAME_SITE_KEY.equals(key)) {
160-
builder.sameSite(val);
161-
}
162-
}
125+
parseCookieAttributes(parts, builder);
163126
return builder.build();
164127
}
165128

@@ -204,27 +167,65 @@ public static List<Cookie> parseCookies(String rawCookie) {
204167
}
205168

206169
List<Cookie> cookies = new ArrayList<>();
207-
for (String pair : rawCookie.split(COOKIES_PARSE_SEPARATOR)) {
208-
String trimmed = pair.trim();
209-
if (trimmed.isEmpty()) {
210-
continue;
170+
for (String part : rawCookie.split(COOKIES_PARSE_SEPARATOR)) {
171+
Cookie.Builder builder = parseCookieNameValue(part.trim());
172+
if (builder != null) {
173+
cookies.add(builder.build());
211174
}
175+
}
176+
return cookies;
177+
}
178+
179+
private static Cookie.Builder parseCookieNameValue(String part) {
180+
String trimmed = part.trim();
181+
if (trimmed.isEmpty()) {
182+
return null;
183+
}
184+
185+
int eqIndex = trimmed.indexOf(COOKIE_PAIR_SEPARATOR);
186+
if (eqIndex <= 0) {
187+
return null;
188+
}
189+
190+
String name = trimmed.substring(0, eqIndex).trim();
191+
String value = trimmed.substring(eqIndex + 1).trim();
192+
if (isValueSurrounded(value)) {
193+
value = value.substring(1, value.length() - 1);
194+
}
195+
196+
if (isInvalidCookiePair(name, value)) {
197+
return null;
198+
}
199+
return Cookie.builder().name(name).value(value);
200+
}
212201

213-
int eqIndex = trimmed.indexOf(COOKIE_PAIR_SEPARATOR);
214-
if (eqIndex <= 0) {
202+
private static void parseCookieAttributes(String[] parts, Cookie.Builder builder) {
203+
for (int i = 1; i < parts.length; i++) {
204+
var part = parts[i].trim();
205+
if (part.isEmpty()) {
215206
continue;
216207
}
217208

218-
String name = trimmed.substring(0, eqIndex).trim();
219-
String value = trimmed.substring(eqIndex + 1).trim();
220-
if (isValueSurrounded(value)) {
221-
value = value.substring(1, value.length() - 1);
222-
}
223-
if (isValidCookiePair(name, value)) {
224-
cookies.add(Cookie.builder().name(name).value(value).build());
209+
var kv = part.split(COOKIE_PAIR_SEPARATOR, 2);
210+
var key = kv[0].trim().toLowerCase(Locale.ROOT);
211+
var val = kv.length > 1 ? kv[1].trim() : StringUtils.EMPTY;
212+
213+
if (PATH_KEY.equals(key)) {
214+
builder.path(val);
215+
} else if (DOMAIN_KEY.equals(key)) {
216+
builder.domain(val);
217+
} else if (MAX_AGE_KEY.equals(key)) {
218+
builder.maxAge(safeParseInt(val));
219+
} else if (EXPIRES_KEY.equals(key)) {
220+
builder.maxAge(convertExpiresToMaxAge(val));
221+
} else if (SECURE_KEY.equals(key)) {
222+
builder.secure(true);
223+
} else if (HTTP_ONLY_KEY.equals(key)) {
224+
builder.httpOnly(true);
225+
} else if (SAME_SITE_KEY.equals(key)) {
226+
builder.sameSite(val);
225227
}
226228
}
227-
return cookies;
228229
}
229230

230231
/**
@@ -234,17 +235,17 @@ public static List<Cookie> parseCookies(String rawCookie) {
234235
* @param value 表示 Cookie 的值 {@link String},允许为空但不允许为 {@code null},可带双引号。
235236
* @return 如果 name 和 value 都合法返回 {@code true},否则返回 {@code false}。
236237
*/
237-
public static boolean isValidCookiePair(String name, String value) {
238+
public static boolean isInvalidCookiePair(String name, String value) {
238239
if (name == null || name.isEmpty() || !TOKEN_PATTERN.matcher(name).matches()) {
239-
return false;
240+
return true;
240241
}
241242
if (value == null) {
242-
return false;
243+
return true;
243244
}
244245
if (isValueSurrounded(value)) {
245246
value = value.substring(1, value.length() - 1);
246247
}
247-
return value.isEmpty() || TOKEN_PATTERN.matcher(value).matches();
248+
return !value.isEmpty() && !TOKEN_PATTERN.matcher(value).matches();
248249
}
249250

250251
/**

0 commit comments

Comments
 (0)