Getting started Community Training Tutorials Documentation APIs, AI & Tools
Response::new(401)
.with_headers(vec![("WWW-Authenticate".to_string(), "Bearer realm=\"oauth2\"".to_string())])
.with_body(r#"{ "error": "token was not present"}"#)
Omni Gateway Policy Development Kit (PDK) enables you to send early responses during the request and response execution to terminate the execution flow.
To intercept and stop a request or response, return a Response object from your on_request or on_response wrapped functions:
Response::new(401)
.with_headers(vec![("WWW-Authenticate".to_string(), "Bearer realm=\"oauth2\"".to_string())])
.with_body(r#"{ "error": "token was not present"}"#)
To return the `Response`object, see:
Block or allow requests to reach the upstream service using a Flow. A Flow in an enum value with two possible values:
Continue: Defines an object that is forwarded to the response.
Break: Aborts the request and returns the provided response.
Create a Flow as follows:
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"}"#))
}
}
|
Due to the streaming nature of To avoid early responses reaching the client, see Sharing Data Between Requests and Responses. |
To send an early response during the on_response phase, return a Response object using the send_response method of the ResponseHeadersState. You can’t send an early response from the body state:
pub fn send_response(self, response: Response) {
The send_response method enables you to add a body to responses that don’t already have one. Sending an early response using the send_response method terminates the execution flow. You can’t perform any other operation after sending an early response:
async fn response_filter(state: ResponseState) {
let state = state.into_headers_state().await;
state.send_response(
Response::new(200)
.with_headers(vec![("some".to_string(), "200".to_string())])
.with_body("Some"),
);
}