Beispiel #1
0
        public static HttpWebResponse GetResponse(string source, string method, out HttpWebRequest request)
        {
            var uri = new Uri(source);
            string username = "", password = "";
            if (!string.IsNullOrEmpty(uri.UserInfo))
            {
                var lp = uri.UserInfo.Split(':');
                if (lp.Length > 1)
                {
                    username = lp[0];
                    password = lp[1];
                }
            }
            var co = new ConnectionOptions
            {
                channel = "",
                cookies = "",
                headers = "",
                method = method,
                password = password,
                proxy = null,
                requestTimeout = 5000,
                source = source,
                userAgent = "",
                username = username,
                useSeparateConnectionGroup = false,
                useHttp10 = false

            };
            return GetResponse(co, out request);
        }
Beispiel #2
0
        public void SendPTZCommand(string cmd)
        {
            if (string.IsNullOrEmpty(cmd))
                return;

            PTZSettings2Camera ptz;
            switch (_cameraControl.Camobject.ptz)
            {
                case -1://digital only
                    return;
                case -2://IAM
                    return;
                case -3://PELCO-P
                    ProcessPelcoCommand(cmd, true);
                    return;
                case -4://PELCO-D
                    ProcessPelcoCommand(cmd, false);
                    return;
                case -5://ONVIF
                    ProcessOnvifCommand(cmd);
                    return;
                case -6://NONE
                    return;
                default: //IP CAMERA
                    ptz = MainForm.PTZs.SingleOrDefault(q => q.id == _cameraControl.Camobject.ptz);
                    break;
            }
            if (ptz == null)
                return;

            UriBuilder uri;
            string urltemp = _cameraControl.Camobject.settings.videosourcestring;

            bool absURL = false;
            if (_cameraControl.Camobject.settings.ptzurlbase.StartsWith("http", true, CultureInfo.InvariantCulture))
            {
                urltemp = _cameraControl.Camobject.settings.ptzurlbase;
                absURL = true;
            }

            if (cmd.StartsWith("http", true, CultureInfo.InvariantCulture))
            {
                urltemp = cmd;
                absURL = true;
            }

            try
            {
                uri = new UriBuilder(urltemp);
            }
            catch (Exception e)
            {
                Logger.LogExceptionToFile(e, "PTZ Controller");
                return;
            }

            if (uri.Scheme == Uri.UriSchemeFile)
                return;


            uri.Port = _cameraControl.Camobject.settings.ptzport;

            if (!uri.Scheme.ToLower().StartsWith("http")) //allow http and https
            {
                uri.Scheme = "http";
            }

            if (!absURL)
            {
                //uri is currently video source uri\
                //ptzurlbase is defaulted to commandurl
                string pandq = _cameraControl.Camobject.settings.ptzurlbase.Trim();
                if (cmd.StartsWith("/") || string.IsNullOrEmpty(pandq))
                    pandq = cmd;
                else
                {
                    if (!string.IsNullOrEmpty(cmd))
                    {
                        string ext = "";
                        if (!pandq.EndsWith("/"))
                        {
                            ext = pandq.IndexOf("?", StringComparison.Ordinal) != -1 ? "&" : "?";
                        }
                        pandq += ext + cmd;
                    }
                }
                int i = pandq.IndexOf("?", StringComparison.Ordinal);
                if (i == -1 || i == pandq.Length)
                    uri.Path = pandq;
                else
                {
                    uri.Path = pandq.Substring(0, i);
                    uri.Query = pandq.Substring(i + 1);
                }
            }

            string un = _cameraControl.Camobject.settings.login;
            string pwd = _cameraControl.Camobject.settings.password;

            if (!string.IsNullOrEmpty(_cameraControl.Camobject.settings.ptzusername))
            {
                un = _cameraControl.Camobject.settings.ptzusername;
                pwd = _cameraControl.Camobject.settings.ptzpassword;
            }
            else
            {
                if (_cameraControl.Camobject.settings.login == string.Empty)
                {
                    //get from url
                    un = uri.UserName;
                    pwd = uri.Password;
                }
            }

            uri.UserName = un;
            uri.Password = pwd;


            if (!string.IsNullOrEmpty(ptz.AppendAuth))
            {
                string aurl = ptz.AppendAuth.Replace("[USERNAME]", Uri.EscapeDataString(un));
                aurl = aurl.Replace("[PASSWORD]", Uri.EscapeDataString(pwd));

                if (uri.Query == "")
                    uri.Query = aurl;
                else
                    uri.Query = uri.Query.Trim('?') + "&" + aurl;
            }


            string url = uri.ToString().Replace("%5B", "[");
            url = url.Replace("%5D", "]");
            url = url.Replace("[USERNAME]", Uri.EscapeDataString(un));
            url = url.Replace("[PASSWORD]", Uri.EscapeDataString(pwd));
            url = url.Replace("[CHANNEL]", _cameraControl.Camobject.settings.ptzchannel);

            var co = new ConnectionOptions
            {
                channel = _cameraControl.Camobject.settings.ptzchannel,
                cookies = _cameraControl.Camobject.settings.cookies,
                headers = _cameraControl.Camobject.settings.headers,
                method = ptz.Method,
                password = pwd,
                username = un,
                proxy = null,
                requestTimeout = 5000,
                source = url,
                useHttp10 = _cameraControl.Camobject.settings.usehttp10,
                useSeparateConnectionGroup = false,
                userAgent = _cameraControl.Camobject.settings.useragent
            };


            ConnectionFactory.BeginGetResponse(co, CoCallback);
        }
Beispiel #3
0
 public static HttpWebResponse GetResponse(string source, string cookies, string headers, string userAgent, string username, string password, string method, string channel, bool useHttp10, out HttpWebRequest request)
 {
     var co = new ConnectionOptions
     {
         channel = channel,
         cookies = cookies,
         headers = headers,
         method = method,
         password = password,
         proxy = null,
         requestTimeout = 5000,
         source = source,
         userAgent = userAgent,
         username = username,
         useSeparateConnectionGroup = false,
         useHttp10 = useHttp10
     };
     return GetResponse(co, out request);
 }
Beispiel #4
0
        private static HttpWebRequest GenerateRequest(ConnectionOptions co)
        {
            var request = (HttpWebRequest)WebRequest.Create(co.source);

            // set user agent
            if (!string.IsNullOrEmpty(co.userAgent))
            {
                request.UserAgent = co.userAgent;
            }

            // set proxy
            if (co.proxy != null)
            {
                request.Proxy = co.proxy;
            }

            if (co.useHttp10)
                request.ProtocolVersion = HttpVersion.Version10;

            // set timeout value for the request
            request.Timeout = request.ServicePoint.ConnectionLeaseTimeout = request.ServicePoint.MaxIdleTime = co.requestTimeout;
            request.AllowAutoRedirect = true;
            request.AllowWriteStreamBuffering = true;
            request.AllowAutoRedirect = true;
            request.KeepAlive = true;
            request.SendChunked = false;

            // set login and password
            if (!string.IsNullOrEmpty(co.username))
                request.Credentials = new NetworkCredential(co.username, co.password);
            // set connection group name
            if (co.useSeparateConnectionGroup)
                request.ConnectionGroupName = request.GetHashCode().ToString(CultureInfo.InvariantCulture);
            // force basic authentication through extra headers if required

            var authInfo = "";
            if (!string.IsNullOrEmpty(co.username))
            {
                authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(co.username + ":" + co.password));
                request.Headers["Authorization"] = "Basic " + authInfo;
            }


            if (!string.IsNullOrEmpty(co.cookies))
            {
                co.cookies = co.cookies.Replace("[AUTH]", authInfo);
                co.cookies = co.cookies.Replace("[USERNAME]", co.username);
                co.cookies = co.cookies.Replace("[PASSWORD]", co.password);
                co.cookies = co.cookies.Replace("[CHANNEL]", co.channel);
                var myContainer = new CookieContainer();
                string[] coll = co.cookies.Split(';');
                foreach (var ckie in coll)
                {
                    if (!string.IsNullOrEmpty(ckie))
                    {
                        string[] nv = ckie.Split('=');
                        if (nv.Length == 2)
                        {
                            var cookie = new Cookie(nv[0].Trim(), nv[1].Trim());
                            myContainer.Add(new Uri(request.RequestUri.ToString()), cookie);
                        }
                    }
                }
                request.CookieContainer = myContainer;
            }

            if (!string.IsNullOrEmpty(co.headers))
            {
                co.headers = co.headers.Replace("[AUTH]", authInfo);
                string[] coll = co.headers.Split(';');
                foreach (var hdr in coll)
                {
                    if (!string.IsNullOrEmpty(hdr))
                    {
                        string[] nv = hdr.Split('=');
                        if (nv.Length == 2)
                        {
                            request.Headers.Add(nv[0], nv[1]);
                        }
                    }
                }
            }
            return request;
        }
Beispiel #5
0
        public static HttpWebRequest GetRequest(ConnectionOptions co)
        {
            Uri uri;
            if (Uri.TryCreate(co.source, UriKind.Absolute, out uri))
            {
                if (string.IsNullOrEmpty(co.username))
                {
                    var ui = uri.UserInfo.Split(':');
                    if (ui.Length > 1)
                    {
                        co.username = ui[0];
                        co.password = ui[1];
                    }
                }
            }
            var request = GenerateRequest(co);
            if (uri != null)
            {
                var dc = GetDigest(uri.Host);
                if (dc != null)
                    request.Headers["Authorization"] = dc.Authorization;
            }

            switch (co.method)
            {
                case "PUT":
                case "POST":
                    string postData = "";
                    var i = co.source.IndexOf("?", StringComparison.Ordinal);
                    if (i > -1 && i < co.source.Length)
                        postData = co.source.Substring(i + 1);


                    var encoding = new ASCIIEncoding();

                    byte[] data = encoding.GetBytes(postData);

                    request.Method = co.method;
                    request.ContentType = "application/x-www-form-urlencoded";
                    request.ContentLength = data.Length;
                    co.data = data;

                    break;
            }
            return request;
        }
Beispiel #6
0
        private static HttpWebResponse TryDigestRequest(ConnectionOptions co, WebException ex)
        {
            HttpWebResponse response;
            try
            {
                var wwwAuthenticateHeader = ex.Response.Headers["WWW-Authenticate"];
                if (wwwAuthenticateHeader == null)
                    return null;
                if (wwwAuthenticateHeader.StartsWith("Basic", true, CultureInfo.InvariantCulture))
                    return null; //already failed

                var realm = GrabHeaderVar("realm", wwwAuthenticateHeader);
                var nonce = GrabHeaderVar("nonce", wwwAuthenticateHeader);
                var qop = GrabHeaderVar("qop", wwwAuthenticateHeader);

                string cnonce = new Random().Next(123400, 9999999).ToString(CultureInfo.InvariantCulture);

                var request = GetRequest(co);

                string authorization = GetDigestHeader(co.source, co.username, co.password, realm, nonce, cnonce, qop);
                request.Headers["Authorization"] = authorization;

                response = (HttpWebResponse)request.GetResponse();
                Uri uri;
                if (Uri.TryCreate(co.source, UriKind.Absolute, out uri))
                {
                    if (uri != null)
                    {
                        AddDigest(new DigestConfig(uri.Host, authorization));
                    }
                }
                co.ExecuteCallback(true);
            }
            catch (ApplicationException)
            {
                //headers missing for digest
                response = null;
                co.ExecuteCallback(false);
            }
            catch (Exception ex2)
            {
                Logger.LogExceptionToFile(ex2, "Digest");
                response = null;
                co.ExecuteCallback(false);
            }
            return response;
        }
Beispiel #7
0
        public static void BeginGetResponse(ConnectionOptions co, EventHandler successCallback)
        {
            var request = GetRequest(co);
            co.callback += successCallback;


            var myRequestState = new RequestState { Request = request, ConnectionOptions = co };
            try
            {
                if (co.data != null)
                {
                    using (var stream = request.GetRequestStream())
                    {
                        stream.Write(co.data, 0, co.data.Length);
                    }
                }
                request.BeginGetResponse(FinishRequest, myRequestState);
            }
            catch (Exception ex)
            {
                co.ExecuteCallback(false);
                Logger.LogExceptionToFile(ex, "Connection Factory");
            }

            
        }
Beispiel #8
0
        private static HttpWebResponse GetResponse(ConnectionOptions co, out HttpWebRequest request)
        {
            request = GetRequest(co);
            HttpWebResponse response = null;

            try
            {
                if (co.data != null)
                {
                    using (var stream = request.GetRequestStream())
                    {
                        stream.Write(co.data, 0, co.data.Length);
                    }
                }
                response = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                // Try to fix a 401 exception by adding a Authorization header
                if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.Unauthorized)
                    return null;
                response?.Close();
                response = TryDigestRequest(co, ex);
            }
            catch (Exception ex)
            {
                Logger.LogExceptionToFile(ex, "Connection Factory");
                response = null;
            }

            return response;
        }
Beispiel #9
0
 public RequestState()
 {
     Request = null;
     Response = null;
     ConnectionOptions = null;
 }