aboutsummaryrefslogtreecommitdiff
path: root/BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-02-12 22:39:57 +0800
committerGitHub <noreply@github.com>2021-02-12 22:39:57 +0800
commitc3d0a5f88de0fbdf6bc584548832017087ab1248 (patch)
treec1c992987263897fb1c091c5129c6d1f1e64073d /BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs
parente232e31de839dc0c0de691c5856f29dcb92cf0fc (diff)
parent5849d34d9fcf1ccfb7fe5cc0842765129f7198b4 (diff)
downloadtimeline-c3d0a5f88de0fbdf6bc584548832017087ab1248.tar.gz
timeline-c3d0a5f88de0fbdf6bc584548832017087ab1248.tar.bz2
timeline-c3d0a5f88de0fbdf6bc584548832017087ab1248.zip
Merge pull request #267 from crupest/backend
春节大换血 Spring festival big change.
Diffstat (limited to 'BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs')
-rw-r--r--BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs86
1 files changed, 86 insertions, 0 deletions
diff --git a/BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs b/BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs
new file mode 100644
index 00000000..49f8221a
--- /dev/null
+++ b/BackEnd/Timeline/Formatters/ByteDataInputFormatter.cs
@@ -0,0 +1,86 @@
+using Microsoft.AspNetCore.Mvc.Formatters;
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Threading.Tasks;
+using Timeline.Models;
+
+namespace Timeline.Formatters
+{
+ /// <summary>
+ /// Formatter that reads body as byte data.
+ /// </summary>
+ public class ByteDataInputFormatter : InputFormatter
+ {
+ /// <summary>
+ ///
+ /// </summary>
+ public ByteDataInputFormatter()
+ {
+ SupportedMediaTypes.Add(MimeTypes.ImagePng);
+ SupportedMediaTypes.Add(MimeTypes.ImageJpeg);
+ SupportedMediaTypes.Add(MimeTypes.ImageGif);
+ SupportedMediaTypes.Add(MimeTypes.ImageWebp);
+ SupportedMediaTypes.Add(MimeTypes.TextPlain);
+ SupportedMediaTypes.Add(MimeTypes.TextMarkdown);
+ }
+
+ /// <inheritdoc/>
+ public override bool CanRead(InputFormatterContext context)
+ {
+ if (context == null) throw new ArgumentNullException(nameof(context));
+
+ if (context.ModelType == typeof(ByteData))
+ return true;
+
+ return false;
+ }
+
+ /// <inheritdoc/>
+ public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context)
+ {
+ var request = context.HttpContext.Request;
+ var contentLength = request.ContentLength;
+
+ var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<ByteDataInputFormatter>>();
+
+ if (request.ContentType is null)
+ {
+ logger.LogInformation("Failed to read body as bytes. Content-Type is not set.");
+ return await InputFormatterResult.FailureAsync();
+ }
+
+ if (contentLength == null)
+ {
+ logger.LogInformation("Failed to read body as bytes. Content-Length is not set.");
+ return await InputFormatterResult.FailureAsync();
+ }
+
+ if (contentLength == 0)
+ {
+ logger.LogInformation("Failed to read body as bytes. Content-Length is 0.");
+ return await InputFormatterResult.FailureAsync();
+ }
+
+ var bodyStream = request.Body;
+
+ var data = new byte[contentLength.Value];
+ var bytesRead = await bodyStream.ReadAsync(data);
+
+ if (bytesRead != contentLength)
+ {
+ logger.LogInformation("Failed to read body as bytes. Actual length of body is smaller than Content-Length.");
+ return await InputFormatterResult.FailureAsync();
+ }
+
+ var extraByte = new byte[1];
+ if (await bodyStream.ReadAsync(extraByte) != 0)
+ {
+ logger.LogInformation("Failed to read body as bytes. Actual length of body is greater than Content-Length.");
+ return await InputFormatterResult.FailureAsync();
+ }
+
+ return await InputFormatterResult.SuccessAsync(new ByteData(data, request.ContentType));
+ }
+ }
+}