要求実行の停止

要求を捕捉して停止するには、ラップされる関数の ​on_request​ から ​Response​ オブジェクトを返します。

Response::new(401)
    .with_headers(vec![("WWW-Authenticate".to_string(), "Bearer realm=\"oauth2\"".to_string())])
    .with_body(r#"{ "error": "token was not present"}"#)

フロー​を使用して、アップストリームサービスへの要求の到達をブロックまたは許可できます。​フロー​は、次の 2 つの可能な値を持つ​列挙型​の値です。

  • Continue​: 応答に転送されるオブジェクトを定義します。

  • Break​: 要求を中止し、指定された応答を返します。

フロー​は次のように作成します。

async fn request_filter(request_state: RequestState) -> Flow<()> {
    let header_state = request_state.into_headers_state().await;
    let handler = header_state.handler();
    if handler.header("authorization").is_some() {
        Flow::Continue(())
    } else {
        Flow::Break(Response::new(401)
        .with_headers(vec![("WWW-Authenticate".to_string(), "Bearer realm=\"oauth2\"".to_string())])
        .with_body(r#"{ "error": "token was not present"}"#))
    }
}

proxy wasm​ のストリーミングの性質により、​headers_state.into_body_state​ 関数を待っている間に、要求の一部がアップストリームサービスに早期に到達する可能性があります。これを避けるには、ボディの読み取りを待たないことです。しかし、この方法はすべてのポリシーで可能であるとは限りません。ポリシーがボディを読み取る必要がある場合は、部分的な要求を無視するようにアップストリームを設定してください。

応答がクライアントに早期に返されないようにするには、要求と応答でのデータの共有を参照してください。