[async-graphql-poem] Export the HTTP headers in the Context.

This commit is contained in:
Sunli 2021-11-05 09:25:46 +08:00
parent d62aca8052
commit 64328444f1
5 changed files with 58 additions and 7 deletions

@ -1 +1 @@
Subproject commit 58e92b7ffec6aee23b59584331dbe4e101aa049f
Subproject commit b3915aa777e434e9049c4d4a2448ebbd2524f6b1

View File

@ -14,7 +14,7 @@ categories = ["network-programming", "asynchronous"]
[dependencies]
async-graphql = { path = "../..", version = "=2.11.0" }
poem = { version = "1.0.13", features = ["websocket"] }
poem = { version = "1.0.19", features = ["websocket"] }
futures-util = { version = "0.3.13", default-features = false }
serde_json = "1.0.66"
tokio-util = { version = "0.6.7", features = ["compat"] }

View File

@ -4,8 +4,10 @@
mod extractor;
mod query;
mod response;
mod subscription;
pub use extractor::{GraphQLBatchRequest, GraphQLRequest};
pub use query::GraphQL;
pub use response::{GraphQLBatchResponse, GraphQLResponse};
pub use subscription::GraphQLSubscription;

View File

@ -1,8 +1,7 @@
use async_graphql::{BatchResponse as GraphQLBatchResponse, ObjectType, Schema, SubscriptionType};
use poem::web::Json;
use async_graphql::{ObjectType, Schema, SubscriptionType};
use poem::{async_trait, Endpoint, FromRequest, Request, Result};
use crate::GraphQLBatchRequest;
use crate::{GraphQLBatchRequest, GraphQLBatchResponse};
/// A GraphQL query endpoint.
///
@ -45,11 +44,11 @@ where
Mutation: ObjectType + 'static,
Subscription: SubscriptionType + 'static,
{
type Output = Result<Json<GraphQLBatchResponse>>;
type Output = Result<GraphQLBatchResponse>;
async fn call(&self, req: Request) -> Self::Output {
let (req, mut body) = req.split();
let req = GraphQLBatchRequest::from_request(&req, &mut body).await?;
Ok(Json(self.schema.execute_batch(req.0).await))
Ok(GraphQLBatchResponse(self.schema.execute_batch(req.0).await))
}
}

View File

@ -0,0 +1,50 @@
use poem::http::header::HeaderName;
use poem::web::Json;
use poem::{IntoResponse, Response};
/// Response for `async_graphql::Request`.
pub struct GraphQLResponse(pub async_graphql::Response);
impl From<async_graphql::Response> for GraphQLResponse {
fn from(resp: async_graphql::Response) -> Self {
Self(resp)
}
}
impl IntoResponse for GraphQLResponse {
fn into_response(self) -> Response {
GraphQLBatchResponse(self.0.into()).into_response()
}
}
/// Response for `async_graphql::BatchRequest`.
pub struct GraphQLBatchResponse(pub async_graphql::BatchResponse);
impl From<async_graphql::BatchResponse> for GraphQLBatchResponse {
fn from(resp: async_graphql::BatchResponse) -> Self {
Self(resp)
}
}
impl IntoResponse for GraphQLBatchResponse {
fn into_response(self) -> Response {
let mut resp = Json(&self.0).into_response();
if self.0.is_ok() {
if let Some(cache_control) = self.0.cache_control().value() {
if let Ok(value) = cache_control.try_into() {
resp.headers_mut().insert("cache-control", value);
}
}
}
for (name, value) in self.0.http_headers() {
if let (Ok(name), Ok(value)) = (TryInto::<HeaderName>::try_into(name), value.try_into())
{
resp.headers_mut().append(name, value);
}
}
resp
}
}