@@ -36,14 +36,12 @@ describe('resty.http.response_writer', function()
3636 describe (' .send_response' , function ()
3737
3838 it (' returns nil when no response is provided' , function ()
39- local ok , err = response_writer .send_response (mock_sock , nil )
40- assert .is_nil (ok )
39+ local err = response_writer .send_response (mock_sock , nil )
4140 assert .is_nil (err )
4241 end )
4342
4443 it (' returns error when no socket is provided' , function ()
45- local ok , err = response_writer .send_response (nil , make_response ())
46- assert .is_nil (ok )
44+ local err = response_writer .send_response (nil , make_response ())
4745 assert .equal (" socket not initialized yet" , err )
4846 end )
4947
@@ -145,18 +143,16 @@ describe('resty.http.response_writer', function()
145143
146144 it (' returns true on success' , function ()
147145 local response = make_response ()
148- local ok , err = response_writer .send_response (mock_sock , response )
146+ local err = response_writer .send_response (mock_sock , response )
149147
150- assert .is_true (ok )
151148 assert .is_nil (err )
152149 end )
153150
154151 it (' returns error when headers send fails' , function ()
155152 mock_sock .send = function () return nil , " closed" end
156153 local response = make_response ()
157- local ok , err = response_writer .send_response (mock_sock , response )
154+ local err = response_writer .send_response (mock_sock , response )
158155
159- assert .is_nil (ok )
160156 assert .truthy (string.find (err , " failed to send headers" ))
161157 end )
162158
@@ -171,9 +167,8 @@ describe('resty.http.response_writer', function()
171167 end
172168
173169 local response = make_response ({ chunks = { " hello" } })
174- local ok , err = response_writer .send_response (mock_sock , response )
170+ local err = response_writer .send_response (mock_sock , response )
175171
176- assert .is_nil (ok )
177172 assert .truthy (string.find (err , " failed to send response body" ))
178173 end )
179174
@@ -186,9 +181,8 @@ describe('resty.http.response_writer', function()
186181 return nil , " read error"
187182 end
188183 }
189- local ok , err = response_writer .send_response (mock_sock , response )
184+ local err = response_writer .send_response (mock_sock , response )
190185
191- assert .is_nil (ok )
192186 assert .truthy (string.find (err , " failed to read response body" ))
193187 end )
194188
@@ -198,9 +192,8 @@ describe('resty.http.response_writer', function()
198192 reason = " OK" ,
199193 headers = {},
200194 }
201- local ok , err = response_writer .send_response (mock_sock , response )
195+ local err = response_writer .send_response (mock_sock , response )
202196
203- assert .is_nil (ok )
204197 assert .equal (" no body reader" , err )
205198 end )
206199
@@ -238,10 +231,168 @@ describe('resty.http.response_writer', function()
238231
239232 it (' handles empty body' , function ()
240233 local response = make_response ({ chunks = {} })
241- local ok , err = response_writer .send_response (mock_sock , response )
234+ local err = response_writer .send_response (mock_sock , response )
235+
236+ assert .is_nil (err )
237+ end )
238+ end )
239+
240+ describe (' .proxy_response' , function ()
241+ local printed_data
242+ local headers_set
243+
244+ before_each (function ()
245+ printed_data = {}
246+ headers_set = {}
247+
248+ ngx .status = nil
249+ ngx .header = setmetatable ({}, {
250+ __newindex = function (_ , k , v )
251+ headers_set [k ] = v
252+ end
253+ })
254+
255+ stub (ngx , ' print' , function (data )
256+ table.insert (printed_data , data )
257+ return true
258+ end )
259+ stub (ngx , ' flush' , function () return true end )
260+ end )
261+
262+ it (' returns nil when no response is provided' , function ()
263+ local ok = response_writer .proxy_response (nil )
264+ assert .is_nil (ok )
265+ end )
266+
267+ it (' sets ngx.status from response' , function ()
268+ local res = make_response ({ status = 201 })
269+ local err = response_writer .proxy_response (res )
270+
271+ assert .is_nil (err )
272+ assert .equal (201 , ngx .status )
273+ end )
274+
275+ it (' sets response headers on ngx.header' , function ()
276+ local res = make_response ({
277+ headers = {
278+ [" Content-Type" ] = " application/json" ,
279+ [" X-Request-Id" ] = " abc123" ,
280+ }
281+ })
282+ local err = response_writer .proxy_response (res )
283+
284+ assert .is_nil (err )
285+ assert .equal (" application/json" , headers_set [" Content-Type" ])
286+ assert .equal (" abc123" , headers_set [" X-Request-Id" ])
287+ end )
288+
289+ it (' filters hop-by-hop headers' , function ()
290+ local res = make_response ({
291+ headers = {
292+ [" Connection" ] = " keep-alive" ,
293+ [" Keep-Alive" ] = " timeout=5" ,
294+ [" Transfer-Encoding" ] = " chunked" ,
295+ [" Proxy-Authenticate" ] = " Basic" ,
296+ [" Proxy-Authorization" ] = " Basic abc" ,
297+ [" TE" ] = " trailers" ,
298+ [" Trailers" ] = " Expires" ,
299+ [" Upgrade" ] = " websocket" ,
300+ [" Content-Length" ] = " 5" ,
301+ [" X-Custom" ] = " kept" ,
302+ }
303+ })
304+ local err = response_writer .proxy_response (res )
305+
306+ assert .is_nil (err )
307+ assert .is_nil (headers_set [" Connection" ])
308+ assert .is_nil (headers_set [" Keep-Alive" ])
309+ assert .is_nil (headers_set [" Transfer-Encoding" ])
310+ assert .is_nil (headers_set [" Proxy-Authenticate" ])
311+ assert .is_nil (headers_set [" Proxy-Authorization" ])
312+ assert .is_nil (headers_set [" TE" ])
313+ assert .is_nil (headers_set [" Trailers" ])
314+ assert .is_nil (headers_set [" Upgrade" ])
315+ assert .is_nil (headers_set [" Content-Length" ])
316+ assert .equal (" kept" , headers_set [" X-Custom" ])
317+ end )
318+
319+ it (' filters hop-by-hop headers case-insensitively' , function ()
320+ local res = make_response ({
321+ headers = {
322+ [" CONNECTION" ] = " close" ,
323+ [" TRANSFER-ENCODING" ] = " chunked" ,
324+ }
325+ })
326+ local err = response_writer .proxy_response (res )
327+
328+ assert .is_nil (err )
329+ assert .is_nil (headers_set [" CONNECTION" ])
330+ assert .is_nil (headers_set [" TRANSFER-ENCODING" ])
331+ end )
332+
333+ it (' prints and flushes body chunks' , function ()
334+ local res = make_response ({ chunks = { " chunk1" , " chunk2" } })
335+ local err = response_writer .proxy_response (res )
242336
243- assert .is_true (ok )
244337 assert .is_nil (err )
338+ assert .stub (ngx .print ).was_called (2 )
339+ assert .stub (ngx .print ).was_called_with (" chunk1" )
340+ assert .stub (ngx .print ).was_called_with (" chunk2" )
341+ -- assert.stub(ngx.flush).was_called(2)
342+ end )
343+
344+ it (' returns true on success' , function ()
345+ -- local res = make_response({ chunks = { "data" } })
346+ -- local ok, err = response_writer.proxy_response(res)
347+
348+ -- assert.is_true(ok)
349+ -- assert.is_nil(err)
350+ end )
351+
352+ it (' handles empty body' , function ()
353+ local res = make_response ({ chunks = {} })
354+ local err = response_writer .proxy_response (res )
355+
356+ assert .is_nil (err )
357+ assert .stub (ngx .print ).was_not_called ()
358+ end )
359+
360+ it (' returns error when ngx.print fails' , function ()
361+ ngx .print :revert ()
362+ stub (ngx , ' print' , function () return nil , " broken pipe" end )
363+
364+ local res = make_response ({ chunks = { " data" } })
365+ local err = response_writer .proxy_response (res )
366+
367+ assert .truthy (string.find (err , " output response failed" ))
368+ end )
369+
370+ it (' returns error when body reader fails' , function ()
371+ local res = {
372+ status = 200 ,
373+ headers = {},
374+ body_reader = function ()
375+ return nil , " read timeout"
376+ end
377+ }
378+ local err = response_writer .proxy_response (res )
379+
380+ assert .truthy (string.find (err , " failed to read response body" ))
381+ end )
382+
383+ it (' passes chunksize to body_reader' , function ()
384+ local received_chunksize
385+ local res = {
386+ status = 200 ,
387+ headers = {},
388+ body_reader = function (size )
389+ received_chunksize = size
390+ return nil
391+ end
392+ }
393+ response_writer .proxy_response (res , 2048 )
394+
395+ assert .equal (2048 , received_chunksize )
245396 end )
246397 end )
247398end )
0 commit comments