Skip to content

Commit b658bac

Browse files
committed
Simplify Net::HTTP modelling
1 parent 3000587 commit b658bac

File tree

1 file changed

+20
-37
lines changed
  • ql/lib/codeql/ruby/frameworks/stdlib/net

1 file changed

+20
-37
lines changed

ql/lib/codeql/ruby/frameworks/stdlib/net/HTTP.qll

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -5,65 +5,48 @@ private import codeql.ruby.ApiGraphs
55
private 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

Comments
 (0)