/// <summary> /// This function will connect a stream to a uri (host and port), /// negotiating proxies and SSL /// </summary> /// <param name="uri"></param> /// <param name="timeout_ms">Timeout, in ms. 0 for no timeout.</param> /// <returns></returns> public static Stream ConnectStream(Uri uri, IWebProxy proxy, bool nodelay, int timeout_ms) { IMockWebProxy mockProxy = proxy != null ? proxy as IMockWebProxy : null; if (mockProxy != null) { return(mockProxy.GetStream(uri)); } Stream stream; bool useProxy = proxy != null && !proxy.IsBypassed(uri); if (useProxy) { Uri proxyURI = proxy.GetProxy(uri); stream = ConnectSocket(proxyURI, nodelay, timeout_ms); } else { stream = ConnectSocket(uri, nodelay, timeout_ms); } try { if (useProxy) { string line = String.Format("CONNECT {0}:{1} HTTP/1.0", uri.Host, uri.Port); WriteLine(line, stream); WriteLine(stream); List <string> initialResponse = new List <string>(); ReadHttpHeaders(ref stream, proxy, nodelay, timeout_ms, initialResponse); AuthenticateProxy(ref stream, uri, proxy, nodelay, timeout_ms, initialResponse, line); } if (UseSSL(uri)) { SslStream sslStream = new SslStream(stream, false, new RemoteCertificateValidationCallback(ValidateServerCertificate), null); sslStream.AuthenticateAsClient("", null, SslProtocols.Tls | SslProtocols.Tls11 | SslProtocols.Tls12, true); stream = sslStream; } return(stream); } catch { stream.Close(); throw; } }
public static Stream ConnectStream(Uri uri, IWebProxy proxy, bool nodelay, int timeout_ms) { Stream stream; Stream stream3; IMockWebProxy proxy2 = (proxy != null) ? (proxy as IMockWebProxy) : null; if (proxy2 != null) { return(proxy2.GetStream(uri)); } bool flag = (proxy != null) && !proxy.IsBypassed(uri); if (flag) { stream = ConnectSocket(proxy.GetProxy(uri), nodelay, timeout_ms); } else { stream = ConnectSocket(uri, nodelay, timeout_ms); } try { if (flag) { WriteLine(string.Format("CONNECT {0}:{1} HTTP/1.0", uri.Host, uri.Port), stream); WriteLine(stream); ReadHttpHeaders(ref stream, proxy, nodelay, timeout_ms); } if (UseSSL(uri)) { SslStream stream2 = new SslStream(stream, false, new RemoteCertificateValidationCallback(HTTP.ValidateServerCertificate), null); stream2.AuthenticateAsClient(""); stream = stream2; } stream3 = stream; } catch { stream.Close(); throw; } return(stream3); }