@@ -664,12 +664,12 @@ internal struct TaskCancelEvent {}
664
664
665
665
internal class TaskHandler < Delegate: HTTPClientResponseDelegate > : RemovableChannelHandler {
666
666
enum State {
667
- case idle
668
- case bodySent
669
- case sent
670
- case head
667
+ case inactive
668
+ case sending_waiting
669
+ case sending_head
670
+ case sent_waiting
671
+ case sent_head
671
672
case redirected( HTTPResponseHead , URL )
672
- case body
673
673
case endOrError
674
674
}
675
675
@@ -679,7 +679,7 @@ internal class TaskHandler<Delegate: HTTPClientResponseDelegate>: RemovableChann
679
679
let ignoreUncleanSSLShutdown : Bool
680
680
let logger : Logger // We are okay to store the logger here because a TaskHandler is just for one request.
681
681
682
- var state : State = . idle
682
+ var state : State = . inactive
683
683
var expectedBodyLength : Int ?
684
684
var actualBodyLength : Int = 0
685
685
var pendingRead = false
@@ -794,7 +794,8 @@ extension TaskHandler: ChannelDuplexHandler {
794
794
typealias OutboundOut = HTTPClientRequestPart
795
795
796
796
func write( context: ChannelHandlerContext , data: NIOAny , promise: EventLoopPromise < Void > ? ) {
797
- self . state = . idle
797
+ self . state = . sending_waiting
798
+
798
799
let request = self . unwrapOutboundIn ( data)
799
800
800
801
var head = HTTPRequestHead ( version: HTTPVersion ( major: 1 , minor: 1 ) ,
@@ -840,23 +841,27 @@ extension TaskHandler: ChannelDuplexHandler {
840
841
self . writeBody ( request: request, context: context)
841
842
} . flatMap {
842
843
context. eventLoop. assertInEventLoop ( )
844
+
843
845
if case . endOrError = self . state {
844
846
return context. eventLoop. makeSucceededFuture ( ( ) )
847
+ } else if case . sending_waiting = self . state {
848
+ self . state = . sent_waiting
849
+ } else if case . sending_head = self . state {
850
+ self . state = . sent_head
845
851
}
846
852
847
- self . state = . bodySent
848
853
if let expectedBodyLength = self . expectedBodyLength, expectedBodyLength != self . actualBodyLength {
849
854
let error = HTTPClientError . bodyLengthMismatch
850
855
return context. eventLoop. makeFailedFuture ( error)
851
856
}
852
857
return context. writeAndFlush ( self . wrapOutboundOut ( . end( nil ) ) )
853
858
} . map {
854
859
context. eventLoop. assertInEventLoop ( )
860
+
855
861
if case . endOrError = self . state {
856
862
return
857
863
}
858
864
859
- self . state = . sent
860
865
self . callOutToDelegateFireAndForget ( self . delegate. didSendRequest)
861
866
} . flatMapErrorThrowing { error in
862
867
context. eventLoop. assertInEventLoop ( )
@@ -902,7 +907,7 @@ extension TaskHandler: ChannelDuplexHandler {
902
907
903
908
private func writeBodyPart( context: ChannelHandlerContext , part: IOData , promise: EventLoopPromise < Void > ) {
904
909
switch self . state {
905
- case . idle :
910
+ case . sending_waiting , . sending_head :
906
911
if let limit = self . expectedBodyLength, self . actualBodyLength + part. readableBytes > limit {
907
912
let error = HTTPClientError . bodyLengthMismatch
908
913
self . errorCaught ( context: context, error: error)
@@ -933,6 +938,10 @@ extension TaskHandler: ChannelDuplexHandler {
933
938
case . head( let head) :
934
939
if case . endOrError = self . state {
935
940
return
941
+ } else if case . sending_waiting = self . state {
942
+ self . state = . sending_head
943
+ } else if case . sent_waiting = self . state {
944
+ self . state = . sent_head
936
945
}
937
946
938
947
if !head. isKeepAlive {
@@ -942,7 +951,6 @@ extension TaskHandler: ChannelDuplexHandler {
942
951
if let redirectURL = self . redirectHandler? . redirectTarget ( status: head. status, headers: head. headers) {
943
952
self . state = . redirected( head, redirectURL)
944
953
} else {
945
- self . state = . head
946
954
self . mayRead = false
947
955
self . callOutToDelegate ( value: head, channelEventLoop: context. eventLoop, self . delegate. didReceiveHead)
948
956
. whenComplete { result in
@@ -954,7 +962,6 @@ extension TaskHandler: ChannelDuplexHandler {
954
962
case . redirected, . endOrError:
955
963
break
956
964
default :
957
- self . state = . body
958
965
self . mayRead = false
959
966
self . callOutToDelegate ( value: body, channelEventLoop: context. eventLoop, self . delegate. didReceiveBodyPart)
960
967
. whenComplete { result in
@@ -1009,10 +1016,10 @@ extension TaskHandler: ChannelDuplexHandler {
1009
1016
1010
1017
func channelInactive( context: ChannelHandlerContext ) {
1011
1018
switch self . state {
1019
+ case . inactive, . sending_waiting, . sending_head, . sent_waiting, . sent_head, . redirected:
1020
+ self . errorCaught ( context: context, error: HTTPClientError . remoteConnectionClosed)
1012
1021
case . endOrError:
1013
1022
break
1014
- case . body, . head, . idle, . redirected, . sent, . bodySent:
1015
- self . errorCaught ( context: context, error: HTTPClientError . remoteConnectionClosed)
1016
1023
}
1017
1024
context. fireChannelInactive ( )
1018
1025
}
@@ -1025,8 +1032,7 @@ extension TaskHandler: ChannelDuplexHandler {
1025
1032
/// Some HTTP Servers can 'forget' to respond with CloseNotify when client is closing connection,
1026
1033
/// this could lead to incomplete SSL shutdown. But since request is already processed, we can ignore this error.
1027
1034
break
1028
- case . head where self . ignoreUncleanSSLShutdown,
1029
- . body where self . ignoreUncleanSSLShutdown:
1035
+ case . sent_head where self . ignoreUncleanSSLShutdown:
1030
1036
/// We can also ignore this error like `.end`.
1031
1037
break
1032
1038
default :
@@ -1035,7 +1041,7 @@ extension TaskHandler: ChannelDuplexHandler {
1035
1041
}
1036
1042
default :
1037
1043
switch self . state {
1038
- case . idle , . bodySent , . sent , . head , . redirected , . body :
1044
+ case . inactive , . sending_waiting , . sending_head , . sent_waiting , . sent_head , . redirected :
1039
1045
self . state = . endOrError
1040
1046
self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
1041
1047
case . endOrError:
0 commit comments