Exemplo n.º 1
0
        /// <summary>
        /// Execute the actual task functionality.
        /// </summary>
        /// <param name="result">The current build result.</param>
        /// <returns>
        /// True if the task was successful, false otherwise.
        /// </returns>
        protected override bool Execute(IIntegrationResult result)
        {
            Log.Debug("HttpStatusTask is executing");

            bool   taskTimedOut = false;
            string msg          = string.Format(System.Globalization.CultureInfo.CurrentCulture, "Checking http status of URI: '{0}'", this.RequestSettings.Uri.ToString());

            if (!String.IsNullOrEmpty(Description))
            {
                msg = Description + " (" + msg + ")";
            }

            Log.Debug(msg);
            result.BuildProgressInformation.SignalStartRunTask(msg);
            XmlTaskResult            taskResult = new XmlTaskResult();
            List <HttpRequestStatus> resp       = new List <HttpRequestStatus>();

            long startTimeStamp = -1;
            bool keepTrying;
            int  attempt = 0;

            if (this.HasTimeout)
            {
                startTimeStamp = Stopwatch.GetTimestamp();
            }

            do
            {
                try
                {
                    if (this.HasTimeout)
                    {
                        long taskDurationTicks     = Stopwatch.GetTimestamp() - startTimeStamp;
                        long taskDurationMilliSecs = (long)Math.Round(((double)taskDurationTicks / Stopwatch.Frequency) * 1000.0);
                        long msecsLeft             = this.Timeout.Millis - taskDurationMilliSecs;

                        if (msecsLeft < 0)
                        {
                            taskTimedOut = true;
                            break;
                        }

                        if (msecsLeft < this.RequestSettings.Timeout.Millis)
                        {
                            this.RequestSettings.Timeout = new Timeout((int)msecsLeft, TimeUnits.MILLIS);
                        }

                        Log.Debug("Task timeout in T-{0:N1} seconds", msecsLeft / 1000.0);
                    }

                    HttpRequestStatus status = this.GetRequestStatus(this.RequestSettings);
                    if (status.Success)
                    {
                        Log.Debug("Checking returned status code ({0}) against success status codes: {1}", ((int)status.StatusCode).ToString(CultureInfo.CurrentCulture), this.SuccessStatusCodes);
                        for (int i = 0; i < this.successStatusCodes.Length; i++)
                        {
                            if ((int)status.StatusCode == this.successStatusCodes[i])
                            {
                                Log.Debug("Success, exiting...");
                                taskResult.Success = true;
                                break;
                            }
                        }
                    }

                    resp.Add(status);
                }
                catch (Exception ex)
                {
                    throw new BuilderException(this, string.Format(System.Globalization.CultureInfo.CurrentCulture, "An exception occured in HttpStatusTask while checking status for: '{0}'", this.RequestSettings.Uri), ex);
                }

                // sleeping
                keepTrying = !taskResult.Success && (this.Retries == -1 || (this.Retries - attempt++) > 0);

                if (keepTrying)
                {
                    var delay = this.RetryDelay ?? new Timeout(5000);
                    if (delay.Millis > 0)
                    {
                        delay.Normalize();
                        Log.Debug("Retrying in {0}...", delay.ToString());
                        System.Threading.Thread.Sleep(delay.Millis);
                    }
                    else
                    {
                        Log.Debug("Retrying...");
                    }
                }
            }while (keepTrying);

            if (taskTimedOut)
            {
                throw new BuilderException(this, string.Format(System.Globalization.CultureInfo.CurrentCulture, "HttpStatusTask timed out while checking status for: '{0}'", this.RequestSettings.Uri));
            }

            Log.Debug("Writing output...");
            XmlWriter writer = taskResult.GetWriter();

            writer.WriteStartElement("httpStatus");
            writer.WriteAttributeString("uri", this.RequestSettings.Uri.ToString());
            writer.WriteAttributeString("success", XmlConvert.ToString(taskResult.Success));
            if (!String.IsNullOrEmpty(this.Description))
            {
                writer.WriteElementString("description", this.Description);
            }

            foreach (HttpRequestStatus status in resp)
            {
                status.WriteTo(writer, this.IncludeContent);
            }

            writer.WriteEndElement();
            writer.Close();
            result.AddTaskResult(taskResult);
            Log.Debug("HttpStatusTask finished, return value: {0}", taskResult.Success.ToString(CultureInfo.CurrentCulture));
            return(taskResult.Success);
        }