code: def fetch(self, url, body=None, headers=None):
          
          if body:
              method = 'POST'
          else:
              method = 'GET'
  
          if headers is None:
              headers = {}
  
          # httplib2 doesn't check to make sure that the URL's scheme is
          # 'http' so we do it here.
          if not (url.startswith('http://') or url.startswith('https://')):
              raise ValueError('URL is not a HTTP URL: %r' % (url,))
  
          httplib2_response, content = self.httplib2.request(
              url, method, body=body, headers=headers)
  
          # Translate the httplib2 response to our HTTP response abstraction
  
          # When a 400 is returned, there is no "content-location"
          # header set. This seems like a bug to me. I can't think of a
          # case where we really care about the final URL when it is an
          # error response, but being careful about it can't hurt.
          try:
              final_url = httplib2_response['content-location']
          except KeyError:
              # We're assuming that no redirects occurred
              assert not httplib2_response.previous
  
              # And this should never happen for a successful response
              assert httplib2_response.status != 200
              final_url = url
  
          return HTTPResponse(
              body=content,
              final_url=final_url,
              headers=dict(httplib2_response.items()),
              status=httplib2_response.status,
              )
docs: Perform an HTTP request
  
          @raises Exception: Any exception that can be raised by httplib2
  
          @see: C{L{HTTPFetcher.fetch}}