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;
}
}