-
-
Notifications
You must be signed in to change notification settings - Fork 36
/
request_interception_spec.rb
159 lines (137 loc) · 5.92 KB
/
request_interception_spec.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
require 'spec_helper'
RSpec.describe 'request interception', skip: Puppeteer.env.firefox? do
it 'should intercept', sinatra: true do
page.request_interception = true
page.on('request') do |request|
if request.url.include?('favicon.ico')
request.continue
next
end
expect(request.url).to include('/empty.html')
expect(request.headers['user-agent']).not_to be_nil
expect(request.headers['accept']).not_to be_nil
expect(request.method).to eq('GET')
expect(request.post_data).to be_nil
expect(request.navigation_request?).to eq(true)
expect(request.resource_type).to eq('document')
request.continue
end
response = page.goto(server_empty_page)
expect(response.ok?).to eq(true)
end
it 'should indicate alreay-handled if an intercept has been handled', sinatra: true do
page.request_interception = true
page.on('request', &:continue)
page.on('request') do |request|
expect(request.intercept_resolution_handled?).to eq(true)
end
page.on('request') do |request|
expect(request.intercept_resolution_state.action).to eq('already-handled')
end
page.goto(server_empty_page)
end
end
# https://github.com/puppeteer/puppeteer/blob/e2e98376b9a3fa9a2501ddc86ff6407f3b59887d/docs/api.md#cooperative-intercept-mode-and-legacy-intercept-mode
RSpec.describe 'request interception example', skip: Puppeteer.env.firefox? do
example 'Legacy Mode prevails and the request is aborted', sinatra: true do
# In this example, Legacy Mode prevails and the request is aborted immediately
# because at least one handler omits priority when resolving the intercept:
# Final outcome: immediate abort()
page.request_interception = true
page.on('request') do |request|
# Legacy Mode: interception is aborted immediately.
request.abort(error_code: 'failed')
end
page.on('request') do |request|
# ['already-handled'], meaning a legacy resolution has taken place
expect(request.intercept_resolution_state.action).to eq('already-handled')
# Cooperative Mode: votes for continue at priority 0.
# Ultimately throws an exception after all handlers have finished
# running and Cooperative Mode resolutions are evaluated becasue
# abort() was called using Legacy Mode.
request.continue(priority: 0)
end
expect { page.goto(server_empty_page) }.to raise_error(/net::ERR_FAILED/)
end
example 'Legacy Mode prevails and the request is continued', sinatra: true do
# In this example, Legacy Mode prevails and the request is continued
# because at least one handler does not specify a priority:
# Final outcome: immediate continue()
page.request_interception = true
page.on('request') do |request|
# Cooperative Mode: votes to abort at priority 0.
# Ultimately throws an exception after all handlers have finished
# running and Cooperative Mode resolutions are evaluated becasue
# continue() was called using Legacy Mode.
request.abort(error_code: 'failed', priority: 0)
end
page.on('request') do |request|
# ['abort', 0], meaning an abort @ 0 is the current winning resolution
expect(request.intercept_resolution_state.action).to eq('abort')
expect(request.intercept_resolution_state.priority).to eq(0)
# Legacy Mode: intercept continues immediately.
request.continue
end
expect(page.goto(server_empty_page)).to be_a(Puppeteer::HTTPResponse)
end
example 'Cooperative Mode is active #1', sinatra: true do
# In this example, Cooperative Mode is active
# because all handlers specify a priority.
# continue() wins because it has a higher priority than abort().
# Final outcome: cooperative continue() @ 5
page.request_interception = true
page.on('request') do |request|
# Cooperative Mode: votes to abort at priority 0
request.abort(error_code: 'failed', priority: 0)
end
page.on('request') do |request|
# Cooperative Mode: votes to continue at priority 5
params = request.continue_request_overrides
params[:priority] = 5
request.continue(**params)
end
page.on('request') do |request|
# ['continue', 5], because continue @ 5 > abort @ 0
expect(request.intercept_resolution_state.action).to eq('continue')
expect(request.intercept_resolution_state.priority).to eq(5)
request.continue
end
expect(page.goto(server_empty_page)).to be_a(Puppeteer::HTTPResponse)
end
example 'Cooperative Mode is active #2', sinatra: true do
# In this example, Cooperative Mode is active
# because all handlers specify priority.
# respond() wins because its priority ties with continue(), but respond() beats continue().
# Final outcome: cooperative continue() @ 5
page.request_interception = true
page.on('request') do |request|
# Cooperative Mode: votes to abort at priority 10
request.abort(error_code: 'failed', priority: 10)
end
page.on('request') do |request|
# Cooperative Mode: votes to continue at priority 15
params = request.continue_request_overrides
params[:priority] = 15
request.continue(**params)
end
page.on('request') do |request|
# Cooperative Mode: votes to respond at priority 15
params = request.response_for_request || {}
params[:priority] = 15
request.respond(**params)
end
page.on('request') do |request|
# Cooperative Mode: votes to respond at priority 15
params = request.response_for_request || {}
params[:priority] = 12
request.respond(**params)
end
page.on('request') do |request|
# ['continue', 5], because continue @ 5 > abort @ 0
expect(request.intercept_resolution_state.action).to eq('respond')
expect(request.intercept_resolution_state.priority).to eq(15)
request.continue
end
expect(page.goto(server_empty_page)).to be_a(Puppeteer::HTTPResponse)
end
end