0

我正在用 parslet 编写一个 HTTP/1 响应解析器。它有效,但只有当我发送完整的有效载荷时。

我有这样的东西:

rule(:response) {
   response_line >> crlf >>
   header.repeat.as(:headers) >> crlf >>
   data.as(:data)
}
root :response

但是如果我传递一个不完整的有效载荷,我会得到:

parser.parse("HTTP/1.1 200 OK\r\n")
#=> Parslet::ParseFailed: Failed to match sequence (RESPONSE_LINE CRLF headers:(HEADER{0, }) CRLF data:DATA) at line 1 char 16.

我希望能够在不失败的情况下向解析器提供字节,至少如果它们不违反预期的话。有没有办法以某种方式“缓冲”直到违反某些规则或满足所有期望?

4

1 回答 1

0

Parslet 将语法与整个文档进行匹配。

如果你想让它解析部分文档,你需要定义你的语法,使得缺失的部分是可选的。

一种方法可能是定义一个语法来匹配标头中的任何一个元素,并定义一个匹配“any.repeat”的“the_rest”捕获组

然后,您可以在每次获得更多文档时递归调用解析器......“其余”加上您读过的任何其他内容。

每次调用它时,您都会得到返回的标题的一部分。

于 2018-12-04T23:12:50.327 回答