Eio4HttpPollingHandler.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Net.Http;
  4. using System.Text;
  5. using System.Threading;
  6. using System.Threading.Tasks;
  7. namespace SocketIOClient.Transport
  8. {
  9. public class Eio4HttpPollingHandler : HttpPollingHandler
  10. {
  11. public Eio4HttpPollingHandler(HttpClient httpClient) : base(httpClient) { }
  12. const char Separator = '\u001E'; //1E 
  13. public override async Task PostAsync(string uri, IEnumerable<byte[]> bytes, CancellationToken cancellationToken)
  14. {
  15. var builder = new StringBuilder();
  16. foreach (var item in bytes)
  17. {
  18. builder.Append('b').Append(Convert.ToBase64String(item)).Append(Separator);
  19. }
  20. if (builder.Length == 0)
  21. {
  22. return;
  23. }
  24. string text = builder.ToString().TrimEnd(Separator);
  25. await PostAsync(uri, text, cancellationToken);
  26. }
  27. protected override void ProduceText(string text)
  28. {
  29. string[] items = text.Split(new[] { Separator }, StringSplitOptions.RemoveEmptyEntries);
  30. foreach (var item in items)
  31. {
  32. if (item[0] == 'b')
  33. {
  34. byte[] bytes = Convert.FromBase64String(item.Substring(1));
  35. BytesSubject.OnNext(bytes);
  36. }
  37. else
  38. {
  39. TextSubject.OnNext(item);
  40. }
  41. }
  42. }
  43. }
  44. }