11namespace Microsoft . Web . Http . Dispatcher
22{
3+ using System ;
34 using System . Collections . Generic ;
45 using System . Diagnostics . CodeAnalysis ;
56 using System . Diagnostics . Contracts ;
@@ -19,25 +20,52 @@ sealed class HttpResponseExceptionFactory
1920 const string Allow = nameof ( Allow ) ;
2021 static readonly string ControllerSelectorCategory = typeof ( IHttpControllerSelector ) . FullName ;
2122 readonly HttpRequestMessage request ;
23+ readonly Lazy < ApiVersionModel > allApiVersions ;
2224
23- internal HttpResponseExceptionFactory ( HttpRequestMessage request )
25+ internal HttpResponseExceptionFactory ( HttpRequestMessage request , Lazy < ApiVersionModel > allApiVersions )
2426 {
2527 Contract . Requires ( request != null ) ;
28+ Contract . Requires ( allApiVersions != null ) ;
29+
2630 this . request = request ;
31+ this . allApiVersions = allApiVersions ;
2732 }
2833
34+ ApiVersioningOptions Options => request . GetApiVersioningOptions ( ) ;
35+
2936 ITraceWriter TraceWriter => request . GetConfiguration ( ) . Services . GetTraceWriter ( ) ?? NullTraceWriter . Instance ;
3037
31- ApiVersioningOptions Options => request . GetApiVersioningOptions ( ) ;
38+ IReportApiVersions ApiVersionReporter
39+ {
40+ get
41+ {
42+ var dependencyResolver = request . GetConfiguration ( ) . DependencyResolver ;
43+ var reporter = ( ( IReportApiVersions ) dependencyResolver . GetService ( typeof ( IReportApiVersions ) ) ) ;
44+
45+ if ( reporter == null )
46+ {
47+ reporter = Options . ReportApiVersions ? DefaultApiVersionReporter . Instance : DoNotReportApiVersions . Instance ;
48+ }
49+
50+ return reporter ;
51+ }
52+ }
3253
3354 [ SuppressMessage ( "Microsoft.Reliability" , "CA2000:Dispose objects before losing scope" , Justification = "Created exception cannot be disposed. Handled by the caller." ) ]
3455 internal HttpResponseException NewNotFoundOrBadRequestException ( ControllerSelectionResult conventionRouteResult , ControllerSelectionResult directRouteResult ) =>
3556 CreateBadRequest ( conventionRouteResult , directRouteResult ) ?? CreateNotFound ( conventionRouteResult ) ;
3657
3758 [ SuppressMessage ( "Microsoft.Reliability" , "CA2000:Dispose objects before losing scope" , Justification = "Created exception cannot be disposed. Handled by the caller." ) ]
38- internal HttpResponseMessage CreateBadRequestResponse ( ApiVersion requestedVersion ) => requestedVersion == null ?
39- CreateBadRequestForUnspecifiedApiVersionOrInvalidApiVersion ( versionNeutral : false ) :
40- CreateBadRequestForUnsupportedApiVersion ( requestedVersion ) ;
59+ internal HttpResponseMessage CreateBadRequestResponse ( ApiVersion requestedVersion )
60+ {
61+ var response = requestedVersion == null ?
62+ CreateBadRequestForUnspecifiedApiVersionOrInvalidApiVersion ( versionNeutral : false ) :
63+ CreateBadRequestForUnsupportedApiVersion ( requestedVersion ) ;
64+
65+ ApiVersionReporter . Report ( response . Headers , allApiVersions ) ;
66+
67+ return response ;
68+ }
4169
4270 [ SuppressMessage ( "Microsoft.Reliability" , "CA2000:Dispose objects before losing scope" , Justification = "Created exception cannot be disposed. Handled by the caller." ) ]
4371 internal HttpResponseException CreateBadRequest ( ApiVersion requestedVersion ) => new HttpResponseException ( CreateBadRequestResponse ( requestedVersion ) ) ;
@@ -118,6 +146,7 @@ internal HttpResponseMessage CreateMethodNotAllowedResponse( bool versionNeutral
118146
119147 if ( response != null )
120148 {
149+ ApiVersionReporter . Report ( response . Headers , allApiVersions ) ;
121150 return response ;
122151 }
123152
@@ -153,6 +182,8 @@ internal HttpResponseMessage CreateMethodNotAllowedResponse( bool versionNeutral
153182 headers . Allow . AddRange ( allowedMethods . Select ( m => m . Method ) ) ;
154183 }
155184
185+ ApiVersionReporter . Report ( response . Headers , allApiVersions ) ;
186+
156187 return response ;
157188 }
158189
0 commit comments