2016-03-29 1 views
1

私のアプリが行うすべての応答にAccess-Control-Allow-Origin: *を追加します。 the docsによればIronのAfterMiddlewareにヘッダを追加するには?

AfterMiddlewareが共通の場合には、この

ため正確で、完全な応答は、単にそのような追加ヘッダとして、その応答の後処理を行うチェーンのハンドラとAfterMiddlewareによって生成されますまたはロギング。

だから私はこのようなを使用しようとしました:

struct CorsMiddleware; 

impl AfterMiddleware for CorsMiddleware { 
    fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> { 
     res.headers.set(hyper::header::AccessControlAllowOrigin::Any); 
     Ok(res) 
    } 
} 

しかし、私はエラーcannot borrow immutable field "res.headers" as mutableを取得します。私はこれが不変のResponse変数型によって引き起こされたのかどうかはわかりませんが、これは特性関数の署名なので変更できません。では、私は何か不変なものを突然変異させるはずですか?可能であれば、ヘッダーを1つ追加するだけで全体の応答をコピーするのは変です。錆で

+0

また、downvoteをクリックした人が、この質問を作成したときに間違っていたことを説明するとすばらしいでしょう。 – Tommi

答えて

3

最もシンプルなソリューション

使用mut変数

struct CorsMiddleware; 

impl AfterMiddleware for CorsMiddleware { 
    fn after(&self, req: &mut Request, mut res: Response) -> IronResult<Response> { 
     res.headers.set(hyper::header::AccessControlAllowOrigin::Any); 
     Ok(res) 
    } 
} 

あなたは彼らと何を行うことができ、データの所有者であるので、これはあなたの問題を解決する必要があります。

+0

ありがとう、それは動作します。実際は私がやりたかったのとまったく同じでしたが、知らない理由で代わりに 'res:&mut Response'をしました。これは明らかに違法です。短期間であまりにも多くの情報を読み込もうとしたので、私はRust構文をよく理解しています。 – Tommi

+1

関数宣言の引数の左辺はパターンなので、 'let mut res = ...'と同様に可変バインディングを作成すると、 'mut res'は可変バインディングを作成します。 –

+1

ハイパー依存関係を使用する代わりに、次のようにすることができます。 'use iron :: headers :: {AccessControlAllowOrigin}; '' res.headers.set(AccessControlAllowOrigin :: Any); ' – NotBad4U

関連する問題