using BestHTTP.Extensions; namespace BestHTTP.Forms { /// /// A HTTP Form implementation to send textual and binary values. /// public sealed class HTTPMultiPartForm : HTTPFormBase { #region Private Fields /// /// A random boundary generated in the constructor. /// private string Boundary; /// /// /// private byte[] CachedData; #endregion public HTTPMultiPartForm() { this.Boundary = "BestHTTP_HTTPMultiPartForm_" + this.GetHashCode().ToString("X"); } #region IHTTPForm Implementation public override void PrepareRequest(HTTPRequest request) { // Set up Content-Type header for the request request.SetHeader("Content-Type", "multipart/form-data; boundary=" + Boundary); } public override byte[] GetData() { if (CachedData != null) return CachedData; using (var ms = new BufferPoolMemoryStream()) { for (int i = 0; i < Fields.Count; ++i) { HTTPFieldData field = Fields[i]; // Set the boundary ms.WriteLine("--" + Boundary); // Set up Content-Disposition header to our form with the name ms.WriteLine("Content-Disposition: form-data; name=\"" + field.Name + "\"" + (!string.IsNullOrEmpty(field.FileName) ? "; filename=\"" + field.FileName + "\"" : string.Empty)); // Set up Content-Type head for the form. if (!string.IsNullOrEmpty(field.MimeType)) ms.WriteLine("Content-Type: " + field.MimeType); ms.WriteLine(); // Write the actual data to the MemoryStream ms.Write(field.Payload, 0, field.Payload.Length); ms.Write(HTTPRequest.EOL, 0, HTTPRequest.EOL.Length); } // Write out the trailing boundary ms.WriteLine("--" + Boundary + "--"); IsChanged = false; // Set the RawData of our request return CachedData = ms.ToArray(); } } #endregion }; }