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 };
            }
        }
Beispiel #2
0
        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
                });
            }
        }