private void SocketThreadSub(Stream clientStream) { using (var req = ProxyRequest.Parse(clientStream, false)) { Tunnel t = null; // HTTPS if (req.Method == "CONNECT") { // 호스트 확인하고 처리 var host = req.RemoteHost; switch (host) { case "userstream.twitter.com": t = new TunnelSslMitm(req, clientStream, Certificates.Client, this.HostStreaming); break; case "api.twitter.com": t = new TunnelSslMitm(req, clientStream, Certificates.Client, this.HostAPI); break; default: t = new TunnelSslForward(req, clientStream); break; } } // HTTP else { t = new TunnelPlain(req, clientStream); } using (t) t.Handle(); } }
private void SocketThreadSub(ProxyStream proxyStream) { // https 연결인지, plain 인지 확인하는 과정 // ContentType type // https://tools.ietf.org/html/rfc5246#page-41 var buff = new byte[1]; var read = proxyStream.Peek(buff, 0, buff.Length); if (read != buff.Length) { throw new NotSupportedException(); } if (buff[0] == 22) { var ssl = new SslStream(proxyStream, false); ssl.AuthenticateAsServer(Certificates.Client, false, SslProtocol, false); proxyStream = new ProxyStream(ssl); } Handler handler = null; if (!ProxyRequest.TryParse(proxyStream, false, out var req)) { return; } using (req) { // HTTPS if (req.Method == "CONNECT") { // 호스트 확인하고 처리 switch (req.RemoteHost) { case "userstream.twitter.com": case "api.twitter.com": case "localhost": case "127.0.0.1": handler = new TunnelSslMitm(proxyStream, this.m_tunnelCancel.Token, Certificates.Client, SslProtocol, this.HandleContext); break; default: handler = new TunnelSslForward(proxyStream, this.m_tunnelCancel.Token); break; } } // HTTP else { // 호스트 확인하고 처리 switch (req.RemoteHost) { case "localhost": case "127.0.0.1": handler = new HandlerPlain(proxyStream, this.m_tunnelCancel.Token, this.HandleContext); break; default: handler = new TunnelPlain(proxyStream, this.m_tunnelCancel.Token); break; } } using (handler) handler.Handle(req); } }