为什么 http 组件 HttpClient 会从 Cookie 值中删除引号?

Why does http components HttpClient remove quotes from Cookie values?

我有一个应用程序使用 https://mvnrepository.com/artifact/org.apache.httpcomponents/httpcore 4.4.7 进行休息 api 调用。

我有一种情况要针对安全 Web 应用程序进行 API:

HTTP GET 请求 1:https://myapp.com/api/myrestrequest

它发现我缺少一个 JESSIONID cookie,所以它通过 302 将我发送到另一个页面以获取一个:

302 GET 请求 2:https://myapp.com/sso/dologin?referer=/api/myrestrequest

此页面读取我的 SSO 会话 cookie,然后将我发送回原始请求:

HTTP GET 请求 3:https://myapp.com/api/myrestrequest

很简单,很正常。但是在 GET 请求 2 期间,创建了一个特殊的 cookie,如下所示:

J-Login-Cookie="a8966ab6c6d65a7d6a"

但是当 HTTP 客户端将这个 cookie 保存到 cookie 存储时,它是这样保存的:

J-Login-Cookie=a8966ab6c6d65a7d6a

它删除了引号。

这是为什么?我必须使用 HttpRequestInterceptor 将我的引号添加回 cookie 值,以便请求 3 不会失败。有什么方法可以让它停止删除那些引号吗?

curl 没有相同的行为。

已从此处的值中删除周围的引号:

https://android.googlesource.com/platform/libcore/+/android-cts-7.0_r1/ojluni/src/main/java/java/net/HttpCookie.java#1110

从外观上看,您可以用撇号将引用的值括起来。在发出重定向请求之前,遍历所有 cookie 以查找 J-Login-Cookie 并将值从 "a8966ab6c6d65a7d6a" 更改为 '"a8966ab6c6d65a7d6a"' 以便仅删除外部撇号。

这与使用拦截器基本相同。您唯一的其他选择是使用不同的 HTTP 客户端库。

相反的行为。

我还发现 an explanation 为什么 Apache HTTP 客户端的行为是正确的(除了 RFC 本身)

HTTP State Management Mechanism RFC

更新:

Apache HTTP 客户端 cookie 的来源parser, and some tests。链接指向 master 分支,可根据需要自由填写以调整分支和提交版本。