@@ -5,65 +5,48 @@ private import codeql.ruby.ApiGraphs
5
5
private import codeql.ruby.dataflow.internal.DataFlowPublic
6
6
7
7
/**
8
- * A shortcut for uses of Net::HTTP
9
- */
10
- private API:: Node netHTTP ( ) { result = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) }
11
-
12
- /**
13
- * A call that returns the response body of a `Net::HTTP` request as a String.
8
+ * A `Net::HTTP` call which initiates an HTTP request.
14
9
* ```ruby
10
+ * Net::HTTP.get("http://example.com/")
11
+ * Net::HTTP.post("http://example.com/", "some_data")
15
12
* req = Net::HTTP.new("example.com")
16
13
* response = req.get("/")
17
- * body = response.body
18
14
* ```
19
15
*/
20
- private class NetHTTPRequestResponseBody extends CallNode {
21
- DataFlow:: CallNode requestCall ;
16
+ class NetHTTPRequest extends HTTP:: Client:: Request:: Range {
17
+ private DataFlow:: CallNode request ;
18
+ private DataFlow:: Node responseBody ;
22
19
23
- NetHTTPRequestResponseBody ( ) {
24
- exists ( string methodName , API:: Node requestCallNode |
25
- requestCall = requestCallNode .getAnImmediateUse ( )
20
+ NetHTTPRequest ( ) {
21
+ exists ( API:: Node requestNode , string method |
22
+ request = requestNode .getAnImmediateUse ( ) and
23
+ this = request .asExpr ( ) .getExpr ( )
26
24
|
27
25
// Net::HTTP.get(...)
28
- methodName = "get" and
29
- requestCallNode = netHTTP ( ) . getReturn ( methodName ) and
30
- this = requestCall
26
+ method = "get" and
27
+ requestNode = API :: getTopLevelMember ( "Net" ) . getMember ( "HTTP" ) . getReturn ( method ) and
28
+ responseBody = request
31
29
or
32
30
// Net::HTTP.post(...).body
33
- methodName in [ "post" , "post_form" ] and
34
- requestCallNode = netHTTP ( ) . getReturn ( methodName ) and
35
- this = requestCallNode .getAMethodCall ( [ "body" , "read_body" , "entity" ] )
31
+ method in [ "post" , "post_form" ] and
32
+ requestNode = API :: getTopLevelMember ( "Net" ) . getMember ( "HTTP" ) . getReturn ( method ) and
33
+ responseBody = requestNode .getAMethodCall ( [ "body" , "read_body" , "entity" ] )
36
34
or
37
35
// Net::HTTP.new(..).get(..).body
38
- methodName in [
36
+ method in [
39
37
"get" , "get2" , "request_get" , "head" , "head2" , "request_head" , "delete" , "put" , "patch" ,
40
38
"post" , "post2" , "request_post" , "request"
41
39
] and
42
- requestCallNode = netHTTP ( ) . getInstance ( ) .getReturn ( methodName ) and
43
- this = requestCallNode .getAMethodCall ( [ "body" , "read_body" , "entity" ] )
40
+ requestNode = API :: getTopLevelMember ( "Net" ) . getMember ( "HTTP" ) . getInstance ( ) .getReturn ( method ) and
41
+ responseBody = requestNode .getAMethodCall ( [ "body" , "read_body" , "entity" ] )
44
42
)
45
43
}
46
44
47
- /**
48
- * Gets the node representing the method call that initiates the request.
49
- * This may be different from the node which returns the response body.
50
- */
51
- DataFlow:: Node getRequestCall ( ) { result = requestCall }
52
-
53
45
/**
54
46
* Gets the node representing the URL of the request.
55
47
* Currently unused, but may be useful in future, e.g. to filter out certain requests.
56
48
*/
57
- DataFlow:: Node getURLArgument ( ) { result = requestCall .getArgument ( 0 ) }
58
- }
59
-
60
- /**
61
- * A `Net::HTTP` call which initiates an HTTP request.
62
- */
63
- class NetHTTPRequest extends HTTP:: Client:: Request:: Range {
64
- private NetHTTPRequestResponseBody responseBody ;
65
-
66
- NetHTTPRequest ( ) { this = responseBody .getRequestCall ( ) .asExpr ( ) .getExpr ( ) }
49
+ DataFlow:: Node getURLArgument ( ) { result = request .getArgument ( 0 ) }
67
50
68
51
override DataFlow:: Node getResponseBody ( ) { result = responseBody }
69
52
0 commit comments