From bc402b6409639f130f2ef7f13c9e240194de859c Mon Sep 17 00:00:00 2001 From: Matthew Wild Date: Wed, 21 Oct 2020 10:34:16 +0100 Subject: net.http.parser: Expose 'partial', 'chunked' and 'body_length' on packets --- net/http/parser.lua | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) (limited to 'net') diff --git a/net/http/parser.lua b/net/http/parser.lua index 3470ffb1..96f17fdb 100644 --- a/net/http/parser.lua +++ b/net/http/parser.lua @@ -47,6 +47,7 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) if state and client and not len then -- reading client body until EOF buffer:collapse(); packet.body = buffer:read_chunk() or ""; + packet.partial = nil; success_cb(packet); state = nil; elseif buffer:length() ~= 0 then -- unexpected EOF @@ -96,6 +97,9 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) httpversion = httpversion; headers = headers; body = false; + body_length = len; + chunked = chunked; + partial = true; -- COMPAT the properties below are deprecated responseversion = httpversion; responseheaders = headers; @@ -122,6 +126,8 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) headers = headers; body = false; body_sink = nil; + chunked = chunked; + partial = true; }; end if len and len > bodylimit then @@ -157,6 +163,7 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) buf = buf:gsub("^.-\r\n\r\n", ""); -- This ensure extensions and trailers are stripped buffer:write(buf); state, chunked = nil, nil; + packet.partial = nil; success_cb(packet); elseif buffer:length() - chunk_start - 2 >= chunk_size then -- we have a chunk buffer:discard(chunk_start - 1); -- TODO verify that it's not off-by-one @@ -176,11 +183,17 @@ function httpstream.new(success_cb, error_cb, parser_type, options_cb) return error_cb("body-sink-write-failure"); end end - if len == 0 then state = nil; success_cb(packet); end + if len == 0 then + state = nil; + packet.partial = nil; + success_cb(packet); + end elseif buffer:length() >= len then assert(not chunked) packet.body = buffer:read(len) or ""; - state = nil; success_cb(packet); + state = nil; + packet.partial = nil; + success_cb(packet); else break; end -- cgit v1.2.3