示例#1
0
        // As client
        private HttpResponse sendHandshakeRequest()
        {
            var req = createHandshakeRequest ();
              var res = sendHttpRequest (req, 90000);
              if (res.IsUnauthorized) {
            var chal = res.Headers["WWW-Authenticate"];
            _logger.Warn (String.Format ("Received an authentication requirement for '{0}'.", chal));
            if (chal.IsNullOrEmpty ()) {
              _logger.Error ("No authentication challenge is specified.");
              return res;
            }

            _authChallenge = AuthenticationChallenge.Parse (chal);
            if (_authChallenge == null) {
              _logger.Error ("An invalid authentication challenge is specified.");
              return res;
            }

            if (_credentials != null &&
            (!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) {
              if (res.HasConnectionClose) {
            releaseClientResources ();
            setClientStream ();
              }

              var authRes = new AuthenticationResponse (_authChallenge, _credentials, _nonceCount);
              _nonceCount = authRes.NonceCount;
              req.Headers["Authorization"] = authRes.ToString ();
              res = sendHttpRequest (req, 15000);
            }
              }

              if (res.IsRedirect) {
            var url = res.Headers["Location"];
            _logger.Warn (String.Format ("Received a redirection to '{0}'.", url));
            if (_enableRedirection) {
              if (url.IsNullOrEmpty ()) {
            _logger.Error ("No url to redirect is located.");
            return res;
              }

              Uri uri;
              string msg;
              if (!url.TryCreateWebSocketUri (out uri, out msg)) {
            _logger.Error ("An invalid url to redirect is located: " + msg);
            return res;
              }

              releaseClientResources ();

              _uri = uri;
              _secure = uri.Scheme == "wss";

              setClientStream ();
              return sendHandshakeRequest ();
            }
              }

              return res;
        }
示例#2
0
        // As client
        private void sendProxyConnectRequest()
        {
            var req = HttpRequest.CreateConnectRequest (_uri);
              var res = sendHttpRequest (req, 90000);
              if (res.IsProxyAuthenticationRequired) {
            var chal = res.Headers["Proxy-Authenticate"];
            _logger.Warn (
              String.Format ("Received a proxy authentication requirement for '{0}'.", chal));

            if (chal.IsNullOrEmpty ())
              throw new WebSocketException ("No proxy authentication challenge is specified.");

            var authChal = AuthenticationChallenge.Parse (chal);
            if (authChal == null)
              throw new WebSocketException ("An invalid proxy authentication challenge is specified.");

            if (_proxyCredentials != null) {
              if (res.HasConnectionClose) {
            releaseClientResources ();
            _tcpClient = new TcpClient (_proxyUri.DnsSafeHost, _proxyUri.Port);
            _stream = _tcpClient.GetStream ();
              }

              var authRes = new AuthenticationResponse (authChal, _proxyCredentials, 0);
              req.Headers["Proxy-Authorization"] = authRes.ToString ();
              res = sendHttpRequest (req, 15000);
            }

            if (res.IsProxyAuthenticationRequired)
              throw new WebSocketException ("A proxy authentication is required.");
              }

              if (res.StatusCode[0] != '2')
            throw new WebSocketException (
              "The proxy has failed a connection to the requested host and port.");
        }
示例#3
0
        // As client
        private HttpRequest createHandshakeRequest()
        {
            var ret = HttpRequest.CreateWebSocketRequest (_uri);

              var headers = ret.Headers;
              if (!_origin.IsNullOrEmpty ())
            headers["Origin"] = _origin;

              headers["Sec-WebSocket-Key"] = _base64Key;

              if (_protocols != null)
            headers["Sec-WebSocket-Protocol"] = _protocols.ToString (", ");

              var exts = createExtensions ();
              if (exts != null)
            headers["Sec-WebSocket-Extensions"] = exts;

              headers["Sec-WebSocket-Version"] = _version;

              AuthenticationResponse authRes = null;
              if (_authChallenge != null && _credentials != null) {
            authRes = new AuthenticationResponse (_authChallenge, _credentials, _nonceCount);
            _nonceCount = authRes.NonceCount;
              }
              else if (_preAuth) {
            authRes = new AuthenticationResponse (_credentials);
              }

              if (authRes != null)
            headers["Authorization"] = authRes.ToString ();

              if (_cookies.Count > 0)
            ret.SetCookies (_cookies);

              return ret;
        }