@@ -21,8 +21,8 @@ private import codeql.ruby.dataflow.internal.DataFlowImplForHttpClientLibraries
21
21
*/
22
22
class NetHttpRequest extends Http:: Client:: Request:: Range , DataFlow:: CallNode {
23
23
private DataFlow:: CallNode request ;
24
- private DataFlow:: Node responseBody ;
25
24
private API:: Node requestNode ;
25
+ private boolean returnsResponseBody ;
26
26
27
27
NetHttpRequest ( ) {
28
28
exists ( string method |
@@ -32,20 +32,20 @@ class NetHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode {
32
32
// Net::HTTP.get(...)
33
33
method = "get" and
34
34
requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getReturn ( method ) and
35
- responseBody = request
35
+ returnsResponseBody = true
36
36
or
37
37
// Net::HTTP.post(...).body
38
38
method in [ "post" , "post_form" ] and
39
39
requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getReturn ( method ) and
40
- responseBody = requestNode . getAMethodCall ( [ "body" , "read_body" , "entity" ] )
40
+ returnsResponseBody = false
41
41
or
42
42
// Net::HTTP.new(..).get(..).body
43
43
method in [
44
44
"get" , "get2" , "request_get" , "head" , "head2" , "request_head" , "delete" , "put" , "patch" ,
45
45
"post" , "post2" , "request_post" , "request"
46
46
] and
47
47
requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getInstance ( ) .getReturn ( method ) and
48
- responseBody = requestNode . getAMethodCall ( [ "body" , "read_body" , "entity" ] )
48
+ returnsResponseBody = false
49
49
)
50
50
}
51
51
@@ -64,7 +64,11 @@ class NetHttpRequest extends Http::Client::Request::Range, DataFlow::CallNode {
64
64
)
65
65
}
66
66
67
- override DataFlow:: Node getResponseBody ( ) { result = responseBody }
67
+ override DataFlow:: Node getResponseBody ( ) {
68
+ if returnsResponseBody = true
69
+ then result = this
70
+ else result = requestNode .getAMethodCall ( [ "body" , "read_body" , "entity" ] )
71
+ }
68
72
69
73
/** Gets the value that controls certificate validation, if any. */
70
74
DataFlow:: Node getCertificateValidationControllingValue ( ) {
0 commit comments