@@ -5,65 +5,48 @@ private import codeql.ruby.ApiGraphs
55private import codeql.ruby.dataflow.internal.DataFlowPublic
66
77/**
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.
149 * ```ruby
10+ * Net::HTTP.get("http://example.com/")
11+ * Net::HTTP.post("http://example.com/", "some_data")
1512 * req = Net::HTTP.new("example.com")
1613 * response = req.get("/")
17- * body = response.body
1814 * ```
1915 */
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 ;
2219
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 ( )
2624 |
2725 // 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
3129 or
3230 // 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" ] )
3634 or
3735 // Net::HTTP.new(..).get(..).body
38- methodName in [
36+ method in [
3937 "get" , "get2" , "request_get" , "head" , "head2" , "request_head" , "delete" , "put" , "patch" ,
4038 "post" , "post2" , "request_post" , "request"
4139 ] 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" ] )
4442 )
4543 }
4644
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-
5345 /**
5446 * Gets the node representing the URL of the request.
5547 * Currently unused, but may be useful in future, e.g. to filter out certain requests.
5648 */
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 ) }
6750
6851 override DataFlow:: Node getResponseBody ( ) { result = responseBody }
6952
0 commit comments