RTSP URL на Python: разбор адреса и скрытие пароля
Адреса камер отличаются форматом пути, учётными данными и способом записи хоста. Напишите parse_stream_url, чтобы извлечь поля и скрыть пароль перед записью адреса в журнал. Используйте стандартную библиотеку Python; настоящая камера не нужна.
Программа курса «Computer Vision Engineer: от детекции и Doc-AI до продакшна».
Разбор адреса потока
Задание
Сервис подключается к десятку камер, и адреса приходят из конфигурации в том виде, в каком их выдали на объекте: у одной путь своего формата с параметрами запроса, у второй IPv6 вместо имени, у третьей пароль со спецсимволами в процентной кодировке. Прежде чем такой адрес попадёт в журнал, его надо разобрать на части и убрать из него пароль.
Реализуйте функцию parse_stream_url(url). Аргумент — строка адреса. Вернуть словарь ровно с восемью ключами:
scheme— схема в нижнем регистре;user— имя пользователя со снятой процентной кодировкой;None, если учётных данных в адресе нет вовсе (нет@);password— пароль со снятой процентной кодировкой;None, если пароль в адресе не задан (нет двоеточия в учётных данных);host— хост в нижнем регистре, у адреса IPv6 — без квадратных скобок;port— целое число; если порт в адресе не указан,554;path— путь без параметров запроса; пустая строка, если пути нет;query— параметры запроса без ведущего?; пустая строка, если их нет;safe— строка адреса, пригодная для журнала.
Что такое safe. Это исходная строка, в которой пароль заменён на ***. Пароль заменяется в том виде, в каком он записан в адресе, — вместе с процентной кодировкой, если она там есть, — а всё остальное остаётся символ в символ как во входной строке. Когда пароль в адресе не задан, safe совпадает с url. Пароль, заданный пустым, скрывается наравне с остальными: в safe на его месте появляется ***.
Пример
parse_stream_url("rtsp://operator:s3cret@192.168.1.64:554/Streaming/Channels/101")
# {'scheme': 'rtsp', 'user': 'operator', 'password': 's3cret',
# 'host': '192.168.1.64', 'port': 554,
# 'path': '/Streaming/Channels/101', 'query': '',
# 'safe': 'rtsp://operator:***@192.168.1.64:554/Streaming/Channels/101'}
parse_stream_url("rtsp://cam.local/cam/realmonitor?channel=1&subtype=0")
# {'scheme': 'rtsp', 'user': None, 'password': None,
# 'host': 'cam.local', 'port': 554,
# 'path': '/cam/realmonitor', 'query': 'channel=1&subtype=0',
# 'safe': 'rtsp://cam.local/cam/realmonitor?channel=1&subtype=0'}
Примечание
Адрес приходит одной строкой и разбору поддаётся: схема на месте, скобки у IPv6 расставлены, двоеточие перед портом стоит только вместе с цифрами. Стандартная библиотека доступна целиком, включая urllib.parse. Вызывать функцию вручную не нужно, проверка запускает её сама.
Что проверяется
Код проверок скрыт, так что вот полный список того, что в них разбирается:
- формат ответа: словарь ровно с восемью перечисленными ключами,
port— целое число,safe— строка; - оба вызова из примера;
- адрес без учётных данных и адрес с именем пользователя, но без пароля;
- учётные данные с пустым именем пользователя и учётные данные с пустым паролем;
- пароль и имя пользователя со спецсимволами в процентной кодировке;
- пароль совпадает с номером порта, с именем пользователя или с куском пути;
- порт указан явно и совпадает со значением по умолчанию;
- хост IPv6 в квадратных скобках — с портом и без него;
- хост записан заглавными буквами, схема записана заглавными буквами;
- путь с параметрами запроса, путь без параметров и адрес без пути — в том числе с параметрами запроса при пустом пути.
Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.
Отправьте решение, чтобы увидеть результаты тестов.
