private string ReadDataFromSocket(string buildLogXmlUrl, int port, int fetchLogSize)
        {
            if (fetchLogSize > 160000)
                throw new Exception("Read data request was too large");

            var webResult = "";
            var request = new OptimizedHTTPRequest(new HTTPSocket())
                              {
                                  CooldownMS = 5000,
                                  NumberOfRetries = 10
                              };
            webResult = request.RequestURL(buildLogXmlUrl, port, fetchLogSize);

            if (string.IsNullOrEmpty(webResult))
                throw new Exception("HTTP request did not return any data");


            if (Regex.IsMatch(webResult, @"\<build .*\>") == false)
            {
                return ReadDataFromSocket(buildLogXmlUrl, port, fetchLogSize * 2);
            }

            var xmlData = Regex.Match(webResult, ".+(<cruisecontrol.*<build .+?>)", RegexOptions.Singleline | RegexOptions.IgnoreCase).Groups[1].Value;

            xmlData += " </build>\n</cruisecontrol>\n";

            return xmlData;
        }
        public void Setup()
        {
            httpRequestMock = new Mock<IHTTPSocket>();
            optimizedHTTPRequest = new OptimizedHTTPRequest(httpRequestMock.Object);
            httpRequestMock.Setup(m => m.Read(It.IsAny<int>())).Returns(GenerateHTTPResponse("FILE CONTENT"));

            httpRequestMock.SetupGet(m => m.IsConnected).Returns(true);
        }
        public void assure_to_handle_heavy_load_with_large_files()
        {
            ManualResetEvent resetEvent = new ManualResetEvent(false);
            const int bytesToFetch = 90000;
            const int numberOfRequests = 50;
            int completedRequests = 0;

            bool[] successfulRequests = new bool[numberOfRequests];

            for (int i = 0; i < numberOfRequests; i++)
            {
                int index = i;
                ThreadPool.QueueUserWorkItem((o) =>
                {
                    try
                    {
                        OptimizedHTTPRequest testRequest = new OptimizedHTTPRequest(new HTTPSocket());

                        string result = testRequest.RequestURL(LONGFILE_URL, 80, bytesToFetch);

                        if (result.Length != bytesToFetch)
                            throw new Exception("only got " + result.Length + " bytes");
                        successfulRequests[index] = true;

                        Console.WriteLine("File request {0} completed, {1} bytes returned", index, bytesToFetch);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine("File request {0} FAILED", index);
                        Console.WriteLine(ex);
                    }
                    finally
                    {
                        completedRequests++;
                        if (completedRequests == numberOfRequests)
                            resetEvent.Set();
                    }
                });
            }

            resetEvent.WaitOne();
            successfulRequests.Where(r => r == true).Count().ShouldBe(numberOfRequests);
        }
        public void Setup()
        {
            optimizedHTTPRequest = new OptimizedHTTPRequest( new HTTPSocket());

        }