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 в квадратных скобках — с портом и без него;
  • хост записан заглавными буквами, схема записана заглавными буквами;
  • путь с параметрами запроса, путь без параметров и адрес без пути — в том числе с параметрами запроса при пустом пути.
РешениеPython

Без регистрации. Гостевая проверка не сохраняет прогресс. Для сохранения перейдите к уроку.

Отправьте решение, чтобы увидеть результаты тестов.

Связанные задачи