HTTPUrlEncodedForm.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using BestHTTP.PlatformSupport.Text;
  6. namespace BestHTTP.Forms
  7. {
  8. /// <summary>
  9. /// A HTTP Form implementation to send textual values.
  10. /// </summary>
  11. public sealed class HTTPUrlEncodedForm : HTTPFormBase
  12. {
  13. private const int EscapeTreshold = 256;
  14. private byte[] CachedData;
  15. public override void PrepareRequest(HTTPRequest request)
  16. {
  17. request.SetHeader("Content-Type", "application/x-www-form-urlencoded");
  18. }
  19. public override byte[] GetData()
  20. {
  21. if (CachedData != null && !IsChanged)
  22. return CachedData;
  23. StringBuilder sb = PlatformSupport.Text.StringBuilderPool.Get(Fields.Count * 4);
  24. // Create a "field1=value1&field2=value2" formatted string
  25. for (int i = 0; i < Fields.Count; ++i)
  26. {
  27. var field = Fields[i];
  28. if (i > 0)
  29. sb.Append("&");
  30. sb.Append(EscapeString(field.Name));
  31. sb.Append("=");
  32. if (!string.IsNullOrEmpty(field.Text) || field.Binary == null)
  33. sb.Append(EscapeString(field.Text));
  34. else
  35. // If forced to this form type with binary data, we will create a base64 encoded string from it.
  36. sb.Append(Convert.ToBase64String(field.Binary, 0, field.Binary.Length));
  37. }
  38. IsChanged = false;
  39. return CachedData = Encoding.UTF8.GetBytes(PlatformSupport.Text.StringBuilderPool.ReleaseAndGrab(sb));
  40. }
  41. public static string EscapeString(string originalString)
  42. {
  43. if (originalString.Length < EscapeTreshold)
  44. return Uri.EscapeDataString(originalString);
  45. else
  46. {
  47. int loops = originalString.Length / EscapeTreshold;
  48. StringBuilder sb = StringBuilderPool.Get(loops); //new StringBuilder(loops);
  49. for (int i = 0; i <= loops; i++)
  50. sb.Append(i < loops ?
  51. Uri.EscapeDataString(originalString.Substring(EscapeTreshold * i, EscapeTreshold)) :
  52. Uri.EscapeDataString(originalString.Substring(EscapeTreshold * i)));
  53. return StringBuilderPool.ReleaseAndGrab(sb);
  54. }
  55. }
  56. }
  57. }