def unescape_encoded_uri_component(escaped_string: str) -> str: """Unescape a string that is encoded with encodeURIComponent. Args: escaped_string: str. String that is encoded with encodeURIComponent. Returns: str. Decoded string that was initially encoded with encodeURIComponent. """ return python_utils.urllib_unquote(escaped_string)
def get(self, page_context, page_identifier, asset_type, encoded_filename): """Returns an asset file. Args: page_context: str. The context of the page where the asset is required. page_identifier: str. The unique identifier for the particular context. Valid page_context: page_identifier pairs: exploration: exp_id story: story_id topic: topic_id skill: skill_id subtopic: topic_name of the topic that it is part of. asset_type: str. Type of the asset, either image or audio. encoded_filename: str. The asset filename. This string is encoded in the frontend using encodeURIComponent(). """ if not constants.EMULATOR_MODE: raise self.PageNotFoundException try: filename = python_utils.urllib_unquote(encoded_filename) file_format = filename[(filename.rfind('.') + 1):] # If the following is not cast to str, an error occurs in the wsgi # library because unicode gets used. content_type = ( 'image/svg+xml' if file_format == 'svg' else '%s/%s' % ( asset_type, file_format)) self.response.headers['Content-Type'] = content_type if page_context not in self._SUPPORTED_PAGE_CONTEXTS: raise self.InvalidInputException fs = fs_domain.AbstractFileSystem( fs_domain.GcsFileSystem(page_context, page_identifier)) raw = fs.get('%s/%s' % (asset_type, filename)) self.response.cache_control.no_cache = None self.response.cache_control.public = True self.response.cache_control.max_age = 600 self.response.body_file = io.BytesIO(raw) except Exception as e: logging.exception( 'File not found: %s. %s' % (encoded_filename, e)) raise self.PageNotFoundException
def convert_png_data_url_to_binary(image_data_url: str) -> bytes: """Converts a PNG base64 data URL to a PNG binary data. Args: image_data_url: str. A string that is to be interpreted as a PNG data URL. Returns: bytes. Binary content of the PNG created from the data URL. Raises: Exception. The given string does not represent a PNG data URL. """ if image_data_url.startswith(PNG_DATA_URL_PREFIX): return base64.b64decode( python_utils.urllib_unquote( image_data_url[len(PNG_DATA_URL_PREFIX):])) else: raise Exception('The given string does not represent a PNG data URL.')
def test_urllib_unquote(self): response = python_utils.urllib_unquote('/El%20Ni%C3%B1o/') self.assertEqual(response, '/El NiƱo/')