webutils.py revision cf22150eaeeb72431bf1cf65c309a431454fb22b
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# -*- coding: utf-8 -*-
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncCommon Web Utility Functions.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncCopyright (C) 2012-2014 Oracle Corporation
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncThis file is part of VirtualBox Open Source Edition (OSE), as
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncavailable from http://www.virtualbox.org. This file is free software;
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncyou can redistribute it and/or modify it under the terms of the GNU
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncGeneral Public License (GPL) as published by the Free Software
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncFoundation, in version 2 as it comes in the "COPYING" file of the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncVirtualBox OSE distribution. VirtualBox OSE is distributed in the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsynchope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncThe contents of this file may alternatively be used under the terms
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncof the Common Development and Distribution License Version 1.0
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync(CDDL) only, as it comes in the "COPYING.CDDL" file of the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncVirtualBox OSE distribution, in which case the provisions of the
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncCDDL are applicable instead of those of the GPL.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsyncYou may elect to license modified versions of this file under the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncterms and conditions of either the GPL or the CDDL or both.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync# Standard Python imports.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync# Validation Kit imports.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync# Python 3 hacks:
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync from urllib.parse import quote as urllib_quote; # pylint: disable=F0401,E0611
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync from urllib.parse import urlencode as urllib_urlencode; # pylint: disable=F0401,E0611
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync from urllib.request import urlopen as urllib_urlopen; # pylint: disable=F0401,E0611
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync Escapes special character to HTML-safe sequences.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync Escapes special character to HTML-safe sequences.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Stringifies the object and hands it to escapeElem.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Stringifies the object and hands it to escapeAttr. May return unicode string.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync """ Escapes a javascript string that is to be emitted between double quotes. """
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync See urllib.quote().
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync See urllib.urlencode().
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync Checks if the URL has a schema (e.g. http://) or is file/server relative.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync Returns True if schema is present, False if not.
c785dbab313731d1f4662b4684c0808cc14703dbvboxsync if len(sSchema) >= 2 and len(sSchema) < 16 and sSchema.islower() and sSchema.isalpha():
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Extracts the filename from the URL.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ## @TODO This isn't entirely correct. Use the urlparser instead!
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync sFilename = os.path.basename(sUrl.replace('/', os.path.sep));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsyncdef downloadFile(sUrlFile, sDstFile, sLocalPrefix, fnLog, fnError = None, fNoProxies=True):
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Downloads the given file if an URL is given, otherwise assume it's
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync something on the build share and copy it from there.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Raises no exceptions, returns log + success indicator instead.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync Note! This method may use proxies configured on the system and the
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync http_proxy, ftp_proxy, no_proxy environment variables.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync @todo Fixed build burn here. Please set default value for fNoProxies
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync to appropriate one.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync # Download the file.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync fnLog('Downloading "%s" to "%s"...' % (sUrlFile, sDstFile));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync ## @todo We get 404.html content instead of exceptions here, which is confusing and should be addressed.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync fnError('Error downloading "%s" to "%s": %s' % (sUrlFile, sDstFile, oXcpt));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync # Assumes file from the build share.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync fnLog('Copying "%s" to "%s"...' % (sSrcPath, sDstFile));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync fnError('Error copying "%s" to "%s": %s' % (sSrcPath, sDstFile, oXcpt));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync# Unit testing.
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync# pylint: disable=C0111
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync self.assertTrue(hasSchema('http://www.oracle.com/'));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync self.assertTrue(hasSchema('https://virtualbox.com/'));
3c3a5ab35783f4d31cb5d3a15db9daadeb804daavboxsync # not reached.