From 63eec85627bcd3c584865d47a237de44bcdb8b98 Mon Sep 17 00:00:00 2001 From: 杨宇千 Date: Tue, 20 Aug 2019 23:41:36 +0800 Subject: Use etag for cache. --- Timeline/Controllers/UserAvatarController.cs | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) (limited to 'Timeline/Controllers/UserAvatarController.cs') 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 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) { -- cgit v1.2.3