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; }
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); } }