Plug Parser: повышение ParseError - PullRequest
0 голосов
/ 03 июля 2018

Я пишу Plug Parser, который, помимо прочего, декодирует JSON с использованием Poison (я бы предпочел, чтобы Plug.Parsers.JSON сделал это, но мне нужно прочитать необработанное тело запроса, чтобы проверить его по сигнатуре, так что это не так возможно).

Я использую Poison.decode/2 для декодирования JSON. Это возвращает {:error, ...} кортеж при ошибке. Как синтаксический анализатор Plug, я думаю, что ожидается повышение Plug.Parsers.ParseError, если во время синтаксического анализа произошла ошибка. Однако ParseError ожидает структуру exception. У меня нет одного из них, у меня есть только кортеж, возвращенный с Poison.decode/2.

В качестве обходного пути я могу использовать Poison.decode!/2 и rescue повышенную ошибку, повторно поднимая ее как ParseError, но это кажется странным, когда без повышения decode/2 есть в наличии.

Итак, мои вопросы в возрастающей абстрактности:

  1. Как мне вызвать ParseError из анализатора без исключения источника?
  2. Мне нужно поднять ParseError, или лучше поднять мое собственное исключение?
  3. Есть ли вообще лучший способ, позволяющий мне проверять подпись без повторной реализации анализа JSON?

Ответы [ 2 ]

0 голосов
/ 06 октября 2018

(я бы предпочел, чтобы Plug.Parsers.JSON сделал это, но мне нужно прочитать необработанное тело запроса для проверки его на соответствие подписи, так что это не возможно).

...

  1. Есть ли вообще лучший способ, позволяющий мне проверять подпись без повторной реализации анализа JSON?

Позволить Plug.Parsers.JSON сделать это на самом деле лучший вариант. Начиная с версии 1.5.1, можно предоставить специальную программу чтения тела для анализатора, которая может кэшировать тело для дальнейшего использования. Это гораздо более общее решение, чем повторная реализация плагина JSON-parser.

Вот мой пользовательский ридер:

def read_body(conn, opts) do
  case Plug.Conn.read_body(conn, opts) do
    {res, body, conn} when res in [:ok, :more] ->
      {res, body, update_in(conn.assigns[:raw_body], &((&1 || "") <> body))}

    unknown ->
      unknown
  end
end
0 голосов
/ 03 июля 2018

Как вывести ParseError из анализатора без исключения источника?

Ожидается, что вы сами создадите Plug.Parsers.ParseError:

raise %Plug.Parsers.ParseError{exception: %MyException{message: "Failed to parse"}}

Мне нужно поднять ParseError, или лучше поднять мое собственное исключение?

Вы можете поднять все, что хотите, но так как это действительно ParseError Я не вижу никакой причины поднимать что-то другое.

Есть ли вообще лучший способ [...]

Этот слишком самоуверенный. С JSON-разбором все в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...