public static WebResponse CreateWebResponse(PtunConnection conn, string op, Dictionary <string, byte[]> extpars, string sqlForLogPurpose) { var fp = conn.FailoverParams; var start = DateTime.Now; Exception httpError = null; int reqindex = 0; for (; reqindex < fp.MaxRequestCount; reqindex++) { try { HttpWebRequest webrequest = (HttpWebRequest)WebRequest.Create(conn.Params.Url); if (!String.IsNullOrEmpty(conn.Params.HttpLogin)) { webrequest.Credentials = new NetworkCredential(conn.Params.HttpLogin, conn.Params.HttpPassword); } webrequest.ContentType = "application/x-www-form-urlencoded; charset=" + conn.Params.RealEncoding.WebName; webrequest.Method = "POST"; Dictionary <string, byte[]> pars = new Dictionary <string, byte[]>(); pars["CHECK"] = Encoding.ASCII.GetBytes(conn.Params.Check); pars["HOST"] = Encoding.ASCII.GetBytes(conn.Params.Host ?? ""); pars["USER"] = Encoding.ASCII.GetBytes(conn.Params.Login ?? ""); pars["PORT"] = Encoding.ASCII.GetBytes(PtunDefaults.Instance.Port(conn.Params.Engine, conn.Params.Port).ToString()); pars["PASSWORD"] = Encoding.ASCII.GetBytes(conn.Params.Password ?? ""); pars["ENGINE"] = Encoding.ASCII.GetBytes(PtunDefaults.Instance.Engine(conn.Params.Engine)); pars["DATABASE"] = Encoding.ASCII.GetBytes(conn.Database ?? ""); pars["OPERATION"] = Encoding.ASCII.GetBytes(op); pars["VERSION"] = Encoding.ASCII.GetBytes(VERSION.ToString()); pars["ENCODINGSTYLE"] = Encoding.ASCII.GetBytes(conn.Params.EncodingStyle.ToString()); pars.AddAll(extpars); string pars_enc = StringTool.UrlEncode(pars); byte[] data = conn.Params.RealEncoding.GetBytes(pars_enc); webrequest.ContentLength = data.Length; webrequest.Timeout = reqindex == 0 ? fp.HttpRequestTimeoutMilisecs : fp.RepeatedHttpRequestTimeoutMilisecs; using (Stream requestStream = webrequest.GetRequestStream()) { requestStream.Write(data, 0, data.Length); } try { WebResponse resp = webrequest.GetResponse(); return(resp); } catch (Exception e) { Logging.Warning(String.Format("PHP tunnel error (run {0}), trying again:{1}", reqindex, e.Message)); Thread.Sleep(fp.DelayBeforeRepeatedRequestMilisecs); httpError = e; } if ((DateTime.Now - start).TotalMilliseconds > fp.RepeatedRequestTimeoutMilisecs) { break; } } catch (UriFormatException err) { throw new ConnectionFailedError(err); } } Logging.Info(String.Format("Repeated PTUN request failed, repeated={0}", reqindex)); if (sqlForLogPurpose != null) { DbConnectionExtension.LogExecuteQuery(sqlForLogPurpose); } else { Logging.Debug("Executing PTUN operation:" + op); } throw httpError; }