private static async void doHttp(SdSource source, HttpMessage msg, __CacheBlock cache, HttpCallback callback) { var encoding = Encoding.GetEncoding(msg.config.encode()); AsyncHttpClient client = new AsyncHttpClient(); client.UserAgent(msg.config.ua()); client.Encoding(msg.config.encode()); foreach (String key in msg.header.Keys) { client.Header(key, msg.header[key]); } string newUrl = null; if (msg.url.IndexOf(" ") >= 0) { newUrl = Uri.EscapeUriString(msg.url); } else { newUrl = msg.url; } client.Url(newUrl); string temp = null; AsyncHttpResponse rsp = null; try { if ("post".Equals(msg.config.method)) { rsp = await client.Post(msg.form); } else { rsp = await client.Get(); } if (rsp.StatusCode == HttpStatusCode.OK) { source.setCookies(rsp.Cookies); temp = rsp.GetString(); if (string.IsNullOrEmpty(rsp.location) == false) { Uri uri = new Uri(msg.url); rsp.location = uri.Scheme + "://" + uri.Host + rsp.location; } } } catch (Exception ex) { Util.log(source, "HTTP", ex.Message); } if (temp == null) { if (cache == null || cache.value == null) { callback(-2, msg, null, rsp.location); } else { callback(1, msg, cache.value, rsp.location); } } else { callback(1, msg, temp, rsp.location); } }
private void OnHTTPResponse(IAsyncResult result) { AsyncHttpResponse state = (AsyncHttpResponse)result.AsyncState; var success = false; try { state.Request.EndGetResponse(result); success = true; } catch (WebException) { if (state.AssociatedAccount.Protocol == "https") { // try to fetch certificate try { var tls = new TLSHandshake(); tls.SetServerNameExtension(state.AssociatedAccount.Hostname); var socket = new StreamSocket(); socket.Connect(state.AssociatedAccount.Hostname, TLSHandshake.TLS_HTTP_PORT); socket.Write(tls.CreateClientHello()); DateTime startTime = DateTime.Now; while (true) { var data = socket.Read(); if (data.Length > 0) { var cert = tls.FindPacket(data, TLSHandshake.TLS_HANDSHAKE_CERTIFICATE); if (cert.Length > 0) { var details = tls.GetCertificateDetails(cert); if (details.Count > 0) { var certDetails = details[0]; if (certDetails.ContainsKey("CN")) { Dispatcher.BeginInvoke(() => { MessageBox.Show("EditAccountPage_Connection_Rejected".Translate(state.AssociatedAccount.Hostname, certDetails["CN"], certDetails["ValidAfter"], certDetails["ValidTo"]), "EditAccountPage_Connection_Rejected_Caption".Translate(), MessageBoxButton.OK); overlayFadeOut.Begin(); }); return; } } break; } } if (DateTime.Now.Subtract(startTime).TotalSeconds > 5) { break; } } } catch (Exception) { // Host not reachable, no SSL host or TLS version not supported } } } catch (Exception) { // HTTPWebRequest has failed } Dispatcher.BeginInvoke(() => { if (success) { overlayFadeOut.Begin(); StoreAccount(state.AssociatedAccount); } else { overlayFadeOut.Begin(); OnConnectFailed(state.AssociatedAccount); } }); }
private void OnHTTPResponse(IAsyncResult result) { AsyncHttpResponse state = (AsyncHttpResponse)result.AsyncState; var success = false; try { state.Request.EndGetResponse(result); success = true; } catch (WebException) { if (state.AssociatedAccount.Protocol == "https") { // try to fetch certificate try { var tls = new TLSHandshake(); tls.SetServerNameExtension(state.AssociatedAccount.Hostname); var socket = new StreamSocket(); socket.Connect(state.AssociatedAccount.Hostname, state.AssociatedAccount.GetPort(true)); socket.Write(tls.CreateClientHello()); DateTime startTime = DateTime.Now; while (true) { var data = socket.Read(); if (data.Length > 0) { var cert = tls.FindPacket(data, TLSHandshake.TLS_HANDSHAKE_CERTIFICATE); if (cert.Length > 0) { var details = tls.GetCertificateDetails(cert); if (details.Count > 0) { var certDetails = details[0]; if (certDetails.ContainsKey("CN")) { Dispatcher.BeginInvoke(() => { MessageBox.Show("EditAccountPage_Connection_Rejected".Translate(state.AssociatedAccount.Hostname, certDetails["CN"], certDetails["ValidAfter"], certDetails["ValidTo"]), "EditAccountPage_Connection_Rejected_Caption".Translate(), MessageBoxButton.OK); _overlay.Hide(); }); return; } } break; } } if (DateTime.Now.Subtract(startTime).TotalSeconds > 5) { break; } } } catch (Exception) { // Host not reachable, no SSL host or TLS version not supported } } } catch (Exception) { // HTTPWebRequest has failed } if (success) { // Testing DAV //TODO: Add your additional connection test statement here // To complete the test all fragments must have been fired. EventCollector collector = new EventCollector() { Complete = () => { OnConnectTestComplete(success, state.AssociatedAccount); } }; collector.WaitFor(state.AssociatedAccount.WebDAVPath); collector.WaitFor(state.AssociatedAccount.CalDAVPath); // define paths to test Queue <string> pathsToTest = new Queue <string>(); pathsToTest.Enqueue(state.AssociatedAccount.WebDAVPath); pathsToTest.Enqueue(state.AssociatedAccount.CalDAVPath); // create master instance WebDAV davTest = new WebDAV(state.AssociatedAccount.GetUri(), state.AssociatedAccount.GetCredentials()); // call tests while (pathsToTest.Count > 0) { var path = pathsToTest.Dequeue(); davTest.StartRequest(DAVRequestHeader.CreateListing(path), path, (requestResult, userObj) => { if (requestResult.Status != ServerStatus.MultiStatus) { // all other states are fail states success = false; Dispatcher.BeginInvoke(() => { MessageBox.Show("EditAccountPage_CheckingConnection_DAVTestFailed".Translate(userObj, requestResult.StatusText), "Error_Caption".Translate(), MessageBoxButton.OK); }); } collector.Raise(userObj); }); } } else { OnConnectTestComplete(success, state.AssociatedAccount); } }
private void AuthQueueResponseCallback(AsyncHttpResponse response, ClientAuthenticationQueue queue) { var queueState = (AuthQueueState)response.State; var peer = queueState.Peer; var authRequest = queueState.AuthenticateRequest; var sendParameters = queueState.SendParameters; if (log.IsDebugEnabled) { log.DebugFormat("Authenticate client finished: conId={0}, result={1}", peer.ConnectionId, response.Status); } switch (response.Status) { case HttpRequestQueueResultCode.Success: { if (response.ResponseData == null) { log.ErrorFormat("Custom authentication: failed. ResponseData is empty. AppId={0}/{1}", authRequest.ApplicationId, authRequest.ApplicationId); return; } // deserialize var responseString = Encoding.UTF8.GetString(response.ResponseData).Trim(new char[] { '\uFEFF', '\u200B' }); CustomAuthenticationResult customAuthResult; try { customAuthResult = Newtonsoft.Json.JsonConvert.DeserializeObject <CustomAuthenticationResult>(responseString); //TBD: handle backward compatibility incustomAuthResult class if (customAuthResult.AuthCookie == null) { customAuthResult.AuthCookie = customAuthResult.Secure; } } catch (Exception ex) { log.WarnFormat("Custom authentication: failed to deserialize response. AppId={0}/{1}, Response={2}, Uri={3}", authRequest.ApplicationId, authRequest.ApplicationVersion, responseString, queue.Uri); peer.OnCustomAuthenticationError( ErrorCode.CustomAuthenticationFailed, "Custom authentication deserialization failed: " + ex.Message, authRequest, sendParameters, queueState.State); this.IncrementFailedCustomAuth(); return; } this.IncrementResultCounters(customAuthResult, (CustomAuthResultCounters.Instance)queue.CustomData); peer.OnCustomAuthenticationResult(customAuthResult, authRequest, sendParameters, queueState.State); return; } case HttpRequestQueueResultCode.Offline: case HttpRequestQueueResultCode.QueueFull: case HttpRequestQueueResultCode.QueueTimeout: case HttpRequestQueueResultCode.RequestTimeout: case HttpRequestQueueResultCode.Error: { if (response.RejectIfUnavailable) { peer.OnCustomAuthenticationError( ErrorCode.CustomAuthenticationFailed, "Custom authentication service error: " + response.Status, authRequest, sendParameters, queueState.State); this.IncrementFailedCustomAuth(); } else { var result = new CustomAuthenticationResult { ResultCode = CustomAuthenticationResultCode.Ok }; peer.OnCustomAuthenticationResult(result, authRequest, sendParameters, queueState.State); } return; } } }