2
0

WebExtensions.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. namespace MeloongCore.Extensions;
  2. public static class WebExtensions {
  3. // Source - https://stackoverflow.com/a/46026230, Posted by desautelsj, Retrieved 2026-06-14, License - CC BY-SA 4.0
  4. public static HttpRequestMessage Clone(this HttpRequestMessage request) {
  5. var clone = new HttpRequestMessage(request.Method, request.RequestUri) {
  6. Content = request.Content.Clone(),
  7. Version = request.Version
  8. };
  9. foreach (KeyValuePair<string, object> prop in request.Properties) clone.Properties.Add(prop);
  10. foreach (KeyValuePair<string, IEnumerable<string>> header in request.Headers) clone.Headers.TryAddWithoutValidation(header.Key, header.Value);
  11. return clone;
  12. }
  13. public static async Task<HttpRequestMessage> CloneAsync(this HttpRequestMessage request) {
  14. var clone = new HttpRequestMessage(request.Method, request.RequestUri) {
  15. Content = await request.Content.CloneAsync().NoCapture(),
  16. Version = request.Version
  17. };
  18. foreach (KeyValuePair<string, object> prop in request.Properties) clone.Properties.Add(prop);
  19. foreach (KeyValuePair<string, IEnumerable<string>> header in request.Headers) clone.Headers.TryAddWithoutValidation(header.Key, header.Value);
  20. return clone;
  21. }
  22. public static HttpContent? Clone(this HttpContent? content) {
  23. if (content == null) return null;
  24. var ms = new MemoryStream();
  25. content.CopyToAsync(ms).Wait();
  26. ms.Position = 0;
  27. var clone = new StreamContent(ms);
  28. foreach (KeyValuePair<string, IEnumerable<string>> header in content.Headers) clone.Headers.Add(header.Key, header.Value);
  29. return clone;
  30. }
  31. public static async Task<HttpContent?> CloneAsync(this HttpContent? content) {
  32. if (content == null) return null;
  33. var ms = new MemoryStream();
  34. await content.CopyToAsync(ms).NoCapture();
  35. ms.Position = 0;
  36. var clone = new StreamContent(ms);
  37. foreach (KeyValuePair<string, IEnumerable<string>> header in content.Headers) clone.Headers.Add(header.Key, header.Value);
  38. return clone;
  39. }
  40. }