Пример #1
0
        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;
        }