/// Creates a single string of name/value pairs from the
 /// Attributes collection of the supplied RestDataItem
 /// pairs are delimited by semi-colons.
 /// Example: name="value"; name-1="value-1"; name-2="value-2"
 private string GetAttributeString(HttpDataSource dataSource)
 {
     if (dataSource.Attributes != null)
     {
         StringBuilder attributeBuilder = new StringBuilder();
         for (int i = 0; i < dataSource.Attributes.Count; i++)
         {
             attributeBuilder.AppendFormat("{0}=\"{1}\"{2}",
                                           dataSource.Attributes.Keys[i],
                                           dataSource.Attributes[dataSource.Attributes.Keys[i]],
                                           (i < (dataSource.Attributes.Count - 1)) ? "; " : string.Empty);
         }
         return(attributeBuilder.ToString());
     }
     return(null);
 }
        private void AppendDataItem(Stream stream, HttpDataSource dataItem, string boundary, Encoding encoding)
        {
            StringBuilder dataItemBuilder = new StringBuilder();

            byte[] newlineBytes = encoding.GetBytes("\r\n");
            dataItemBuilder.Append("--" + boundary + "\r\n");
            dataItemBuilder.AppendFormat("Content-Disposition: form-data; {0}\r\n", GetAttributeString(dataItem));
            dataItemBuilder.AppendFormat("Content-Type: {0}\r\n", dataItem.ContentType);
            dataItemBuilder.Append("\r\n");
            stream.Write(encoding.GetBytes(dataItemBuilder.ToString()), 0, encoding.GetByteCount(dataItemBuilder.ToString()));
            if (dataItem.Data != null)
            {
                stream.Write(dataItem.Data, 0, dataItem.Data.Length);
            }
            stream.Write(newlineBytes, 0, newlineBytes.Length);
        }