質問編集履歴

1

追加情報の記述

2022/01/01 06:56

投稿

HalsekiRaika
HalsekiRaika

スコア6

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
+ ```