Lookup an URL shortened with `is.gd - v.gd url service <http://is.gd/developers.php>`_ and return the real url
            
            :param short_url: the url shortened with .gd service
            :type short_url: str.
            
            :returns: str. -- The original url that was shortened with .gd service
            
            :raises: **IOError** when timeout with .gd service occurs
            
                **ValueError** if .gd response is malformed
                
                :class:`gdshortener.GDMalformedURLError` if the previously shortened URL provided is malformed
                
                :class:`gdshortener.GDShortURLError` if the custom URL requested is not available or disabled by .gd service
                
                :class:`gdshortener.GDRateLimitError` if the request rate is exceeded for .gd service
                
                :class:`gdshortener.GDGenericError` in case of generic error from .gd service (mainteinance)

def lookup(self, short_url):
        '''
            Lookup an URL shortened with `is.gd - v.gd url service <http://is.gd/developers.php>`_ and return the real url
            
            :param short_url: the url shortened with .gd service
            :type short_url: str.
            
            :returns: str. -- The original url that was shortened with .gd service
            
            :raises: **IOError** when timeout with .gd service occurs
            
                **ValueError** if .gd response is malformed
                
                :class:`gdshortener.GDMalformedURLError` if the previously shortened URL provided is malformed
                
                :class:`gdshortener.GDShortURLError` if the custom URL requested is not available or disabled by .gd service
                
                :class:`gdshortener.GDRateLimitError` if the request rate is exceeded for .gd service
                
                :class:`gdshortener.GDGenericError` in case of generic error from .gd service (mainteinance)            
        '''
        if short_url is None or not isinstance(short_url, basestring) or len(short_url.strip()) == 0:
            raise GDMalformedURLError('The shortened URL must be a non empty string')
        # Build data for porst
        data = {
                'format':       'json',
                'shorturl':      short_url
                }
        opener = urllib2.build_opener()
        headers = { 'User-Agent' : self._user_agent }
        req = urllib2.Request("{0}/forward.php".format(self.shortener_url), urllib.urlencode(data), headers)
        f_desc = opener.open(req, timeout = self._timeout)
        response = json.loads(f_desc.read())
        if 'url' in response:
            # Success!
            return HTMLParser.HTMLParser().unescape(urllib.unquote(response['url']))
        else:
            # Error
            error_code = int(response['errorcode'])
            error_description = str(response['errormessage'])
            if error_code == 1:
                raise GDMalformedURLError(error_description)
            if error_code == 2:
                raise GDShortURLError(error_description)
            if error_code == 3:
                raise GDRateLimitError(error_description)
            if error_code == 4:
                raise GDGenericError(error_description)