5
5
# Copyright, 2020, by Igor Sidorov.
6
6
7
7
require 'async'
8
+ require 'async/variable'
8
9
require 'async/clock'
9
10
require 'async/http/client'
10
11
require 'async/http/server'
@@ -128,29 +129,22 @@ module HTTP
128
129
end
129
130
end
130
131
131
- with 'with trailer' do
132
+ with 'with request trailer' do
133
+ let ( :request_received ) { Async ::Variable . new }
134
+
132
135
let ( :app ) do
133
136
::Protocol ::HTTP ::Middleware . for do |request |
134
137
if trailer = request . headers [ 'trailer' ]
135
138
expect ( request . headers ) . not . to have_keys ( 'etag' )
139
+
140
+ request_received . value = true
136
141
request . finish
142
+
137
143
expect ( request . headers ) . to have_keys ( 'etag' )
138
144
139
145
::Protocol ::HTTP ::Response [ 200 , [ ] , "request trailer" ]
140
146
else
141
- headers = ::Protocol ::HTTP ::Headers . new
142
- headers . add ( 'trailer' , 'etag' )
143
-
144
- body = Async ::HTTP ::Body ::Writable . new
145
-
146
- Async do |task |
147
- body . write ( "response trailer" )
148
- sleep ( 0.01 )
149
- headers . add ( 'etag' , 'abcd' )
150
- body . close
151
- end
152
-
153
- ::Protocol ::HTTP ::Response [ 200 , headers , body ]
147
+ ::Protocol ::HTTP ::Response [ 400 , headers , body ]
154
148
end
155
149
end
156
150
end
@@ -164,16 +158,41 @@ module HTTP
164
158
165
159
Async do |task |
166
160
body . write ( "Hello" )
167
- sleep ( 0.01 )
161
+
162
+ request_received . wait
168
163
headers . add ( 'etag' , 'abcd' )
164
+
169
165
body . close
170
166
end
171
167
172
168
response = client . post ( "/" , headers , body )
173
169
expect ( response . read ) . to be == "request trailer"
174
-
175
170
expect ( response ) . to be ( :success? )
176
171
end
172
+ end
173
+
174
+ with "with response trailer" do
175
+ let ( :response_received ) { Async ::Variable . new }
176
+
177
+ let ( :app ) do
178
+ ::Protocol ::HTTP ::Middleware . for do |request |
179
+ headers = ::Protocol ::HTTP ::Headers . new
180
+ headers . add ( 'trailer' , 'etag' )
181
+
182
+ body = Async ::HTTP ::Body ::Writable . new
183
+
184
+ Async do |task |
185
+ body . write ( "response trailer" )
186
+
187
+ response_received . wait
188
+ headers . add ( 'etag' , 'abcd' )
189
+
190
+ body . close
191
+ end
192
+
193
+ ::Protocol ::HTTP ::Response [ 200 , headers , body ]
194
+ end
195
+ end
177
196
178
197
it "can receive response trailer" do
179
198
skip "Protocol does not support trailers!" unless subject . bidirectional?
@@ -183,6 +202,8 @@ module HTTP
183
202
headers = response . headers
184
203
expect ( headers ) . not . to have_keys ( 'etag' )
185
204
205
+ response_received . value = true
206
+
186
207
expect ( response . read ) . to be == "response trailer"
187
208
expect ( response ) . to be ( :success? )
188
209
0 commit comments