8 changed files with 136 additions and 99 deletions
@ -0,0 +1,51 @@
@@ -0,0 +1,51 @@
|
||||
/* |
||||
* Copyright 2002-2025 the original author or authors. |
||||
* |
||||
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
* you may not use this file except in compliance with the License. |
||||
* You may obtain a copy of the License at |
||||
* |
||||
* https://www.apache.org/licenses/LICENSE-2.0
|
||||
* |
||||
* Unless required by applicable law or agreed to in writing, software |
||||
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
* See the License for the specific language governing permissions and |
||||
* limitations under the License. |
||||
*/ |
||||
|
||||
package org.springframework.http.client.reactive; |
||||
|
||||
import java.util.ArrayList; |
||||
import java.util.List; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
|
||||
import org.springframework.http.ResponseCookie; |
||||
|
||||
|
||||
/** |
||||
* Parser that delegates to {@link java.net.HttpCookie#parse(String)} for parsing, |
||||
* but also extracts and sets {@code sameSite}. |
||||
* |
||||
* @author Rossen Stoyanchev |
||||
* @since 7.0 |
||||
*/ |
||||
final class JdkResponseCookieParser implements ResponseCookie.Parser { |
||||
|
||||
private static final Pattern SAME_SITE_PATTERN = Pattern.compile("(?i).*SameSite=(Strict|Lax|None).*"); |
||||
|
||||
|
||||
/** |
||||
* Parse the given headers. |
||||
*/ |
||||
public List<ResponseCookie> parse(String header) { |
||||
Matcher matcher = SAME_SITE_PATTERN.matcher(header); |
||||
String sameSite = (matcher.matches() ? matcher.group(1) : null); |
||||
List<java.net.HttpCookie> cookies = java.net.HttpCookie.parse(header); |
||||
List<ResponseCookie> result = new ArrayList<>(cookies.size()); |
||||
cookies.forEach(cookie -> result.add(ResponseCookie.from(cookie).sameSite(sameSite).build())); |
||||
return result; |
||||
} |
||||
|
||||
} |
||||
@ -1,33 +0,0 @@
@@ -1,33 +0,0 @@
|
||||
package org.springframework.http.support; |
||||
|
||||
import org.springframework.http.ResponseCookie; |
||||
|
||||
import java.net.HttpCookie; |
||||
import java.util.regex.Matcher; |
||||
import java.util.regex.Pattern; |
||||
import java.util.stream.Stream; |
||||
|
||||
import org.jspecify.annotations.Nullable; |
||||
|
||||
public final class DefaultHttpCookieParser implements HttpCookieParser { |
||||
|
||||
private static final Pattern SAME_SITE_PATTERN = Pattern.compile("(?i).*SameSite=(Strict|Lax|None).*"); |
||||
|
||||
@Override |
||||
public Stream<ResponseCookie> parse(String header) { |
||||
Matcher matcher = SAME_SITE_PATTERN.matcher(header); |
||||
String sameSite = (matcher.matches() ? matcher.group(1) : null); |
||||
return HttpCookie.parse(header).stream().map(cookie -> toResponseCookie(cookie, sameSite)); |
||||
} |
||||
|
||||
private static ResponseCookie toResponseCookie(HttpCookie cookie, @Nullable String sameSite) { |
||||
return ResponseCookie.from(cookie.getName(), cookie.getValue()) |
||||
.domain(cookie.getDomain()) |
||||
.httpOnly(cookie.isHttpOnly()) |
||||
.maxAge(cookie.getMaxAge()) |
||||
.path(cookie.getPath()) |
||||
.secure(cookie.getSecure()) |
||||
.sameSite(sameSite) |
||||
.build(); |
||||
} |
||||
} |
||||
@ -1,10 +0,0 @@
@@ -1,10 +0,0 @@
|
||||
package org.springframework.http.support; |
||||
|
||||
import org.springframework.http.ResponseCookie; |
||||
|
||||
import java.util.stream.Stream; |
||||
|
||||
public interface HttpCookieParser { |
||||
|
||||
Stream<ResponseCookie> parse(String header); |
||||
} |
||||
Loading…
Reference in new issue