質問編集履歴
1
追加情報の記述
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
|
+

|
134
|
+
|
135
|
+
・`Cargo.toml`内の`Edition`を2021から2018に変更しても同じ事が起きます。
|
136
|
+

|
137
|
+
|
138
|
+
・ブラウザ等の環境問題も疑い、[こちら](https://github.com/megumish/actix-web-original-middleware-example)のコードを拝借して実行したところ、二重で発火するということは起こりませんでした。
|
139
|
+
なお、このコードの依存関係のバージョンを今のプロジェクトに合わせると変更が大きく加わるのでアップデート等の操作は行っていません。
|
140
|
+

|
141
|
+

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

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