def unescape_encoded_uri_component(escaped_string): """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).decode('utf-8')
def unescape_encoded_uri_component(escaped_string): # type: (Text) -> Text """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).decode('utf-8') # type: ignore[no-any-return, no-untyped-call]
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.DEV_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. self.response.headers[ 'Content-Type'] = python_utils.convert_to_bytes( '%s/%s' % (asset_type, file_format)) if page_context == feconf.ENTITY_TYPE_SUBTOPIC: entity_type = feconf.ENTITY_TYPE_TOPIC topic = topic_fetchers.get_topic_by_name(page_identifier) entity_id = topic.id elif (page_context == feconf.ENTITY_TYPE_EXPLORATION or page_context == feconf.ENTITY_TYPE_SKILL or page_context == feconf.ENTITY_TYPE_TOPIC or page_context == feconf.ENTITY_TYPE_STORY): entity_type = page_context entity_id = page_identifier else: raise self.InvalidInputException fs = fs_domain.AbstractFileSystem( fs_domain.DatastoreBackedFileSystem(entity_type, entity_id)) 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.write(raw) except: raise self.PageNotFoundException
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[b'Content-Type'] = ( python_utils.convert_to_bytes(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.write(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): """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: str. 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 unescape_encoded_uri_component(escaped_string): """Unescape a string that is encoded with encodeURIComponent.""" return python_utils.urllib_unquote(escaped_string).decode('utf-8')
def test_urllib_unquote(self): response = python_utils.urllib_unquote(b'/El%20Ni%C3%B1o/') self.assertEqual(response, b'/El Niño/')