@@ -16,17 +16,30 @@ private import codeql.ruby.DataFlow
16
16
*/
17
17
class TyphoeusHttpRequest extends Http:: Client:: Request:: Range , DataFlow:: CallNode {
18
18
API:: Node requestNode ;
19
+ boolean directResponse ;
19
20
20
21
TyphoeusHttpRequest ( ) {
21
22
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
+ )
25
32
}
26
33
27
34
override DataFlow:: Node getAUrlPart ( ) { result = this .getArgument ( 0 ) }
28
35
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
+ }
30
43
31
44
/** Gets the value that controls certificate validation, if any. */
32
45
DataFlow:: Node getCertificateValidationControllingValue ( ) {
@@ -55,3 +68,26 @@ private module TyphoeusDisablesCertificateValidationConfig implements DataFlow::
55
68
56
69
private module TyphoeusDisablesCertificateValidationFlow =
57
70
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