aboutsummaryrefslogtreecommitdiff
path: root/Timeline/Controllers
diff options
context:
space:
mode:
author杨宇千 <crupest@outlook.com>2019-08-20 23:57:47 +0800
committerGitHub <noreply@github.com>2019-08-20 23:57:47 +0800
commita585c6e35829e9f2b4b0b8ce8c6b395e5ea84f2c (patch)
tree3d20f696dd097b86eeba497baf8dc1baf966626c /Timeline/Controllers
parent4af6c82f34dd79d7a1ca348f167e01570951e3ad (diff)
parentf657105462b7a8c528b39005d81ffe6141f476a5 (diff)
downloadtimeline-a585c6e35829e9f2b4b0b8ce8c6b395e5ea84f2c.tar.gz
timeline-a585c6e35829e9f2b4b0b8ce8c6b395e5ea84f2c.tar.bz2
timeline-a585c6e35829e9f2b4b0b8ce8c6b395e5ea84f2c.zip
Merge pull request #47 from crupest/avatar-enhance
Use etag for avatar cache.
Diffstat (limited to 'Timeline/Controllers')
-rw-r--r--Timeline/Controllers/UserAvatarController.cs23
1 files changed, 13 insertions, 10 deletions
diff --git a/Timeline/Controllers/UserAvatarController.cs b/Timeline/Controllers/UserAvatarController.cs
index ffadcb86..964c9b98 100644
--- a/Timeline/Controllers/UserAvatarController.cs
+++ b/Timeline/Controllers/UserAvatarController.cs
@@ -2,7 +2,9 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
+using Microsoft.Net.Http.Headers;
using System;
+using System.Linq;
using System.Threading.Tasks;
using Timeline.Authenticate;
using Timeline.Filters;
@@ -61,22 +63,23 @@ namespace Timeline.Controllers
[Authorize]
public async Task<IActionResult> Get([FromRoute] string username)
{
- const string IfModifiedSinceHeaderKey = "If-Modified-Since";
+ const string IfNonMatchHeaderKey = "If-None-Match";
try
{
- var avatarInfo = await _service.GetAvatar(username);
- var avatar = avatarInfo.Avatar;
- if (Request.Headers.TryGetValue(IfModifiedSinceHeaderKey, out var value))
+ var eTag = new EntityTagHeaderValue($"\"{await _service.GetAvatarETag(username)}\"");
+
+ if (Request.Headers.TryGetValue(IfNonMatchHeaderKey, out var value))
{
- var t = DateTime.Parse(value);
- if (t > avatarInfo.LastModified)
- {
- Response.Headers.Add(IfModifiedSinceHeaderKey, avatarInfo.LastModified.ToString("r"));
+ if (!EntityTagHeaderValue.TryParseStrictList(value, out var eTagList))
+ return BadRequest(CommonResponse.BadIfNonMatch());
+
+ if (eTagList.First(e => e.Equals(eTag)) != null)
return StatusCode(StatusCodes.Status304NotModified);
- }
}
- return File(avatar.Data, avatar.Type, new DateTimeOffset(avatarInfo.LastModified), null);
+ var avatarInfo = await _service.GetAvatar(username);
+ var avatar = avatarInfo.Avatar;
+ return File(avatar.Data, avatar.Type, new DateTimeOffset(avatarInfo.LastModified), eTag);
}
catch (UserNotExistException e)
{