code: def MakeRequest(http, http_request, retries=7, max_retry_wait=60,
                  redirections=5,
                  retry_func=HandleExceptionsAndRebuildHttpConnections,
                  check_response_func=CheckResponse):
      
      retry = 0
      first_req_time = time.time()
      while True:
          try:
              return _MakeRequestNoRetry(
                  http, http_request, redirections=redirections,
                  check_response_func=check_response_func)
          # retry_func will consume the exception types it handles and raise.
          # pylint: disable=broad-except
          except Exception as e:
              retry += 1
              if retry >= retries:
                  raise
              else:
                  total_wait_sec = time.time() - first_req_time
                  retry_func(ExceptionRetryArgs(http, http_request, e, retry,
                                                max_retry_wait, total_wait_sec))
docs: Send http_request via the given http, performing error/retry handling.
  
      Args:
        http: An httplib2.Http instance, or a http multiplexer that delegates to
            an underlying http, for example, HTTPMultiplexer.
        http_request: A Request to send.
        retries: (int, default 7) Number of retries to attempt on retryable
            replies (such as 429 or 5XX).
        max_retry_wait: (int, default 60) Maximum number of seconds to wait
            when retrying.
        redirections: (int, default 5) Number of redirects to follow.
        retry_func: Function to handle retries on exceptions. Argument is an
            ExceptionRetryArgs tuple.
        check_response_func: Function to validate the HTTP response.
            Arguments are (Response, response content, url).
  
      Raises:
        InvalidDataFromServerError: if there is no response after retries.
  
      Returns:
        A Response object.