Source code for gssa.http_transferrer
from zope.interface import implementer
import urllib.request as urllib2
import os
import logging
import requests
logger = logging.getLogger(__name__)
from .error import Error, makeError
from .transferrer import ITransferrer
# Gets input files from an HTTP source
@implementer(ITransferrer)
[docs]class HTTPTransferrer:
    def __init__(self):
        pass
[docs]    def connect(self):
        pass 
[docs]    def disconnect(self):
        logger.debug("Disconnecting") 
[docs]    def pull_files(self, files, root, remote_root):
        """Uses downloadFile to pull."""
        for local, remote in files.items():
            remote_url = "%s/%s" % (self._url, remote)
            absolute_path = os.path.join(root, local)
            logger.debug("Download File From: " + remote_url)
            logger.debug("Download File To:" + absolute_path)
            directory = os.path.dirname(absolute_path)
            logger.debug("Directory Created: " + directory)
            os.makedirs(directory, exist_ok=True)
            self.downloadFile(remote_url, absolute_path) 
[docs]    def push_files(self, files, root, remote_root):
        """Push using HTTP (unless we are told to use `tmp`)."""
        for local, remote in files.items():
            absolute_path = os.path.join(root, local)
            logger.debug("Uploading from: " + absolute_path + " to:" + remote)
            self.uploadFile(absolute_path, remote) 
[docs]    def downloadFile(self, sourceUrlStr, destinationStr):
        """Downloads a file from the source URL to the destination (typically a folder).
        This just grabs using urllib GET.
        Args:
            sourceUrlStr: Url of the file which will be downloaded
            destinationStr: FullPath to the destination
        """
        if not os.path.exists(destinationStr):
            '''Check If we have downloaded the file already'''
            logger.debug("Download: " + sourceUrlStr + " to " + destinationStr)
            '''download the file'''
            try:
                serverFile = urllib2.urlopen(sourceUrlStr)
            except:
                raise RuntimeError(makeError(Error.E_SERVER, "download failed"))
            localFile = open(destinationStr, "wb")
            localFile.write(serverFile.read())
            serverFile.close()
            localFile.close() 
[docs]    def uploadFile(self, sourcePath, destinationUrl):
        """Uploads the file located in sourcePath to the destinationUrl.
        This uploads with a POST.
        Args:
            sourcePath: fullpath to the file which will be uploaded
            destinationUrl: Url where the file is send to
        """
        logger.debug("upload " + sourcePath + " to " + destinationUrl)
        try:
            f = {'file': open(sourcePath, 'rb')}
        except:
            logger.warning("file " + sourcePath + " does not exist.")
        try:
            r = requests.post(destinationUrl,
                              files=f)
        except:
            logger.exception("Server error!")
        if (r.status_code != 200):
            logger.error("Upload Failed")