@@ -814,9 +814,8 @@ extension TaskHandler: ChannelDuplexHandler {
814
814
do {
815
815
try headers. validate ( method: request. method, body: request. body)
816
816
} catch {
817
+ self . errorCaught ( context: context, error: error)
817
818
promise? . fail ( error)
818
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
819
- self . state = . endOrError
820
819
return
821
820
}
822
821
@@ -843,9 +842,8 @@ extension TaskHandler: ChannelDuplexHandler {
843
842
self . state = . bodySent
844
843
context. eventLoop. assertInEventLoop ( )
845
844
if let expectedBodyLength = self . expectedBodyLength, expectedBodyLength != self . actualBodyLength {
846
- self . state = . endOrError
847
845
let error = HTTPClientError . bodyLengthMismatch
848
- self . failTaskAndNotifyDelegate ( error : error , self . delegate . didReceiveError )
846
+ self . errorCaught ( context : context , error : error )
849
847
return context. eventLoop. makeFailedFuture ( error)
850
848
}
851
849
return context. writeAndFlush ( self . wrapOutboundOut ( . end( nil ) ) )
@@ -855,13 +853,7 @@ extension TaskHandler: ChannelDuplexHandler {
855
853
self . callOutToDelegateFireAndForget ( self . delegate. didSendRequest)
856
854
} . flatMapErrorThrowing { error in
857
855
context. eventLoop. assertInEventLoop ( )
858
- switch self . state {
859
- case . endOrError:
860
- break
861
- default :
862
- self . state = . endOrError
863
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
864
- }
856
+ self . errorCaught ( context: context, error: error)
865
857
throw error
866
858
} . cascade ( to: promise)
867
859
}
@@ -906,17 +898,15 @@ extension TaskHandler: ChannelDuplexHandler {
906
898
case . idle:
907
899
if let limit = self . expectedBodyLength, self . actualBodyLength + part. readableBytes > limit {
908
900
let error = HTTPClientError . bodyLengthMismatch
909
- self . state = . endOrError
910
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
901
+ self . errorCaught ( context: context, error: error)
911
902
promise. fail ( error)
912
903
return
913
904
}
914
905
self . actualBodyLength += part. readableBytes
915
906
context. writeAndFlush ( self . wrapOutboundOut ( . body( part) ) , promise: promise)
916
907
default :
917
908
let error = HTTPClientError . writeAfterRequestSent
918
- self . state = . endOrError
919
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
909
+ self . errorCaught ( context: context, error: error)
920
910
promise. fail ( error)
921
911
}
922
912
}
@@ -983,26 +973,21 @@ extension TaskHandler: ChannelDuplexHandler {
983
973
context. read ( )
984
974
}
985
975
case . failure( let error) :
986
- self . state = . endOrError
987
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
976
+ self . errorCaught ( context: context, error: error)
988
977
}
989
978
}
990
979
991
980
func userInboundEventTriggered( context: ChannelHandlerContext , event: Any ) {
992
981
if ( event as? IdleStateHandler . IdleStateEvent) == . read {
993
- self . state = . endOrError
994
- let error = HTTPClientError . readTimeout
995
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
982
+ self . errorCaught ( context: context, error: HTTPClientError . readTimeout)
996
983
} else {
997
984
context. fireUserInboundEventTriggered ( event)
998
985
}
999
986
}
1000
987
1001
988
func triggerUserOutboundEvent( context: ChannelHandlerContext , event: Any , promise: EventLoopPromise < Void > ? ) {
1002
989
if ( event as? TaskCancelEvent ) != nil {
1003
- self . state = . endOrError
1004
- let error = HTTPClientError . cancelled
1005
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
990
+ self . errorCaught ( context: context, error: HTTPClientError . cancelled)
1006
991
promise? . succeed ( ( ) )
1007
992
} else {
1008
993
context. triggerUserOutboundEvent ( event, promise: promise)
@@ -1014,9 +999,7 @@ extension TaskHandler: ChannelDuplexHandler {
1014
999
case . endOrError:
1015
1000
break
1016
1001
case . body, . head, . idle, . redirected, . sent, . bodySent:
1017
- self . state = . endOrError
1018
- let error = HTTPClientError . remoteConnectionClosed
1019
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
1002
+ self . errorCaught ( context: context, error: HTTPClientError . remoteConnectionClosed)
1020
1003
}
1021
1004
context. fireChannelInactive ( )
1022
1005
}
@@ -1038,14 +1021,20 @@ extension TaskHandler: ChannelDuplexHandler {
1038
1021
self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
1039
1022
}
1040
1023
default :
1041
- self . state = . endOrError
1042
- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
1024
+ switch self . state {
1025
+ case . idle, . bodySent, . sent, . head, . redirected, . body:
1026
+ self . state = . endOrError
1027
+ self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
1028
+ case . endOrError:
1029
+ // error was already handled
1030
+ break
1031
+ }
1043
1032
}
1044
1033
}
1045
1034
1046
1035
func handlerAdded( context: ChannelHandlerContext ) {
1047
1036
guard context. channel. isActive else {
1048
- self . failTaskAndNotifyDelegate ( error: HTTPClientError . remoteConnectionClosed, self . delegate . didReceiveError )
1037
+ self . errorCaught ( context : context , error: HTTPClientError . remoteConnectionClosed)
1049
1038
return
1050
1039
}
1051
1040
}
0 commit comments