@@ -73,6 +73,9 @@ private module FastApi {
7373 override Function getARequestHandler ( ) { result .getADecorator ( ) .getAFlowNode ( ) = node }
7474
7575 override string getFramework ( ) { result = "FastAPI" }
76+
77+ /** Gets the argument specifying the response class to use, if any. */
78+ DataFlow:: Node getResponseClassArg ( ) { result = this .getArgByName ( "response_class" ) }
7679 }
7780
7881 // ---------------------------------------------------------------------------
@@ -199,6 +202,65 @@ private module FastApi {
199202 }
200203 }
201204
205+ /**
206+ * An implicit response from a return of FastAPI request handler.
207+ */
208+ private class FastApiRequestHandlerReturn extends HTTP:: Server:: HttpResponse:: Range ,
209+ DataFlow:: CfgNode {
210+ FastApiRouteSetup routeSetup ;
211+
212+ FastApiRequestHandlerReturn ( ) {
213+ node = routeSetup .getARequestHandler ( ) .getAReturnValueFlowNode ( )
214+ }
215+
216+ override DataFlow:: Node getBody ( ) { result = this }
217+
218+ override DataFlow:: Node getMimetypeOrContentTypeArg ( ) { none ( ) }
219+
220+ override string getMimetypeDefault ( ) {
221+ exists ( API:: Node responseClass |
222+ responseClass .getAUse ( ) = routeSetup .getResponseClassArg ( ) and
223+ result = getDefaultMimeType ( responseClass )
224+ )
225+ or
226+ not exists ( routeSetup .getResponseClassArg ( ) ) and
227+ result = "application/json"
228+ }
229+ }
230+
231+ /**
232+ * An implicit response from a return of FastAPI request handler, that has
233+ * `response_class` set to a `FileResponse`.
234+ */
235+ private class FastApiRequestHandlerFileResponseReturn extends FastApiRequestHandlerReturn {
236+ FastApiRequestHandlerFileResponseReturn ( ) {
237+ exists ( API:: Node responseClass |
238+ responseClass .getAUse ( ) = routeSetup .getResponseClassArg ( ) and
239+ responseClass = getModeledResponseClass ( "FileResponse" ) .getASubclass * ( )
240+ )
241+ }
242+
243+ override DataFlow:: Node getBody ( ) { none ( ) }
244+ }
245+
246+ /**
247+ * An implicit response from a return of FastAPI request handler, that has
248+ * `response_class` set to a `RedirectResponse`.
249+ */
250+ private class FastApiRequestHandlerRedirectReturn extends FastApiRequestHandlerReturn ,
251+ HTTP:: Server:: HttpRedirectResponse:: Range {
252+ FastApiRequestHandlerRedirectReturn ( ) {
253+ exists ( API:: Node responseClass |
254+ responseClass .getAUse ( ) = routeSetup .getResponseClassArg ( ) and
255+ responseClass = getModeledResponseClass ( "RedirectResponse" ) .getASubclass * ( )
256+ )
257+ }
258+
259+ override DataFlow:: Node getBody ( ) { none ( ) }
260+
261+ override DataFlow:: Node getRedirectLocation ( ) { result = this }
262+ }
263+
202264 /**
203265 * INTERNAL: Do not use.
204266 *
@@ -263,23 +325,4 @@ private module FastApi {
263325 override DataFlow:: Node getValueArg ( ) { none ( ) }
264326 }
265327 }
266-
267- /**
268- * Implicit response from returns of FastAPI request handlers
269- */
270- private class FastApiRequestHandlerReturn extends HTTP:: Server:: HttpResponse:: Range ,
271- DataFlow:: CfgNode {
272- FastApiRequestHandlerReturn ( ) {
273- exists ( Function requestHandler |
274- requestHandler = any ( FastApiRouteSetup rs ) .getARequestHandler ( ) and
275- node = requestHandler .getAReturnValueFlowNode ( )
276- )
277- }
278-
279- override DataFlow:: Node getBody ( ) { result = this }
280-
281- override DataFlow:: Node getMimetypeOrContentTypeArg ( ) { none ( ) }
282-
283- override string getMimetypeDefault ( ) { result = "application/json" }
284- }
285328}
0 commit comments