public static MultiPartResponse FromMultiPart(this IWebResponse response) { if (response == null) { throw new ArgumentNullException("response"); } // Make sure it is a multi-part request string[] parts = response.Response.ContentType.Split(';').Select(s => s.Trim()).ToArray(); if (!parts[0].Equals(ContentTypePrefix, StringComparison.InvariantCultureIgnoreCase)) { return new MultiPartResponse() { Files = new MultiPartFileLookup(), FormData = new NameValueCollection() }; } // Parse the content type parameters var contentTypeParameters = parts .Skip(1) .Select(p => p.Split(new char[] { '=' }, 2)) .Where(p => p.Length == 2) .ToLookup(p => p[0], p => p[1], StringComparer.InvariantCultureIgnoreCase); // Check the boundary is specified, and only once if (contentTypeParameters["boundary"].Count() != 1) { return new MultiPartResponse() { Files = new MultiPartFileLookup(), FormData = new NameValueCollection() }; } string boundary = contentTypeParameters["boundary"].First(); using (Stream responseStream = response.Response.GetResponseStream()) { Encoding encoding = response.Response.ContentEncoding == null ? Encoding.UTF8 : Encoding.GetEncoding(response.Response.ContentEncoding); StreamingMultiPartParser parser = new StreamingMultiPartParser(responseStream, encoding, boundary); MultiPartFileLookup fileLookup = new MultiPartFileLookup(); NameValueCollection collection = new NameValueCollection(); parser.SectionFound += (o, e) => { var data = getSectionData(e); if (data == null) { return; } if (String.IsNullOrWhiteSpace(data.FileName)) { string value = encoding.GetString(data.Contents); collection.Add(data.Name, value); } else { var file = new MultiPartFile() { Name = data.Name, FileName = data.FileName, ContentType = data.ContentType, Contents = data.Contents }; fileLookup.Add(file.Name, file); } }; return new MultiPartResponse() { Files = fileLookup, FormData = collection }; } }
public static MultiPartResponse FromMultiPart(this IWebResponse response) { if (response == null) { throw new ArgumentNullException("response"); } // Make sure it is a multi-part request string[] parts = response.Response.ContentType.Split(';').Select(s => s.Trim()).ToArray(); if (!parts[0].Equals(ContentTypePrefix, StringComparison.InvariantCultureIgnoreCase)) { return(new MultiPartResponse() { Files = new MultiPartFileLookup(), FormData = new NameValueCollection() }); } // Parse the content type parameters var contentTypeParameters = parts .Skip(1) .Select(p => p.Split(new char[] { '=' }, 2)) .Where(p => p.Length == 2) .ToLookup(p => p[0], p => p[1], StringComparer.InvariantCultureIgnoreCase); // Check the boundary is specified, and only once if (contentTypeParameters["boundary"].Count() != 1) { return(new MultiPartResponse() { Files = new MultiPartFileLookup(), FormData = new NameValueCollection() }); } string boundary = contentTypeParameters["boundary"].First(); using (Stream responseStream = response.Response.GetResponseStream()) { Encoding encoding = response.Response.ContentEncoding == null ? Encoding.UTF8 : Encoding.GetEncoding(response.Response.ContentEncoding); StreamingMultiPartParser parser = new StreamingMultiPartParser(responseStream, encoding, boundary); MultiPartFileLookup fileLookup = new MultiPartFileLookup(); NameValueCollection collection = new NameValueCollection(); parser.SectionFound += (o, e) => { var data = getSectionData(e); if (data == null) { return; } if (String.IsNullOrWhiteSpace(data.FileName)) { string value = encoding.GetString(data.Contents); collection.Add(data.Name, value); } else { var file = new MultiPartFile() { Name = data.Name, FileName = data.FileName, ContentType = data.ContentType, Contents = data.Contents }; fileLookup.Add(file.Name, file); } }; return(new MultiPartResponse() { Files = fileLookup, FormData = collection }); } }