@@ -6,6 +6,8 @@ private import codeql.ruby.ApiGraphs
6
6
* A call that makes an HTTP request using `RestClient`.
7
7
* ```ruby
8
8
* RestClient.get("http://example.com").body
9
+ * RestClient::Resource.new("http://example.com").get.body
10
+ * RestClient::Request.execute(url: "http://example.com").body
9
11
* ```
10
12
*/
11
13
class RestClientHttpRequest extends HTTP:: Client:: Request:: Range {
@@ -14,18 +16,29 @@ class RestClientHttpRequest extends HTTP::Client::Request::Range {
14
16
API:: Node connectionNode ;
15
17
16
18
RestClientHttpRequest ( ) {
17
- connectionNode =
18
- [
19
- API:: getTopLevelMember ( "RestClient" ) ,
20
- API:: getTopLevelMember ( "RestClient" ) .getMember ( "Resource" ) .getInstance ( )
21
- ] and
22
- requestNode =
23
- connectionNode .getReturn ( [ "get" , "head" , "delete" , "options" , "post" , "put" , "patch" ] ) and
24
19
requestUse = requestNode .getAnImmediateUse ( ) and
25
- this = requestUse .asExpr ( ) .getExpr ( )
20
+ this = requestUse .asExpr ( ) .getExpr ( ) and
21
+ (
22
+ connectionNode =
23
+ [
24
+ API:: getTopLevelMember ( "RestClient" ) ,
25
+ API:: getTopLevelMember ( "RestClient" ) .getMember ( "Resource" ) .getInstance ( )
26
+ ] and
27
+ requestNode =
28
+ connectionNode .getReturn ( [ "get" , "head" , "delete" , "options" , "post" , "put" , "patch" ] )
29
+ or
30
+ connectionNode = API:: getTopLevelMember ( "RestClient" ) .getMember ( "Request" ) and
31
+ requestNode = connectionNode .getReturn ( "execute" )
32
+ )
26
33
}
27
34
28
- override DataFlow:: Node getURL ( ) { result = requestUse .getArgument ( 0 ) }
35
+ override DataFlow:: Node getURL ( ) {
36
+ result = requestUse .getKeywordArgument ( "url" )
37
+ or
38
+ result = requestUse .getArgument ( 0 ) and
39
+ // this rules out the alternative above
40
+ not result .asExpr ( ) .getExpr ( ) instanceof Pair
41
+ }
29
42
30
43
override DataFlow:: Node getResponseBody ( ) { result = requestNode .getAMethodCall ( "body" ) }
31
44
0 commit comments