質問編集履歴
1
追加情報の記述
test
CHANGED
File without changes
|
test
CHANGED
@@ -255,3 +255,139 @@
|
|
255
255
|
serde_derive = "1.0.130"
|
256
256
|
|
257
257
|
```
|
258
|
+
|
259
|
+
|
260
|
+
|
261
|
+
### 追加情報
|
262
|
+
|
263
|
+
・`rustup override set` を使用して`rustc 1.56.0 (09c42c458 2021-10-18)`に切り替えて実行したところ特に解決するということは起こりませんでした。
|
264
|
+
|
265
|
+
![イメージ説明](b85ae49a7d2357a2d152ecde3398e81d.png)
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
・`Cargo.toml`内の`Edition`を2021から2018に変更しても同じ事が起きます。
|
270
|
+
|
271
|
+
![イメージ説明](c484fea0a5066675b573096a787e577a.png)
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
・ブラウザ等の環境問題も疑い、[こちら](https://github.com/megumish/actix-web-original-middleware-example)のコードを拝借して実行したところ、二重で発火するということは起こりませんでした。
|
276
|
+
|
277
|
+
なお、このコードの依存関係のバージョンを今のプロジェクトに合わせると変更が大きく加わるのでアップデート等の操作は行っていません。
|
278
|
+
|
279
|
+
![イメージ説明](cd6540c25eeed2ce2f0f7f085ead146d.png)
|
280
|
+
|
281
|
+
![イメージ説明](89720e421581bae11c37984521f5fa89.png)
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
コードの変更箇所
|
286
|
+
|
287
|
+
```rust
|
288
|
+
|
289
|
+
// main.rs LINE: 82
|
290
|
+
|
291
|
+
fn call(&mut self, mut service_request: Self::Request) -> Self::Future {
|
292
|
+
|
293
|
+
println!("task start!"); // デバッグ用に追加
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
// if Request path is "/hack_secret", then overwrite truly secret uri.
|
298
|
+
|
299
|
+
if service_request.path() == "/hack_secret" {
|
300
|
+
|
301
|
+
let secret_uri = "/f18b211dd1744570bb643e800308b1e4"
|
302
|
+
|
303
|
+
.parse::<http::Uri>()
|
304
|
+
|
305
|
+
.unwrap();
|
306
|
+
|
307
|
+
service_request
|
308
|
+
|
309
|
+
.match_info_mut()
|
310
|
+
|
311
|
+
.get_mut()
|
312
|
+
|
313
|
+
.update(&secret_uri);
|
314
|
+
|
315
|
+
}
|
316
|
+
|
317
|
+
Box::new(self.service.call(service_request).map(|mut res| {
|
318
|
+
|
319
|
+
// When this middleware is set, it append my custom header to received response.
|
320
|
+
|
321
|
+
let header_name = http::HeaderName::from_lowercase(b"hacker-code").unwrap();
|
322
|
+
|
323
|
+
let header_value =
|
324
|
+
|
325
|
+
http::HeaderValue::from_str("69de96e2-d5b0-41d4-89b8-864222140e24").unwrap();
|
326
|
+
|
327
|
+
res.headers_mut().append(header_name, header_value);
|
328
|
+
|
329
|
+
res
|
330
|
+
|
331
|
+
}))
|
332
|
+
|
333
|
+
}
|
334
|
+
|
335
|
+
}
|
336
|
+
|
337
|
+
```
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
・また、テストに使用しているLoggerを`println!()`に置き換えても該当部分の二重発火は観測できました。
|
342
|
+
|
343
|
+
![イメージ説明](a076fb8122138e39372eb2a40153be8d.png)
|
344
|
+
|
345
|
+
|
346
|
+
|
347
|
+
コードの変更箇所
|
348
|
+
|
349
|
+
```rust
|
350
|
+
|
351
|
+
// auth.rs LINE: 43
|
352
|
+
|
353
|
+
fn call(&self, req: ServiceRequest) -> Self::Future {
|
354
|
+
|
355
|
+
let logger = Rc::new(Logger::new(Some("TestMiddleware")));
|
356
|
+
|
357
|
+
//let serv = self.service.clone();
|
358
|
+
|
359
|
+
|
360
|
+
|
361
|
+
// Why is this method firing twice...
|
362
|
+
|
363
|
+
//logger.debug("task call from middleware start.");
|
364
|
+
|
365
|
+
println!("task call from middleware start."); // printlnマクロに変更
|
366
|
+
|
367
|
+
|
368
|
+
|
369
|
+
// Todo: Write Token Validator Task (2021/12/30 23:54)
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
self.service.call(req)
|
374
|
+
|
375
|
+
// Box::pin(async move {
|
376
|
+
|
377
|
+
// let res = serv.call(req).await?;
|
378
|
+
|
379
|
+
// println!("headers: {:?}", res.headers());
|
380
|
+
|
381
|
+
// // ここにあるメソッドも二度実行された。
|
382
|
+
|
383
|
+
// logger.debug("cage task call from middleware response");
|
384
|
+
|
385
|
+
//
|
386
|
+
|
387
|
+
// Ok(res)
|
388
|
+
|
389
|
+
// })
|
390
|
+
|
391
|
+
}
|
392
|
+
|
393
|
+
```
|