コード例 #1
0
        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();
            }
        }
コード例 #2
0
        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);
            }
        }