@@ -135,7 +135,7 @@ function _M.new(_)
135
135
return nil , err
136
136
end
137
137
return setmetatable ({
138
- sock = sock , keepalive_supported = true , keepalive_ready = false
138
+ sock = sock , keepalive_supported = true , reader_state = { keepalive_ready = false , mark_keepalive_ready_on_body_read = true }
139
139
}, mt )
140
140
end
141
141
@@ -211,7 +211,7 @@ function _M.set_keepalive(self, ...)
211
211
end
212
212
213
213
if self .keepalive_supported == true then
214
- if not self .keepalive_ready then
214
+ if not self .reader_state . keepalive_ready then
215
215
return nil , " response not fully read"
216
216
end
217
217
435
435
_M .transfer_encoding_is_chunked = transfer_encoding_is_chunked
436
436
437
437
438
- local function _reader_keepalive_ready_mark (http_client )
439
- return function ()
440
- http_client .keepalive_ready = true
441
- end
442
- end
443
-
444
- local function _reader_keepalive_ready_no_op ()
445
- return function () end
446
- end
447
-
448
-
449
- local function _chunked_body_reader (keepalive_ready_callback , sock , default_chunk_size )
438
+ local function _chunked_body_reader (reader_state , sock , default_chunk_size )
450
439
return co_wrap (function (max_chunk_size )
451
440
local remaining = 0
452
441
local length
@@ -505,12 +494,14 @@ local function _chunked_body_reader(keepalive_ready_callback, sock, default_chun
505
494
506
495
until length == 0
507
496
508
- keepalive_ready_callback ()
497
+ if reader_state .mark_keepalive_ready_on_body_read then
498
+ reader_state .keepalive_ready = true
499
+ end
509
500
end )
510
501
end
511
502
512
503
513
- local function _body_reader (keepalive_ready_callback , sock , content_length , default_chunk_size )
504
+ local function _body_reader (reader_state , sock , content_length , default_chunk_size )
514
505
return co_wrap (function (max_chunk_size )
515
506
max_chunk_size = max_chunk_size or default_chunk_size
516
507
@@ -540,8 +531,9 @@ local function _body_reader(keepalive_ready_callback, sock, content_length, defa
540
531
elseif not max_chunk_size then
541
532
-- We have a length and potentially keep-alive, but want everything.
542
533
co_yield (sock :receive (content_length ))
543
- keepalive_ready_callback ()
544
-
534
+ if reader_state .mark_keepalive_ready_on_body_read then
535
+ reader_state .keepalive_ready = true
536
+ end
545
537
else
546
538
-- We have a length and potentially a keep-alive, and wish to stream
547
539
-- the response.
@@ -569,7 +561,9 @@ local function _body_reader(keepalive_ready_callback, sock, content_length, defa
569
561
end
570
562
571
563
until length == 0
572
- keepalive_ready_callback ()
564
+ if reader_state .mark_keepalive_ready_on_body_read then
565
+ reader_state .keepalive_ready = true
566
+ end
573
567
end
574
568
end )
575
569
end
@@ -608,10 +602,11 @@ local function _read_body(res)
608
602
end
609
603
610
604
611
- local function _trailer_reader (keepalive_ready_callback , sock )
605
+ local function _trailer_reader (reader_state , sock )
612
606
return co_wrap (function ()
613
607
co_yield (_receive_headers (sock ))
614
- keepalive_ready_callback ()
608
+ -- We can always pool after reading trailers
609
+ reader_state .keepalive_ready = true
615
610
end )
616
611
end
617
612
@@ -677,7 +672,7 @@ function _M.send_request(self, params)
677
672
setmetatable (params , { __index = DEFAULT_PARAMS })
678
673
679
674
-- Sending a new request makes keepalive disabled until its response is fully read
680
- self .keepalive_ready = false
675
+ self .reader_state . keepalive_ready = false
681
676
682
677
local sock = self .sock
683
678
local body = params .body
@@ -830,23 +825,16 @@ function _M.read_response(self, params)
830
825
local trailer_reader
831
826
local has_body = false
832
827
local has_trailer = false
833
- local body_reader_keepalive_ready_callback
834
828
835
- if res_headers [" Trailer" ] then
836
- has_trailer = true
837
- -- If there are trailers - fully reading response body doesn't mean socket is ready to be pooled
838
- body_reader_keepalive_ready_callback = _reader_keepalive_ready_no_op ()
839
- else
840
- -- If there are no trailers - fully reading response body means socket is ready to be pooled
841
- body_reader_keepalive_ready_callback = _reader_keepalive_ready_mark (self )
842
- end
829
+ has_trailer = (res_headers [" Trailer" ] ~= nil )
830
+ self .reader_state .mark_keepalive_ready_on_body_read = not has_trailer
843
831
844
832
-- Receive the body_reader
845
833
if _should_receive_body (params .method , status ) then
846
834
has_body = true
847
835
848
836
if version == 1.1 and transfer_encoding_is_chunked (res_headers ) then
849
- body_reader , err = _chunked_body_reader (body_reader_keepalive_ready_callback , sock )
837
+ body_reader , err = _chunked_body_reader (self . reader_state , sock )
850
838
else
851
839
local length
852
840
ok , length = pcall (tonumber , res_headers [" Content-Length" ])
@@ -855,17 +843,17 @@ function _M.read_response(self, params)
855
843
length = nil
856
844
end
857
845
858
- body_reader , err = _body_reader (body_reader_keepalive_ready_callback , sock , length )
846
+ body_reader , err = _body_reader (self . reader_state , sock , length )
859
847
end
860
848
else
861
849
if not has_trailer then
862
850
-- If there's no body and no trailer - it's ready for keep-alive
863
- self .keepalive_ready = true
851
+ self .reader_state . keepalive_ready = true
864
852
end
865
853
end
866
854
867
855
if has_trailer then
868
- trailer_reader , err = _trailer_reader (_reader_keepalive_ready_mark ( self ) , sock )
856
+ trailer_reader , err = _trailer_reader (self . reader_state , sock )
869
857
end
870
858
871
859
if err then
@@ -1024,14 +1012,15 @@ function _M.get_client_body_reader(_, chunksize, sock)
1024
1012
end
1025
1013
end
1026
1014
1027
- local reader_keep_alive_ready_callback = _reader_keepalive_ready_no_op ()
1015
+ -- Reading the request body has nothing to do with pooling the upstream server socket
1016
+ local request_body_reader_state = { mark_keepalive_ready_on_body_read = false }
1028
1017
local headers = ngx_req_get_headers ()
1029
1018
local length = headers .content_length
1030
1019
if length then
1031
- return _body_reader (reader_keep_alive_ready_callback , sock , tonumber (length ), chunksize )
1020
+ return _body_reader (request_body_reader_state , sock , tonumber (length ), chunksize )
1032
1021
elseif transfer_encoding_is_chunked (headers ) then
1033
1022
-- Not yet supported by ngx_lua but should just work...
1034
- return _chunked_body_reader (reader_keep_alive_ready_callback , sock , chunksize )
1023
+ return _chunked_body_reader (request_body_reader_state , sock , chunksize )
1035
1024
else
1036
1025
return nil
1037
1026
end
0 commit comments