internal bool Write(HttpWebRequest request, byte [] buffer, int offset, int size, ref string err_msg) { err_msg = null; Stream s = null; lock (this) { if (Data.request != request) { throw new ObjectDisposedException(typeof(NetworkStream).FullName); } s = nstream; if (s == null) { return(false); } } try { s.Write(buffer, offset, size); // here SSL handshake should have been done if (ssl && !certsAvailable) { GetCertificates(s); } } catch (Exception e) { err_msg = e.Message; WebExceptionStatus wes = WebExceptionStatus.SendFailure; string msg = "Write: " + err_msg; if (e is WebException) { HandleError(wes, e, msg); return(false); } // if SSL is in use then check for TrustFailure if (ssl) { #if SECURITY_DEP && MONOTOUCH HttpsClientStream https = (s as HttpsClientStream); if (https.TrustFailure) { #else if ((bool)piTrustFailure.GetValue(s, null)) { #endif wes = WebExceptionStatus.TrustFailure; msg = "Trust failure"; } } HandleError(wes, e, msg); return(false); } return(true); }
internal void GetCertificates(Stream stream) { // here the SSL negotiation have been done #if SECURITY_DEP && MONOTOUCH HttpsClientStream s = (stream as HttpsClientStream); X509Certificate client = s.SelectedClientCertificate; X509Certificate server = s.ServerCertificate; #else X509Certificate client = (X509Certificate)piClient.GetValue(stream, null); X509Certificate server = (X509Certificate)piServer.GetValue(stream, null); #endif sPoint.SetCertificates(client, server); certsAvailable = (server != null); }