teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

1

追加情報の記述

2022/01/01 06:56

投稿

HalsekiRaika
HalsekiRaika

スコア6

title CHANGED
File without changes
body CHANGED
@@ -126,4 +126,72 @@
126
126
  serde = "1.0.130"
127
127
  serde_json = "1.0.68"
128
128
  serde_derive = "1.0.130"
129
+ ```
130
+
131
+ ### 追加情報
132
+ ・`rustup override set` を使用して`rustc 1.56.0 (09c42c458 2021-10-18)`に切り替えて実行したところ特に解決するということは起こりませんでした。
133
+ ![イメージ説明](b85ae49a7d2357a2d152ecde3398e81d.png)
134
+
135
+ ・`Cargo.toml`内の`Edition`を2021から2018に変更しても同じ事が起きます。
136
+ ![イメージ説明](c484fea0a5066675b573096a787e577a.png)
137
+
138
+ ・ブラウザ等の環境問題も疑い、[こちら](https://github.com/megumish/actix-web-original-middleware-example)のコードを拝借して実行したところ、二重で発火するということは起こりませんでした。
139
+ なお、このコードの依存関係のバージョンを今のプロジェクトに合わせると変更が大きく加わるのでアップデート等の操作は行っていません。
140
+ ![イメージ説明](cd6540c25eeed2ce2f0f7f085ead146d.png)
141
+ ![イメージ説明](89720e421581bae11c37984521f5fa89.png)
142
+
143
+ コードの変更箇所
144
+ ```rust
145
+ // main.rs LINE: 82
146
+ fn call(&mut self, mut service_request: Self::Request) -> Self::Future {
147
+ println!("task start!"); // デバッグ用に追加
148
+
149
+ // if Request path is "/hack_secret", then overwrite truly secret uri.
150
+ if service_request.path() == "/hack_secret" {
151
+ let secret_uri = "/f18b211dd1744570bb643e800308b1e4"
152
+ .parse::<http::Uri>()
153
+ .unwrap();
154
+ service_request
155
+ .match_info_mut()
156
+ .get_mut()
157
+ .update(&secret_uri);
158
+ }
159
+ Box::new(self.service.call(service_request).map(|mut res| {
160
+ // When this middleware is set, it append my custom header to received response.
161
+ let header_name = http::HeaderName::from_lowercase(b"hacker-code").unwrap();
162
+ let header_value =
163
+ http::HeaderValue::from_str("69de96e2-d5b0-41d4-89b8-864222140e24").unwrap();
164
+ res.headers_mut().append(header_name, header_value);
165
+ res
166
+ }))
167
+ }
168
+ }
169
+ ```
170
+
171
+ ・また、テストに使用しているLoggerを`println!()`に置き換えても該当部分の二重発火は観測できました。
172
+ ![イメージ説明](a076fb8122138e39372eb2a40153be8d.png)
173
+
174
+ コードの変更箇所
175
+ ```rust
176
+ // auth.rs LINE: 43
177
+ fn call(&self, req: ServiceRequest) -> Self::Future {
178
+ let logger = Rc::new(Logger::new(Some("TestMiddleware")));
179
+ //let serv = self.service.clone();
180
+
181
+ // Why is this method firing twice...
182
+ //logger.debug("task call from middleware start.");
183
+ println!("task call from middleware start."); // printlnマクロに変更
184
+
185
+ // Todo: Write Token Validator Task (2021/12/30 23:54)
186
+
187
+ self.service.call(req)
188
+ // Box::pin(async move {
189
+ // let res = serv.call(req).await?;
190
+ // println!("headers: {:?}", res.headers());
191
+ // // ここにあるメソッドも二度実行された。
192
+ // logger.debug("cage task call from middleware response");
193
+ //
194
+ // Ok(res)
195
+ // })
196
+ }
129
197
  ```