@@ -45,8 +45,26 @@ local function get_boundary()
4545 return match (header , " ;%s*boundary=([^\" ,;]+)" )
4646end
4747
48+ local function read_line_construct (sock , lf_line_break )
49+ local line_end = " \r\n "
50+ if lf_line_break then
51+ line_end = " \n "
52+ end
53+ local read_line , err = sock :receiveuntil (line_end )
54+ if lf_line_break and read_line then
55+ return function (arg )
56+ local ret , err_inner = read_line (arg )
57+ if ret and ret :sub (- 1 ,- 1 ) == ' \r ' then
58+ ret = ret :sub (1 ,- 2 )
59+ end
60+ return ret , err_inner
61+ end
62+ else
63+ return read_line , err
64+ end
65+ end
4866
49- function _M .new (self , chunk_size , max_line_size )
67+ function _M .new (self , chunk_size , max_line_size , lf_line_break )
5068 local boundary = get_boundary ()
5169
5270 -- print("boundary: ", boundary)
@@ -67,7 +85,7 @@ function _M.new(self, chunk_size, max_line_size)
6785 return nil , err
6886 end
6987
70- local read_line , err = sock : receiveuntil ( " \r\n " )
88+ local read_line , err = read_line_construct ( sock , lf_line_break )
7189 if not read_line then
7290 return nil , err
7391 end
@@ -79,7 +97,8 @@ function _M.new(self, chunk_size, max_line_size)
7997 read2boundary = read2boundary ,
8098 read_line = read_line ,
8199 boundary = boundary ,
82- state = STATE_BEGIN
100+ state = STATE_BEGIN ,
101+ lf_line_break = lf_line_break
83102 }, mt )
84103end
85104
@@ -143,7 +162,17 @@ local function read_body_part(self)
143162 if not chunk then
144163 local sock = self .sock
145164
146- local data = sock :receive (2 )
165+ local data , err = sock :receive (1 )
166+
167+ -- partial lookahead: -- or CRLF?
168+ if data == " -" or data == " \r " then
169+ local next
170+ next , err = sock :receive (1 )
171+ if next then
172+ data = data .. next
173+ end
174+ end
175+
147176 if data == " --" then
148177 local ok , err = discard_rest (self )
149178 if not ok then
@@ -154,7 +183,7 @@ local function read_body_part(self)
154183 return " part_end"
155184 end
156185
157- if data ~= " \r\n " then
186+ if data ~= " \r\n " and not ( data == " \n " and self . lf_line_break ) then
158187 local ok , err = discard_line (self )
159188 if not ok then
160189 return nil , nil , err
0 commit comments