public virtual IPromise<IHttpResponse> Execute(string method, string baseUrl, QueryString queryString, System.Net.ICredentials credentials, bool async, Action<IHttpRequest> configure) { var uri = baseUrl + (queryString == null ? "" : queryString.ToString()); var req = (HttpWebRequest)System.Net.WebRequest.Create(uri); req.AllowAutoRedirect = this.AllowAutoRedirect; if (this.AutomaticDecompression) req.AutomaticDecompression = (DecompressionMethods.GZip | DecompressionMethods.Deflate); if (this.StoreCookies) req.CookieContainer = _cookieContainer; req.Method = method; req.ReadWriteTimeout = 300000; req.Timeout = DefaultTimeout; if (method == "POST") { req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); } req.Credentials = credentials; var result = new WebRequest(req, this.Compression); if (configure != null) configure.Invoke(result); var st = Stopwatch.StartNew(); return result.Execute(async).Convert(r => { if (r.Core.Cookies.Count > 0) SetCookies(r.Core.Cookies); return (IHttpResponse)r; }).Always(() => { st.Stop(); _httpTracing.TraceData(TraceEventType.Verbose, 0, st.ElapsedMilliseconds); }); }
private IPromise<AuthenticationSchemes> CheckAuthentication(Vault vault, bool async) { var result = new Promise<AuthenticationSchemes>(); if (vault.Authentication == AuthenticationSchemes.None && _conn.Version >= 11) { var hReq = (HttpWebRequest)System.Net.WebRequest.Create(vault.Url); hReq.Credentials = null; hReq.UnsafeAuthenticatedConnectionSharing = true; hReq.Method = "HEAD"; var req = new WebRequest(hReq, CompressionType.none); result.CancelTarget( req.Execute(async) .Progress((p, m) => result.Notify(p, m)) .Done(r => { vault.Authentication = AuthenticationSchemes.Anonymous; result.Resolve(vault.Authentication); }).Fail(ex => { var webEx = ex as HttpException; if (webEx != null && webEx.Response.StatusCode == HttpStatusCode.Unauthorized) { vault.Authentication = req.CheckForNotAuthorized(webEx.Response); result.Resolve(vault.Authentication); } else { result.Reject(ex); } })); } else { result.Resolve(AuthenticationSchemes.Anonymous); } return result; }
public IPromise<Stream> Upload(UploadCommand upload, bool async) { // Files need to be uploaded, so build the vault request // Compile the headers and AML query into the appropriate content var multiWriter = new MultiPartFormWriter(async, _conn.AmlContext.LocalizationContext); multiWriter.AddFiles(upload); _conn.SetDefaultHeaders(multiWriter.WriteFormField); multiWriter.WriteFormField("SOAPACTION", upload.Action.ToString()); multiWriter.WriteFormField("VAULTID", upload.Vault.Id); multiWriter.WriteFormField("XMLdata", "<SOAP-ENV:Envelope xmlns:SOAP-ENV=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:i18n=\"http://www.aras.com/I18N\"><SOAP-ENV:Body><ApplyItem>" + upload.ToNormalizedAml(_conn.AmlContext.LocalizationContext) + "</ApplyItem></SOAP-ENV:Body></SOAP-ENV:Envelope>"); // Transform the vault URL (as necessary) var urlPromise = upload.Vault.Url.IndexOf("$[") < 0 ? Promises.Resolved(upload.Vault.Url) : _conn.Process(new Command("<url>@0</url>", upload.Vault.Url) .WithAction(CommandAction.TransformVaultServerURL), async) .Convert(s => s.AsString()); //GetResult("TransformVaultServerURL", "<url>" + upload.Vault.Url + "</url>", async); return urlPromise.Continue(u => { // Determine the authentication used by the vault if (u != upload.Vault.Url) upload.Vault.Url = u; return CheckAuthentication(upload.Vault, async); }).Continue(a => { // Build the request to perform the upload var hReq = (HttpWebRequest)System.Net.WebRequest.Create(upload.Vault.Url); hReq.AllowWriteStreamBuffering = false; hReq.Timeout = -1; hReq.ReadWriteTimeout = 300000; hReq.SendChunked = true; hReq.Method = "POST"; hReq.KeepAlive = true; hReq.ProtocolVersion = HttpVersion.Version11; hReq.ContentType = multiWriter.ContentType; hReq.ContentLength = multiWriter.GetLength(); hReq.CookieContainer = upload.Vault.Cookies; switch (a) { case AuthenticationSchemes.Negotiate: hReq.PreAuthenticate = true; hReq.UnsafeAuthenticatedConnectionSharing = true; break; case AuthenticationSchemes.Ntlm: hReq.UnsafeAuthenticatedConnectionSharing = true; break; case AuthenticationSchemes.Basic: hReq.PreAuthenticate = true; break; } var req = new WebRequest(hReq, _conn.Compression); foreach (var ac in _conn.DefaultSettings) { ac.Invoke(req); } if (upload.Settings != null) upload.Settings.Invoke(req); //hReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; MyIE2; .NET CLR 1.1.4322)"; req.SetContent(multiWriter.WriteToRequest); return req.Execute(async); }).Convert(r => r.AsStream); }
private IPromise<WebResponse> DownloadFileFromVault(IReadOnlyItem fileItem, Vault vault, bool async, Command request) { var url = vault.Url; if (string.IsNullOrEmpty(url)) return null; var urlPromise = url.IndexOf("$[") < 0 ? Promises.Resolved(url) : _conn.Process(new Command("<url>@0</url>", url) .WithAction(CommandAction.TransformVaultServerURL), async) .Convert(s => s.AsString()); return urlPromise.Continue<string, WebResponse>(u => { if (u != vault.Url) vault.Url = u; var uri = new Uri(string.Format("{0}?dbName={1}&fileId={2}&fileName={3}&vaultId={4}", u, _conn.Database, fileItem.Id(), HttpUtility.UrlEncode(fileItem.Property("filename").Value), vault.Id)); var req = (HttpWebRequest)System.Net.WebRequest.Create(uri); req.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); req.Credentials = CredentialCache.DefaultCredentials; req.Method = "GET"; req.Proxy.Credentials = CredentialCache.DefaultCredentials; req.Timeout = -1; _conn.SetDefaultHeaders((k, v) => { req.Headers.Set(k, v); }); req.Headers.Set("VAULTID", vault.Id); var result = new WebRequest(req, _conn.Compression); foreach (var a in _conn.DefaultSettings) { a.Invoke(result); } if (request.Settings != null) request.Settings.Invoke(result); return result.Execute(async); }); }