@@ -16,17 +16,30 @@ private import codeql.ruby.DataFlow
1616 */
1717class TyphoeusHttpRequest extends Http:: Client:: Request:: Range , DataFlow:: CallNode {
1818 API:: Node requestNode ;
19+ boolean directResponse ;
1920
2021 TyphoeusHttpRequest ( ) {
2122 this = requestNode .asSource ( ) and
22- requestNode =
23- API:: getTopLevelMember ( "Typhoeus" )
24- .getReturn ( [ "get" , "head" , "delete" , "options" , "post" , "put" , "patch" ] )
23+ (
24+ directResponse = true and
25+ requestNode =
26+ API:: getTopLevelMember ( "Typhoeus" )
27+ .getReturn ( [ "get" , "head" , "delete" , "options" , "post" , "put" , "patch" ] )
28+ or
29+ directResponse = false and
30+ requestNode = API:: getTopLevelMember ( "Typhoeus" ) .getMember ( "Request" ) .getReturn ( "new" )
31+ )
2532 }
2633
2734 override DataFlow:: Node getAUrlPart ( ) { result = this .getArgument ( 0 ) }
2835
29- override DataFlow:: Node getResponseBody ( ) { result = requestNode .getAMethodCall ( "body" ) }
36+ override DataFlow:: Node getResponseBody ( ) {
37+ directResponse = true and
38+ result = getBodyFromResponse ( requestNode )
39+ or
40+ directResponse = false and
41+ result = getBodyFromRequest ( requestNode )
42+ }
3043
3144 /** Gets the value that controls certificate validation, if any. */
3245 DataFlow:: Node getCertificateValidationControllingValue ( ) {
@@ -55,3 +68,26 @@ private module TyphoeusDisablesCertificateValidationConfig implements DataFlow::
5568
5669private module TyphoeusDisablesCertificateValidationFlow =
5770 DataFlow:: Global< TyphoeusDisablesCertificateValidationConfig > ;
71+
72+ private DataFlow:: Node getBodyFromRequest ( API:: Node requestNode ) {
73+ result =
74+ [
75+ getBodyFromResponse ( getResponseFromRequest ( requestNode ) ) ,
76+ requestNode .getMethod ( "on_body" ) .getBlock ( ) .getParameter ( 0 ) .asSource ( )
77+ ]
78+ }
79+
80+ private API:: Node getResponseFromRequest ( API:: Node requestNode ) {
81+ result =
82+ [
83+ requestNode .getReturn ( [ "run" , "response" ] ) ,
84+ requestNode
85+ .getMethod ( [ "on_complete" , "on_success" , "on_headers" , "on_failure" , "on_progress" ] )
86+ .getBlock ( )
87+ .getParameter ( 0 )
88+ ]
89+ }
90+
91+ private DataFlow:: Node getBodyFromResponse ( API:: Node responseNode ) {
92+ result = responseNode .getAMethodCall ( [ "body" , "response_body" ] )
93+ }
0 commit comments