ResponseHelper.cs 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Net;
  5. using System.Text;
  6. using System.Threading;
  7. using System.Threading.Tasks;
  8. using Emby.Server.Implementations.HttpServer;
  9. using MediaBrowser.Model.Services;
  10. namespace Emby.Server.Implementations.Services
  11. {
  12. public static class ResponseHelper
  13. {
  14. public static Task WriteToResponse(IResponse response, IRequest request, object result, CancellationToken cancellationToken)
  15. {
  16. if (result == null)
  17. {
  18. if (response.StatusCode == (int)HttpStatusCode.OK)
  19. {
  20. response.StatusCode = (int)HttpStatusCode.NoContent;
  21. }
  22. return Task.CompletedTask;
  23. }
  24. var httpResult = result as IHttpResult;
  25. if (httpResult != null)
  26. {
  27. httpResult.RequestContext = request;
  28. request.ResponseContentType = httpResult.ContentType ?? request.ResponseContentType;
  29. }
  30. var defaultContentType = request.ResponseContentType;
  31. if (httpResult != null)
  32. {
  33. if (httpResult.RequestContext == null)
  34. httpResult.RequestContext = request;
  35. response.StatusCode = httpResult.Status;
  36. response.StatusDescription = httpResult.StatusCode.ToString();
  37. //if (string.IsNullOrEmpty(httpResult.ContentType))
  38. //{
  39. // httpResult.ContentType = defaultContentType;
  40. //}
  41. //response.ContentType = httpResult.ContentType;
  42. }
  43. var responseOptions = result as IHasHeaders;
  44. if (responseOptions != null)
  45. {
  46. foreach (var responseHeaders in responseOptions.Headers)
  47. {
  48. if (string.Equals(responseHeaders.Key, "Content-Length", StringComparison.OrdinalIgnoreCase))
  49. {
  50. continue;
  51. }
  52. response.AddHeader(responseHeaders.Key, responseHeaders.Value);
  53. }
  54. }
  55. //ContentType='text/html' is the default for a HttpResponse
  56. //Do not override if another has been set
  57. if (response.ContentType == null || response.ContentType == "text/html")
  58. {
  59. response.ContentType = defaultContentType;
  60. }
  61. if (response.ContentType == "application/json")
  62. {
  63. response.ContentType += "; charset=utf-8";
  64. }
  65. var asyncStreamWriter = result as IAsyncStreamWriter;
  66. if (asyncStreamWriter != null)
  67. {
  68. return asyncStreamWriter.WriteToAsync(response.OutputStream, cancellationToken);
  69. }
  70. var streamWriter = result as IStreamWriter;
  71. if (streamWriter != null)
  72. {
  73. streamWriter.WriteTo(response.OutputStream);
  74. return Task.CompletedTask;
  75. }
  76. var fileWriter = result as FileWriter;
  77. if (fileWriter != null)
  78. {
  79. return fileWriter.WriteToAsync(response, cancellationToken);
  80. }
  81. var stream = result as Stream;
  82. if (stream != null)
  83. {
  84. return CopyStream(stream, response.OutputStream);
  85. }
  86. var bytes = result as byte[];
  87. if (bytes != null)
  88. {
  89. response.ContentType = "application/octet-stream";
  90. if (bytes.Length > 0)
  91. {
  92. return response.OutputStream.WriteAsync(bytes, 0, bytes.Length, cancellationToken);
  93. }
  94. return Task.CompletedTask;
  95. }
  96. var responseText = result as string;
  97. if (responseText != null)
  98. {
  99. bytes = Encoding.UTF8.GetBytes(responseText);
  100. if (bytes.Length > 0)
  101. {
  102. return response.OutputStream.WriteAsync(bytes, 0, bytes.Length, cancellationToken);
  103. }
  104. return Task.CompletedTask;
  105. }
  106. return WriteObject(request, result, response);
  107. }
  108. private static async Task CopyStream(Stream src, Stream dest)
  109. {
  110. using (src)
  111. {
  112. await src.CopyToAsync(dest).ConfigureAwait(false);
  113. }
  114. }
  115. public static async Task WriteObject(IRequest request, object result, IResponse response)
  116. {
  117. var contentType = request.ResponseContentType;
  118. var serializer = RequestHelper.GetResponseWriter(HttpListenerHost.Instance, contentType);
  119. using (var ms = new MemoryStream())
  120. {
  121. serializer(result, ms);
  122. ms.Position = 0;
  123. var contentLength = ms.Length;
  124. if (contentLength > 0)
  125. {
  126. await ms.CopyToAsync(response.OutputStream).ConfigureAwait(false);
  127. }
  128. }
  129. //serializer(result, outputStream);
  130. }
  131. }
  132. }