@@ -814,9 +814,8 @@ extension TaskHandler: ChannelDuplexHandler {
814814 do {
815815 try headers. validate ( method: request. method, body: request. body)
816816 } catch {
817+ self . errorCaught ( context: context, error: error)
817818 promise? . fail ( error)
818- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
819- self . state = . endOrError
820819 return
821820 }
822821
@@ -843,9 +842,8 @@ extension TaskHandler: ChannelDuplexHandler {
843842 self . state = . bodySent
844843 context. eventLoop. assertInEventLoop ( )
845844 if let expectedBodyLength = self . expectedBodyLength, expectedBodyLength != self . actualBodyLength {
846- self . state = . endOrError
847845 let error = HTTPClientError . bodyLengthMismatch
848- self . failTaskAndNotifyDelegate ( error : error , self . delegate . didReceiveError )
846+ self . errorCaught ( context : context , error : error )
849847 return context. eventLoop. makeFailedFuture ( error)
850848 }
851849 return context. writeAndFlush ( self . wrapOutboundOut ( . end( nil ) ) )
@@ -855,13 +853,7 @@ extension TaskHandler: ChannelDuplexHandler {
855853 self . callOutToDelegateFireAndForget ( self . delegate. didSendRequest)
856854 } . flatMapErrorThrowing { error in
857855 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)
865857 throw error
866858 } . cascade ( to: promise)
867859 }
@@ -906,17 +898,15 @@ extension TaskHandler: ChannelDuplexHandler {
906898 case . idle:
907899 if let limit = self . expectedBodyLength, self . actualBodyLength + part. readableBytes > limit {
908900 let error = HTTPClientError . bodyLengthMismatch
909- self . state = . endOrError
910- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
901+ self . errorCaught ( context: context, error: error)
911902 promise. fail ( error)
912903 return
913904 }
914905 self . actualBodyLength += part. readableBytes
915906 context. writeAndFlush ( self . wrapOutboundOut ( . body( part) ) , promise: promise)
916907 default :
917908 let error = HTTPClientError . writeAfterRequestSent
918- self . state = . endOrError
919- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
909+ self . errorCaught ( context: context, error: error)
920910 promise. fail ( error)
921911 }
922912 }
@@ -983,26 +973,21 @@ extension TaskHandler: ChannelDuplexHandler {
983973 context. read ( )
984974 }
985975 case . failure( let error) :
986- self . state = . endOrError
987- self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
976+ self . errorCaught ( context: context, error: error)
988977 }
989978 }
990979
991980 func userInboundEventTriggered( context: ChannelHandlerContext , event: Any ) {
992981 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)
996983 } else {
997984 context. fireUserInboundEventTriggered ( event)
998985 }
999986 }
1000987
1001988 func triggerUserOutboundEvent( context: ChannelHandlerContext , event: Any , promise: EventLoopPromise < Void > ? ) {
1002989 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)
1006991 promise? . succeed ( ( ) )
1007992 } else {
1008993 context. triggerUserOutboundEvent ( event, promise: promise)
@@ -1014,9 +999,7 @@ extension TaskHandler: ChannelDuplexHandler {
1014999 case . endOrError:
10151000 break
10161001 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)
10201003 }
10211004 context. fireChannelInactive ( )
10221005 }
@@ -1038,14 +1021,20 @@ extension TaskHandler: ChannelDuplexHandler {
10381021 self . failTaskAndNotifyDelegate ( error: error, self . delegate. didReceiveError)
10391022 }
10401023 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+ }
10431032 }
10441033 }
10451034
10461035 func handlerAdded( context: ChannelHandlerContext ) {
10471036 guard context. channel. isActive else {
1048- self . failTaskAndNotifyDelegate ( error: HTTPClientError . remoteConnectionClosed, self . delegate . didReceiveError )
1037+ self . errorCaught ( context : context , error: HTTPClientError . remoteConnectionClosed)
10491038 return
10501039 }
10511040 }
0 commit comments