Skip to content

Commit 616afbf

Browse files
Copilotioquatix
andcommitted
Add capture? method for pre-filtering requests
Co-authored-by: ioquatix <30030+ioquatix@users.noreply.github.com>
1 parent cc73833 commit 616afbf

File tree

3,303 files changed

+92
-805473
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

3,303 files changed

+92
-805473
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,3 +5,4 @@
55
/gems.locked
66
/.covered.db
77
/external
8+
/vendor

lib/async/http/capture/middleware.rb

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,11 @@ def initialize(app, store:)
2929
# @parameter request [Protocol::HTTP::Request] The incoming HTTP request.
3030
# @returns [Protocol::HTTP::Response] The response from the next middleware.
3131
def call(request)
32+
# Check if we should capture this request:
33+
unless capture?(request)
34+
return super(request)
35+
end
36+
3237
# Create completion tracker for this interaction:
3338
tracker = create_interaction_tracker(request)
3439

@@ -42,6 +47,14 @@ def call(request)
4247
capture_response_with_completion(captured_request, response, tracker)
4348
end
4449

50+
# Determine whether to capture the given request.
51+
# Override this method in subclasses to implement custom filtering logic.
52+
# @parameter request [Protocol::HTTP::Request] The incoming HTTP request.
53+
# @returns [Boolean] True if the request should be captured, false otherwise.
54+
def capture?(request)
55+
true
56+
end
57+
4558
private
4659

4760
# Create a completion tracker for a single interaction.

test/async/http/capture/middleware.rb

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,4 +191,82 @@
191191
expect(interaction.to_h[:response][:status]).to be == 200
192192
end
193193
end
194+
195+
with "#capture?" do
196+
let(:get_request) do
197+
Protocol::HTTP::Request["GET", "/test", {"User-Agent" => "Test"}]
198+
end
199+
200+
let(:post_request) do
201+
Protocol::HTTP::Request[
202+
"POST",
203+
"/users",
204+
{"Content-Type" => "application/json"},
205+
['{"name": "John"}']
206+
]
207+
end
208+
209+
let(:selective_middleware) do
210+
Class.new(subject) do
211+
def initialize(app, store:)
212+
super(app, store: store)
213+
@captured_requests = []
214+
end
215+
216+
# Custom filtering logic: only capture GET requests
217+
def capture?(request)
218+
request.method == "GET"
219+
end
220+
end
221+
end
222+
223+
it "defaults to true for base middleware" do
224+
middleware = subject.new(simple_app, store: cassette_store)
225+
expect(middleware.capture?(get_request)).to be == true
226+
expect(middleware.capture?(post_request)).to be == true
227+
end
228+
229+
it "can be overridden to filter requests" do
230+
middleware = selective_middleware.new(simple_app, store: cassette_store)
231+
expect(middleware.capture?(get_request)).to be == true
232+
expect(middleware.capture?(post_request)).to be == false
233+
end
234+
235+
it "skips capturing when capture? returns false" do
236+
middleware = selective_middleware.new(simple_app, store: cassette_store)
237+
238+
# Make a POST request - should not be captured
239+
response = middleware.call(post_request)
240+
response.body.each {|chunk|} if response.body # Consume body
241+
242+
# Verify no interactions were recorded:
243+
expect(File).not.to be(:directory?, cassette_path)
244+
245+
# Make a GET request - should be captured
246+
response = middleware.call(get_request)
247+
response.body.each {|chunk|} if response.body # Consume body
248+
249+
# Verify one interaction was recorded:
250+
expect(File).to be(:directory?, cassette_path)
251+
cassette = Async::HTTP::Capture::Cassette.load(cassette_path)
252+
expect(cassette.interactions).to have_attributes(length: be == 1)
253+
expect(cassette.interactions.first.to_h[:request][:method]).to be == "GET"
254+
end
255+
256+
it "still processes requests normally when not capturing" do
257+
middleware = selective_middleware.new(echo_app, store: cassette_store)
258+
259+
# POST request should not be captured but should still work normally
260+
response = middleware.call(post_request)
261+
262+
# Echo app should still return the request body:
263+
body_content = []
264+
response.body.each {|chunk| body_content << chunk}
265+
expect(body_content).to be == ['{"name": "John"}']
266+
expect(response.status).to be == 200
267+
268+
# But no interaction should be recorded:
269+
expect(File).not.to be(:directory?, cassette_path)
270+
end
271+
end
194272
end

vendor/bundle/ruby/3.2.0/bin/bake

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/racc

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/rbs

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/rubocop

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/ruby-parse

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/ruby-rewrite

Lines changed: 0 additions & 29 deletions
This file was deleted.

vendor/bundle/ruby/3.2.0/bin/sus

Lines changed: 0 additions & 29 deletions
This file was deleted.

0 commit comments

Comments
 (0)