@@ -229,7 +229,6 @@ bool TrimAndTakeStartLine(ref SequenceReader<byte> reader)
229
229
if ( ! _parser . ParseRequestLine ( new Http1ParsingHandler ( this ) , ref trimmedReader ) )
230
230
{
231
231
// We read the maximum allowed but didn't complete the start line.
232
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestLine ) ;
233
232
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . RequestLineTooLong ) ;
234
233
}
235
234
@@ -273,7 +272,6 @@ bool TrimAndTakeMessageHeaders(ref SequenceReader<byte> reader, bool trailers)
273
272
if ( ! _parser . ParseHeaders ( new Http1ParsingHandler ( this , trailers ) , ref trimmedReader ) )
274
273
{
275
274
// We read the maximum allowed but didn't complete the headers.
276
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
277
275
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . HeadersExceedMaxTotalSize ) ;
278
276
}
279
277
@@ -608,12 +606,10 @@ internal void EnsureHostHeaderExists()
608
606
return ;
609
607
}
610
608
611
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
612
609
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . MissingHostHeader ) ;
613
610
}
614
611
else if ( hostCount > 1 )
615
612
{
616
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
617
613
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . MultipleHostHeaders ) ;
618
614
}
619
615
else if ( _requestTargetForm != HttpRequestTarget . OriginForm )
@@ -722,7 +718,6 @@ protected override bool TryParseRequest(ReadResult result, out bool endConnectio
722
718
}
723
719
catch ( InvalidOperationException ) when ( _requestProcessingStatus == RequestProcessingStatus . ParsingHeaders )
724
720
{
725
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
726
721
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . MalformedRequestInvalidHeaders ) ;
727
722
throw ;
728
723
}
@@ -751,11 +746,9 @@ protected override bool TryParseRequest(ReadResult result, out bool endConnectio
751
746
endConnection = true ;
752
747
return true ;
753
748
case RequestProcessingStatus . ParsingRequestLine :
754
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
755
749
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . InvalidRequestLine ) ;
756
750
break ;
757
751
case RequestProcessingStatus . ParsingHeaders :
758
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
759
752
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . MalformedRequestInvalidHeaders ) ;
760
753
break ;
761
754
}
@@ -771,7 +764,6 @@ protected override bool TryParseRequest(ReadResult result, out bool endConnectio
771
764
{
772
765
// In this case, there is an ongoing request but the start line/header parsing has timed out, so send
773
766
// a 408 response.
774
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . RequestHeadersTimeout ) ;
775
767
KestrelBadHttpRequestException . Throw ( RequestRejectionReason . RequestHeadersTimeout ) ;
776
768
}
777
769
@@ -787,26 +779,20 @@ protected override bool TryParseRequest(ReadResult result, out bool endConnectio
787
779
}
788
780
}
789
781
782
+ internal static ConnectionEndReason GetConnectionEndReason ( Microsoft . AspNetCore . Http . BadHttpRequestException ex )
783
+ {
790
784
#pragma warning disable CS0618 // Type or member is obsolete
791
- private void OnBadRequest ( ReadOnlySequence < byte > requestData , BadHttpRequestException ex )
785
+ var kestrelEx = ex as BadHttpRequestException ;
792
786
#pragma warning restore CS0618 // Type or member is obsolete
793
- {
794
- var reason = ex . Reason ;
795
787
796
- // Some code shared between HTTP versions throws errors. For example, HttpRequestHeaders collection
797
- // throws when an invalid content length is set.
798
- // Only want to set a reasons for HTTP/1.1 connection, so set end reason by catching the exception here.
799
- switch ( reason )
788
+ switch ( kestrelEx ? . Reason )
800
789
{
801
790
case RequestRejectionReason . UnrecognizedHTTPVersion :
802
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidHttpVersion ) ;
803
- DetectHttp2Preface ( requestData ) ;
804
- break ;
791
+ return ConnectionEndReason . InvalidHttpVersion ;
805
792
case RequestRejectionReason . InvalidRequestLine :
806
793
case RequestRejectionReason . RequestLineTooLong :
807
794
case RequestRejectionReason . InvalidRequestTarget :
808
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestLine ) ;
809
- break ;
795
+ return ConnectionEndReason . InvalidRequestLine ;
810
796
case RequestRejectionReason . InvalidRequestHeadersNoCRLF :
811
797
case RequestRejectionReason . InvalidRequestHeader :
812
798
case RequestRejectionReason . InvalidContentLength :
@@ -821,16 +807,31 @@ private void OnBadRequest(ReadOnlySequence<byte> requestData, BadHttpRequestExce
821
807
case RequestRejectionReason . MissingHostHeader :
822
808
case RequestRejectionReason . MultipleHostHeaders :
823
809
case RequestRejectionReason . InvalidHostHeader :
824
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . InvalidRequestHeaders ) ;
825
- break ;
810
+ return ConnectionEndReason . InvalidRequestHeaders ;
826
811
case RequestRejectionReason . TlsOverHttpError :
827
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . TlsOverHttp ) ;
828
- break ;
812
+ return ConnectionEndReason . TlsOverHttp ;
813
+ case RequestRejectionReason . UnexpectedEndOfRequestContent :
814
+ return ConnectionEndReason . UnexpectedEndOfRequestContent ;
829
815
default :
830
816
// In some scenarios the end reason might already be set to a more specific error
831
817
// and attempting to set the reason again has no impact.
832
- KestrelMetrics . AddConnectionEndReason ( MetricsContext , ConnectionEndReason . OtherError ) ;
833
- break ;
818
+ return ConnectionEndReason . OtherError ;
819
+ }
820
+ }
821
+
822
+ #pragma warning disable CS0618 // Type or member is obsolete
823
+ private void OnBadRequest ( ReadOnlySequence < byte > requestData , BadHttpRequestException ex )
824
+ #pragma warning restore CS0618 // Type or member is obsolete
825
+ {
826
+ // Some code shared between HTTP versions throws errors. For example, HttpRequestHeaders collection
827
+ // throws when an invalid content length is set.
828
+ // Only want to set a reasons for HTTP/1.1 connection, so set end reason by catching the exception here.
829
+ var reason = GetConnectionEndReason ( ex ) ;
830
+ KestrelMetrics . AddConnectionEndReason ( MetricsContext , reason ) ;
831
+
832
+ if ( ex . Reason == RequestRejectionReason . UnrecognizedHTTPVersion )
833
+ {
834
+ DetectHttp2Preface ( requestData ) ;
834
835
}
835
836
}
836
837
0 commit comments