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); }
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); }
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); }
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; }
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; }
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; }
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"); } }
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; }
public RequestState() { Request = null; Response = null; ConnectionOptions = null; }