Skip to content

Commit ef74d93

Browse files
committed
完善CookieAuthorizationHandler
1 parent 4a9893e commit ef74d93

File tree

3 files changed

+64
-7
lines changed

3 files changed

+64
-7
lines changed

WebApiClientCore/HttpMessageHandlers/CookieAuthorizationHandler.cs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using System.Net.Http;
1+
using System;
2+
using System.Net.Http;
23
using System.Threading;
34
using System.Threading.Tasks;
45

@@ -20,15 +21,47 @@ protected sealed override async Task SetAuthorizationAsync(SetReason reason, Htt
2021
{
2122
if (reason == SetReason.ForResend)
2223
{
23-
await this.RefreshCookieAsync().ConfigureAwait(false);
24+
var handler = this.GetHttpClientHandler(this.InnerHandler);
25+
if (handler.UseCookies == false)
26+
{
27+
throw new NotSupportedException(Resx.unsupported_NoUseCookies);
28+
}
29+
30+
var response = await this.RefreshCookieAsync().ConfigureAwait(false);
31+
if (response.Headers.TryGetValues("Set-Cookie", out var cookies) == true)
32+
{
33+
foreach (var cookie in cookies)
34+
{
35+
handler.CookieContainer.SetCookies(request.RequestUri, cookie);
36+
}
37+
}
2438
}
2539
}
2640

2741
/// <summary>
28-
/// 刷新CookieContainer的cookie
29-
/// 一般情况下,登录操作就得到最新的cookie,且自动覆盖到CookieContainer
42+
/// 获取内部的HttpClientHandler
3043
/// </summary>
44+
/// <param name="handler"></param>
3145
/// <returns></returns>
32-
protected abstract Task RefreshCookieAsync();
46+
private HttpClientHandler GetHttpClientHandler(HttpMessageHandler handler)
47+
{
48+
if (handler is DelegatingHandler delegatingHandler)
49+
{
50+
return this.GetHttpClientHandler(delegatingHandler.InnerHandler);
51+
}
52+
53+
if (handler is HttpClientHandler clientHandler)
54+
{
55+
return clientHandler;
56+
}
57+
58+
throw new NotSupportedException(Resx.unsupported_HttpMessageHandler);
59+
}
60+
61+
/// <summary>
62+
/// 登录并刷新Cookie
63+
/// </summary>
64+
/// <returns>返回登录响应消息</returns>
65+
protected abstract Task<HttpResponseMessage> RefreshCookieAsync();
3366
}
3467
}

WebApiClientCore/Resx.Designer.cs

Lines changed: 20 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

WebApiClientCore/Resx.resx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,12 @@
192192
<data name="unsupported_HttpContent" xml:space="preserve">
193193
<value>{0}方法不支持使用{1}</value>
194194
</data>
195+
<data name="unsupported_HttpMessageHandler" xml:space="preserve">
196+
<value>HttpMessageHandler必须是DelegatingHandler或者HttpClientHandler</value>
197+
</data>
198+
<data name="unsupported_NoUseCookies" xml:space="preserve">
199+
<value>HttpClientHandler必须开启UseCookies</value>
200+
</data>
195201
<data name="unsupported_Property" xml:space="preserve">
196202
<value>不支持属性访问器: {0}</value>
197203
</data>

0 commit comments

Comments
 (0)