@@ -12,15 +12,22 @@ private import codeql.ruby.DataFlow
12
12
/**
13
13
* A `Net::HTTP` call which initiates an HTTP request.
14
14
* ```ruby
15
+ * # one-off request
15
16
* Net::HTTP.get("http://example.com/")
16
17
* Net::HTTP.post("http://example.com/", "some_data")
17
18
* req = Net::HTTP.new("example.com")
18
19
* response = req.get("/")
20
+ *
21
+ * # connection re-use
22
+ * Net::HTTP.start("http://example.com") do |http|
23
+ * http.get("/")
24
+ * end
19
25
* ```
20
26
*/
21
27
class NetHttpRequest extends Http:: Client:: Request:: Range instanceof DataFlow:: CallNode {
22
28
private DataFlow:: CallNode request ;
23
- private API:: Node requestNode ;
29
+ API:: Node requestNode ;
30
+ API:: Node connectionNode ;
24
31
private boolean returnsResponseBody ;
25
32
26
33
NetHttpRequest ( ) {
@@ -30,20 +37,27 @@ class NetHttpRequest extends Http::Client::Request::Range instanceof DataFlow::C
30
37
|
31
38
// Net::HTTP.get(...)
32
39
method in [ "get" , "get_response" ] and
33
- requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getReturn ( method ) and
40
+ connectionNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) and
41
+ requestNode = connectionNode .getReturn ( method ) and
34
42
returnsResponseBody = true
35
43
or
36
44
// Net::HTTP.post(...).body
37
45
method in [ "post" , "post_form" ] and
38
- requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getReturn ( method ) and
46
+ connectionNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) and
47
+ requestNode = connectionNode .getReturn ( method ) and
39
48
returnsResponseBody = false
40
49
or
41
50
// Net::HTTP.new(..).get(..).body
51
+ // Net::HTTP.start(..) do |http| http.get(..) end
42
52
method in [
43
53
"get" , "get2" , "request_get" , "head" , "head2" , "request_head" , "delete" , "put" , "patch" ,
44
54
"post" , "post2" , "request_post" , "request"
45
55
] and
46
- requestNode = API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getInstance ( ) .getReturn ( method ) and
56
+ connectionNode = [
57
+ API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getInstance ( ) ,
58
+ API:: getTopLevelMember ( "Net" ) .getMember ( "HTTP" ) .getMethod ( "start" ) .getBlock ( ) .getParameter ( 0 )
59
+ ] and
60
+ requestNode = connectionNode .getReturn ( method ) and
47
61
returnsResponseBody = false
48
62
)
49
63
}
0 commit comments