插件解析器:引发ParseError

时间:2018-07-03 10:25:05

标签: json elixir html-parsing plug

我正在编写一个插件解析器,该插件可以使用Poison解码JSON(我更愿意让Plug.Parsers.JSON这样做,但是我需要读取原始请求正文以针对签名进行验证,因此这是不可能的。)

我正在使用Poison.decode/2来解码json。这将返回一个错误的{:error, ...}元组。作为Plug解析器,我认为如果解析期间发生错误,我会提高Plug.Parsers.ParseError。但是ParseError需要一个exception结构。我没有其中之一,我只有从Poison.decode/2返回的元组。

作为一种解决方法,我可以使用Poison.decode!/2rescue引发错误,将其重新引发为ParseError,但是当非引发{{1 }}。

我的问题越来越抽象化:

  1. 如何在没有源异常的情况下从解析器中引发decode/2
  2. 我是否需要提出ParseError,还是最好提出自己的例外情况?
  3. 是否有更好的方法,可以让我无需重新实现JSON解析就可以验证签名?

2 个答案:

答案 0 :(得分:0)

  

如何在没有源异常的情况下从解析器中引发ParseError

您应该自己创建Plug.Parsers.ParseError

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

我是否需要提出ParseError,还是最好提出自己的例外情况?

您可以提出自己想要的任何东西,但是由于确实是ParseError,所以我看不出有什么理由提出不同的东西。

  

是否有更好的方法[...]

这个人太自以为是了。 JSON解析似乎还可以。

答案 1 :(得分:0)

  

(我希望让Plug.Parsers.JSON那样做,但是我需要阅读   原始请求正文以根据签名对其进行验证,因此不是   可能)。

...

  
      
  1. 是否有更好的方法,可以让我无需重新实现JSON解析就可以验证签名?
  2.   

离开Plug.Parsers.JSON实际上是最好的选择。从1.5.1版开始,可以向解析器提供custom body reader,该解析器可以缓存主体以供以后使用。这比重新实现JSON解析器插件要通用得多。

这是我的自定义阅读器:

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