/// <summary>
        /// Downloads a report to stream.
        /// </summary>
        /// <param name="downloadUrl">The download url.</param>
        /// <param name="postBody">The POST body.</param>
        private ReportResponse DownloadReport(string downloadUrl, string postBody)
        {
            AdWordsErrorHandler errorHandler = new AdWordsErrorHandler(this.User as AdWordsUser);
              while (true) {
            WebResponse response = null;
            HttpWebRequest request = BuildRequest(downloadUrl, postBody);

            LogEntry logEntry = new LogEntry(User.Config, new DefaultDateTimeProvider());

            logEntry.LogRequest(request, postBody, HEADERS_TO_MASK);

            try {
              response = request.GetResponse();

              logEntry.LogResponse(response, false, "Response truncated.");
              logEntry.Flush();
              return new ReportResponse(response);
            } catch (WebException e) {
              Exception reportsException = null;

              string contents = HttpUtilities.GetErrorResponseBody(e);

              logEntry.LogResponse(e.Response, true, contents);
              logEntry.Flush();

              reportsException = ParseException(e, contents);

              if (AdWordsErrorHandler.IsOAuthTokenExpiredError(reportsException)) {
            reportsException = new AdWordsCredentialsExpiredException(
                request.Headers["Authorization"]);
              }
              if (errorHandler.ShouldRetry(reportsException)) {
            errorHandler.PrepareForRetry(reportsException);
              } else {
            throw reportsException;
              }
            }
              }
        }