private WebRequest CreateRequest(string uri, RequestOperation op)
        {
            var request = WebRequest.Create(uri);

            request.Method          = op.Method.ToString().ToUpper();
            request.Timeout         = Timeout;
            request.PreAuthenticate = true;

            if (_proxySet)
            {
                request.Proxy = _proxy;
            }

            var httpRequest = request as HttpWebRequest;

            if (httpRequest != null)
            {
                httpRequest.AllowAutoRedirect = false;
                httpRequest.ReadWriteTimeout  = Timeout;
                httpRequest.KeepAlive         = false;
                httpRequest.ProtocolVersion   = HttpVersion.Version10;

                if (Accept != null)
                {
                    httpRequest.Accept = string.Join(",", Array.ConvertAll(Accept, type => MediaTypeNames.GetMediaType(type)));
                }

                if (Cookies != null)
                {
                    httpRequest.CookieContainer = Cookies;
                }

                if (!string.IsNullOrEmpty(UserAgent))
                {
                    httpRequest.UserAgent = UserAgent;
                }
            }

            if (Credentials != null)
            {
                request.Credentials = Credentials;
            }
            else if (!string.IsNullOrEmpty(UserName) || !string.IsNullOrEmpty(Password))
            {
                var uriPrefix = new Uri(uri);
                var cred      = new NetworkCredential(UserName, Password);
                request.Credentials = new CredentialCache
                {
                    { uriPrefix, "Basic", cred },
                    { uriPrefix, "Digest", cred },
                    { uriPrefix, "NTLM", cred },
                    { uriPrefix, "Kerberos", cred },
                    { uriPrefix, "Negotiate", cred }
                };
            }
            else
            {
                request.Credentials = CredentialCache.DefaultCredentials;
            }

            if (!string.IsNullOrEmpty(op.ETag))
            {
                var header = op.Method == HttpMethod.Get
                                 ? HttpRequestHeader.IfNoneMatch
                                 : HttpRequestHeader.IfMatch;
                request.Headers[header] = op.ETag;
            }

            var isMultipart = op.Form.Count > 0 || op.Files.Count > 0;

            if (op.Resource != null || isMultipart)
            {
                using (var stream = request.GetRequestStream())
                {
                    var       requestStream = isMultipart ? new MemoryStream() : stream;
                    MediaType?mediaType;

                    if (op.Resource is ISyndicationResource)
                    {
                        mediaType = op.Resource is AtomFeed ? MediaType.Atom : MediaType.AtomEntry;
                        ((ISyndicationResource)op.Resource).Save(requestStream);
                    }
                    else if (op.Resource is IXmlSerializable)
                    {
                        mediaType = MediaType.Xml;

                        using (var xmlWriter = XmlWriter.Create(requestStream))
                        {
                            ((IXmlSerializable)op.Resource).WriteXml(xmlWriter);
                        }
                    }
                    else if (op.Resource is string)
                    {
                        mediaType = MediaType.Text;

                        using (var writer = new StreamWriter(requestStream))
                        {
                            writer.Write((string)op.Resource);
                        }
                    }
                    else
                    {
                        mediaType = null;
                    }

                    if (op.ContentType != null)
                    {
                        mediaType = op.ContentType.Value;
                    }

                    if (isMultipart)
                    {
                        requestStream.Seek(0, SeekOrigin.Begin);

                        using (var multipart = new MimeMessage())
                        {
                            if (mediaType != null)
                            {
                                var part = new MimePart(requestStream)
                                {
                                    ContentType = MediaTypeNames.GetMediaType(mediaType.Value)
                                };
                                multipart.Add(part);
                            }

                            foreach (var data in op.Form)
                            {
                                var part = new MimePart(new MemoryStream(Encoding.UTF8.GetBytes(data.Value)))
                                {
                                    ContentType             = MediaTypeNames.TextMediaType,
                                    ContentTransferEncoding = "binary",
                                    ContentDisposition      = new ContentDisposition(DispositionTypeNames.Inline)
                                    {
                                        Parameters = { { "name", data.Key } }
                                    }
                                };
                                multipart.Add(part);
                            }

                            foreach (var file in op.Files)
                            {
                                var contentDisposition = new ContentDisposition(DispositionTypeNames.Attachment);
                                if (file.FileName != null)
                                {
                                    if (file.FileName == Encoding.ASCII.GetString(Encoding.ASCII.GetBytes(file.FileName)))
                                    {
                                        contentDisposition.FileName = file.FileName;
                                    }
                                    else
                                    {
                                        contentDisposition.Parameters["filename*"] = string.Format("{0}''{1}", Encoding.UTF8.WebName, HttpUtility.UrlEncode(file.FileName));
                                    }
                                }

                                var part = new MimePart(file.Stream)
                                {
                                    ContentType             = !string.IsNullOrEmpty(file.ContentType) ? file.ContentType : "application/octet-stream",
                                    ContentTransferEncoding = "binary",
                                    ContentDisposition      = contentDisposition
                                };
                                multipart.Add(part);
                            }

                            multipart.WriteTo(stream);
                            request.ContentType = new ContentType("multipart/" + (op.Files.Count > 0 ? "related" : "form-data"))
                            {
                                Boundary = multipart.Boundary
                            }.ToString();
                        }
                    }
                    else if (mediaType != null)
                    {
                        request.ContentType = MediaTypeNames.GetMediaType(mediaType.Value);
                    }
                }
            }

            return(request);
        }
        private WebRequest CreateRequest(string uri, RequestOperation op)
        {
            var request = WebRequest.Create(uri);
            request.Method = op.Method.ToString().ToUpper();
            request.Timeout = Timeout;
            request.PreAuthenticate = true;

            if (_proxySet)
            {
                request.Proxy = _proxy;
            }

            var httpRequest = request as HttpWebRequest;
            if (httpRequest != null)
            {
                httpRequest.AllowAutoRedirect = false;
                httpRequest.ReadWriteTimeout = Timeout;
                httpRequest.KeepAlive = false;
                httpRequest.ProtocolVersion = HttpVersion.Version10;

                if (Accept != null)
                {
                    httpRequest.Accept = string.Join(",", Array.ConvertAll(Accept, type => MediaTypeNames.GetMediaType(type)));
                }

                if (Cookies != null)
                {
                    httpRequest.CookieContainer = Cookies;
                }

                if (!string.IsNullOrEmpty(UserAgent))
                {
                    httpRequest.UserAgent = UserAgent;
                }
            }

            if (Credentials != null)
            {
                request.Credentials = Credentials;
            }
            else if (!string.IsNullOrEmpty(UserName) || !string.IsNullOrEmpty(Password))
            {
                var uriPrefix = new Uri(uri);
                var cred = new NetworkCredential(UserName, Password);
                request.Credentials = new CredentialCache
                                      {
                                          {uriPrefix, "Basic", cred},
                                          {uriPrefix, "Digest", cred},
                                          {uriPrefix, "NTLM", cred},
                                          {uriPrefix, "Kerberos", cred},
                                          {uriPrefix, "Negotiate", cred}
                                      };
            }
            else
            {
                request.Credentials = CredentialCache.DefaultCredentials;
            }

            if (!string.IsNullOrEmpty(op.ETag))
            {
                var header = op.Method == HttpMethod.Get
                                 ? HttpRequestHeader.IfNoneMatch
                                 : HttpRequestHeader.IfMatch;
                request.Headers[header] = op.ETag;
            }

            if (op.Resource != null)
            {
                using (var stream = request.GetRequestStream())
                {
                    var requestStream = op.Files.Count > 0 ? new MemoryStream() : stream;
                    MediaType mediaType;

                    if (op.Resource is ISyndicationResource)
                    {
                        mediaType = op.Resource is AtomFeed ? MediaType.Atom : MediaType.AtomEntry;
                        ((ISyndicationResource) op.Resource).Save(requestStream);
                    }
                    else if (op.Resource is IXmlSerializable)
                    {
                        mediaType = MediaType.Xml;

                        using (var xmlWriter = XmlWriter.Create(requestStream))
                        {
                            ((IXmlSerializable) op.Resource).WriteXml(xmlWriter);
                        }
                    }
                    else if (op.Resource is string)
                    {
                        mediaType = MediaType.Text;

                        using (var writer = new StreamWriter(requestStream))
                        {
                            writer.Write((string) op.Resource);
                        }
                    }
                    else
                    {
                        throw new Exception();
                    }

                    if (op.ContentType != null)
                    {
                        mediaType = op.ContentType.Value;
                    }

                    var contentType = MediaTypeNames.GetMediaType(mediaType);

                    if (op.Files.Count > 0)
                    {
                        requestStream.Seek(0, SeekOrigin.Begin);
                        var part = new MimePart(requestStream) {ContentType = contentType};

                        using (var multipart = new MimeMessage(part))
                        {
                            contentType = new ContentType("multipart/related") {Boundary = multipart.Boundary}.ToString();

                            foreach (var file in op.Files)
                            {
                                var type = !string.IsNullOrEmpty(file.ContentType) ? file.ContentType : "application/octet-stream";
                                var disposition = new ContentDisposition(DispositionTypeNames.Attachment) {FileName = file.FileName};
                                part = new MimePart(file.Stream)
                                       {
                                           ContentType = type,
                                           ContentTransferEncoding = "binary",
                                           ContentDisposition = disposition
                                       };
                                multipart.Add(part);
                            }

                            multipart.WriteTo(stream);
                        }
                    }

                    request.ContentType = contentType;
                }
            }

            return request;
        }
Beispiel #3
0
        private void WriteRequestContent(MediaType?contentType, object content, Stream stream)
        {
            var isMultipart   = Form.Count > 0 || Files.Count > 0;
            var requestStream = isMultipart ? new MemoryStream() : stream;

            if (contentType == null)
            {
                if (ContentHelper.IsDictionary(content))
                {
                    contentType = MediaType.AtomEntry;
                }
                else if (ContentHelper.IsCollection(content))
                {
                    contentType = MediaType.Atom;
                }
                else if (content is IXmlSerializable)
                {
                    contentType = MediaType.Xml;
                }
                else if (content is string)
                {
                    contentType = MediaType.Text;
                }
                else if (ContentHelper.IsObject(content))
                {
                    contentType = MediaType.AtomEntry;
                }
            }

            if (contentType != null && content != null)
            {
                var handler = ContentManager.GetHandler(contentType.Value);
                if (handler == null)
                {
                    throw new NotSupportedException(string.Format("Content type '{0}' not supported", contentType));
                }

                handler.WriteTo(content, requestStream, NamingScheme);
            }

            if (isMultipart)
            {
                requestStream.Seek(0, SeekOrigin.Begin);

                using (var multipart = new MimeMessage())
                {
                    if (contentType != null)
                    {
                        var part = new MimePart(requestStream)
                        {
                            ContentType = MediaTypeNames.GetMediaType(contentType.Value)
                        };
                        multipart.Add(part);
                    }

                    foreach (var data in Form)
                    {
                        var part = new MimePart(new MemoryStream(Encoding.UTF8.GetBytes(data.Value)))
                        {
                            ContentType             = MediaTypeNames.TextMediaType,
                            ContentTransferEncoding = "binary",
                            ContentDisposition      = "inline; name=" + data.Key
                        };
                        multipart.Add(part);
                    }

                    foreach (var file in Files)
                    {
                        var contentDisposition = "attachment";
                        if (file.FileName != null)
                        {
                            contentDisposition += Encoding.UTF8.GetByteCount(file.FileName) == file.FileName.Length
                                ? "; filename=" + string.Format("\"{0}\"", file.FileName.Replace("\"", "\\\""))
                                : "; filename*=" + string.Format("{0}''{1}", Encoding.UTF8.WebName, System.Uri.EscapeDataString(file.FileName));
                        }

                        var part = new MimePart(file.Stream)
                        {
                            ContentType             = file.ContentType ?? "application/octet-stream",
                            ContentTransferEncoding = "binary",
                            ContentDisposition      = contentDisposition
                        };
                        multipart.Add(part);
                    }

                    multipart.WriteTo(stream);
                    _request.ContentType = string.Format("multipart/{0}; boundary={1}", (Files.Count > 0 ? "related" : "form-data"), multipart.Boundary);
                }
            }
            else if (contentType != null)
            {
                _request.ContentType = MediaTypeNames.GetMediaType(contentType.Value);
            }
        }