Говнореестр, или как не нужно писать веб-сервисы

Скоро уже почти год, как в стране действует цензура. Несмотря на то, что конституционно она запрещена, с 1 ноября 2012 года в стране существует механизм досудебной блокировки доступа к информации в Сети. Механизм крайне неповоротливый и неэффективный. И придуман, и реализован этот механизм совками, людьми крайне далекими и от информационных технологий, и от Интернета.

В рамках этого механизма каждый оператор связи, имеющий лицензию, обязан выгружать из централизованного хранилища (ЕАИС) xml-файл, содержащий информацию о блокируемых сайтах. Выгрузка этого файла реализовывалась «специалистами» РосКомНадзора много месяцев. Результат лично у меня вызвал в свое время двойной фейспалм.

Нелогичная логика работы с сервисом

Выгрузка была организована с помощью SOAP веб-сервиса. Казалось бы, отправляй запрос, получай ответ, но не тут-то было. Работа с веб-сервисом описана в «памятке оператору связи» на профильном сайте.

Шаг 1

Проверить обновилась ли выгрузка из реестра. Для этого вызвать метод getLastDumpDate и сравнить полученное значение со значением полученным на предыдущей итерации.

Тут все предельно понятно. Защищаются от дублирующих выгрузок реестра.

Возвращает:

  • lastDumpDatelong — Время последнего обновления выгрузки из реестра

Шаг 2

В случае если выгрузка обновилась направить запрос на получение выгрузки с использованием метода sendRequest.

Этим запросом отправляются файлы запроса (xml-ка с реквизитами организации) и файл подписи запроса. В ответ нам прилетает параметр code, который в дальнейшем нужно использовать для получения собственно выгрузки. В нормальном веб-сервисе реестр вернули бы сразу, но быдлокодерам РосКомНадзора так и не хватило квалификации этого понять.

Параметры:

  • requestFilebase64Binary — Содержимое файла запроса
  • signatureFilebase64Binary — Электронная подпись файла запроса

Возвращает:

  • resultboolean — Результат обработки запроса
  • resultCommentstring — Комментарий к результату обработки запроса
  • codestring — Строка по которой необходимо получить выгрузку из реестра. Возвращается при удачной обработке запроса.

Шаг 3

Через несколько минут вызвать метод getResult для получения результата обработки запроса. В случае если запрос не обработан еще (см. содержимое поля resultComment) повторить шаг 3 через несколько минут.

Параметры:

  • codestring — Строка полученная в результате вызова метода sendRequest

Возвращает:

  • resultboolean — Результат обработки запроса
  • resultCommentstring — Комментарий к результату
    обработки запроса
  • registerZipArchivebase64Binary — Файл zip-архив с выгрузкой из
    реестра

Зачем так усложнять? Мало того, что реестр не возвращается сразу. Мало того, что в xml файл кладется zip архив с xml файлом (в этот момент рукожопие архитектора веб-сервиса зашкаливает). Не предусмотрены даже коды ошибок! И это вылезает боком на практике.

Практика

Как работает выгрузка реестра, когда все работает так, как задумано:

  1. Скрипт оператора вызывает sendRequest и сохраняет code
  2. Скрипт оператора начинает периодически вызывать getResult, пока не получает result равный true.
  3. После этого парсится xml реестра и выполняются мероприятия по блокировке

Однако же по неведомым причинам идентификаторы code внутри ЕАИС РосКомНадзора иногда «протухают». Это приводит к следующему:

  1. Скрипт оператора вызывает sendRequest и сохраняет code
  2. Скрипт оператора начинает периодически вызывать getResult. Поскольку полученный code отсутствует в ЕАИС, getResult перманентно возвращает false.
  3. В итоге скрипт оператора никогда не получит выгрузку, мероприятия по блокировке произведены не будут

В конечном итоге это приводит к тому, что оператор связи, реализовавший автоматизированную выгрузку реестра в полном соответствии с «памяткой оператору связи», на деле реестр не выгружает.

Как бороться

Как показала практика, нужно как минимум запоминать и проверять время получения идентификатора code. Если getResult в течение долгого времени возвращает false, то скорее всего код уже протух. Можно смотреть на поле resultComment, но надо иметь в виду, что возвращаемые в этом поле значения вообще никак не документированы.

И обязательно посетите сайт РосКомСвободы. Информация должна быть свободной!

Говнореестр, или как не нужно писать веб-сервисы: 8 комментариев

  1. Проверяй каждый час, ставь в цикле проверки гетРезалт условия выхода, маленький чтоли и с говняными api работать не научился? =) Данные все равно два раза в день по факту меняются, хотя функция гетластдамп сцуко все равно возвращает новое значение даты, вот это меня реально бесило. Ну и непонятно почему они так долго готовят ответ.

  2. Там хохма вообще, в переписке выяснилось, что токен на выгрузку живет в течении календарного дня (по московскому времени), когда он был получен. Т.е. если запросил реестр в 23:59, а за результатом пошел в 00:01 — токен уже будет протухший )

    1. хаха=) а не говорили че так долго ответ готовят? в очередь ставят задачу на формирование подписанного ответа и по шедулеру ее выполняют?

  3. You could certainly see your skills within the work you write. The world hopes for more passionate writers like you who arent afraid to say how they believe. Always follow your heart.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *