Parslet:如何缓冲/解析增量数据

时间:2018-11-05 23:06:58

标签: ruby parsing http-1.1 parslet

我正在使用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.

我希望能够将字节提供给解析器而不会失败,至少在它们没有超出预期的情况下。是否有办法以某种方式“缓冲”直到某些规则被打破或所有期望都得到满足?

1 个答案:

答案 0 :(得分:0)

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

如果要允许它解析部分文档,则需要定义语法,以便缺少的部分是可选的。

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

然后,您每次获取更多文档时都可以递归调用解析器……带有“其余”以及您已阅读的更多内容。

每次调用它都将返回标头的一部分。