BaseSerializationHandler.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. using System;
  2. using System.IO;
  3. using System.Threading.Tasks;
  4. using MediaBrowser.Common.Serialization;
  5. namespace MediaBrowser.Common.Net.Handlers
  6. {
  7. public abstract class BaseSerializationHandler<T> : BaseHandler
  8. {
  9. public SerializationFormat SerializationFormat
  10. {
  11. get
  12. {
  13. string format = QueryString["dataformat"];
  14. if (string.IsNullOrEmpty(format))
  15. {
  16. return SerializationFormat.Json;
  17. }
  18. return (SerializationFormat)Enum.Parse(typeof(SerializationFormat), format, true);
  19. }
  20. }
  21. public override Task<string> GetContentType()
  22. {
  23. switch (SerializationFormat)
  24. {
  25. case SerializationFormat.Jsv:
  26. return Task.FromResult("text/plain");
  27. case SerializationFormat.Protobuf:
  28. return Task.FromResult("application/x-protobuf");
  29. default:
  30. return Task.FromResult(MimeTypes.JsonMimeType);
  31. }
  32. }
  33. private bool _ObjectToSerializeEnsured;
  34. private T _ObjectToSerialize;
  35. private async Task EnsureObjectToSerialize()
  36. {
  37. if (!_ObjectToSerializeEnsured)
  38. {
  39. _ObjectToSerialize = await GetObjectToSerialize().ConfigureAwait(false);
  40. if (_ObjectToSerialize == null)
  41. {
  42. StatusCode = 404;
  43. }
  44. _ObjectToSerializeEnsured = true;
  45. }
  46. }
  47. protected abstract Task<T> GetObjectToSerialize();
  48. protected override Task PrepareResponse()
  49. {
  50. return EnsureObjectToSerialize();
  51. }
  52. protected async override Task WriteResponseToOutputStream(Stream stream)
  53. {
  54. await EnsureObjectToSerialize().ConfigureAwait(false);
  55. switch (SerializationFormat)
  56. {
  57. case SerializationFormat.Jsv:
  58. JsvSerializer.SerializeToStream(_ObjectToSerialize, stream);
  59. break;
  60. case SerializationFormat.Protobuf:
  61. ProtobufSerializer.SerializeToStream(_ObjectToSerialize, stream);
  62. break;
  63. default:
  64. JsonSerializer.SerializeToStream(_ObjectToSerialize, stream);
  65. break;
  66. }
  67. }
  68. }
  69. public enum SerializationFormat
  70. {
  71. Json,
  72. Jsv,
  73. Protobuf
  74. }
  75. }