Raven.Client.Connection.HttpJsonRequest.ReadStringInternal C# (CSharp) Method

ReadStringInternal() private method

private ReadStringInternal ( Func getResponse ) : string
getResponse Func
return string
		private string ReadStringInternal(Func<WebResponse> getResponse)
		{
			WebResponse response;
			try
			{
				response = getResponse();
				sp.Stop();
			}
			catch (WebException e)
			{
				sp.Stop();
				var httpWebResponse = e.Response as HttpWebResponse;
				if (httpWebResponse == null || 
					httpWebResponse.StatusCode == HttpStatusCode.Unauthorized ||
					httpWebResponse.StatusCode == HttpStatusCode.NotFound ||
						httpWebResponse.StatusCode == HttpStatusCode.Conflict)
				{
					int httpResult = -1;
					if (httpWebResponse != null)
						httpResult = (int) httpWebResponse.StatusCode;

					factory.InvokeLogRequest(owner, new RequestResultArgs
					{
						DurationMilliseconds = CalculateDuration(),
						Method = webRequest.Method,
						HttpResult = httpResult,
						Status = RequestStatus.ErrorOnServer,
						Result = e.Message,
						Url = webRequest.RequestUri.PathAndQuery,
						PostedData = postedData
					});
					throw;
				}

				if (httpWebResponse.StatusCode == HttpStatusCode.NotModified
					&& CachedRequestDetails != null)
				{
					factory.UpdateCacheTime(this);
					var result = factory.GetCachedResponse(this);

					factory.InvokeLogRequest(owner, new RequestResultArgs
					{
						DurationMilliseconds = CalculateDuration(),
						Method = webRequest.Method,
						HttpResult = (int) httpWebResponse.StatusCode,
						Status = RequestStatus.Cached,
						Result = result,
						Url = webRequest.RequestUri.PathAndQuery,
						PostedData = postedData
					});

					return result;
				}

				using (var sr = new StreamReader(e.Response.GetResponseStreamWithHttpDecompression()))
				{
					var readToEnd = sr.ReadToEnd();

					factory.InvokeLogRequest(owner, new RequestResultArgs
					{
						DurationMilliseconds = CalculateDuration(),
						Method = webRequest.Method,
						HttpResult = (int)httpWebResponse.StatusCode,
						Status = RequestStatus.Cached,
						Result = readToEnd,
						Url = webRequest.RequestUri.PathAndQuery,
						PostedData = postedData
					});

					throw new InvalidOperationException(readToEnd, e);
				}
			}
			
			ResponseHeaders = response.Headers;
			ResponseStatusCode = ((HttpWebResponse) response).StatusCode;
			using (var responseStream = response.GetResponseStreamWithHttpDecompression())
			{
				var reader = new StreamReader(responseStream);
				var text = reader.ReadToEnd();
				reader.Close();

				if(Method == "GET" && ShouldCacheRequest)
				{
					factory.CacheResponse(Url, text, ResponseHeaders);
				}

				factory.InvokeLogRequest(owner, new RequestResultArgs
				{
					DurationMilliseconds = CalculateDuration(),
					Method = webRequest.Method,
					HttpResult = (int)ResponseStatusCode,
					Status = RequestStatus.SentToServer,
					Result = text,
					Url = webRequest.RequestUri.PathAndQuery,
					PostedData = postedData
				});

				return text;
			}
		}