Skip to content

Commit 0d8cb2d

Browse files
committed
generate the compressor from the Accept-Encoding header
1 parent cce57c4 commit 0d8cb2d

File tree

2 files changed

+21
-17
lines changed

2 files changed

+21
-17
lines changed

apollo-router/src/axum_factory/axum_http_server_factory.rs

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ use axum::middleware::Next;
1515
use axum::response::*;
1616
use axum::routing::get;
1717
use axum::Router;
18-
use flate2::Compression;
1918
use futures::channel::oneshot;
2019
use futures::future::join;
2120
use futures::future::join_all;
@@ -38,7 +37,6 @@ use tower::BoxError;
3837
use tower::ServiceExt;
3938
use tower_http::trace::TraceLayer;
4039

41-
use super::compression::codec::DeflateEncoder;
4240
use super::listeners::ensure_endpoints_consistency;
4341
use super::listeners::ensure_listenaddrs_consistency;
4442
use super::listeners::extra_endpoints;
@@ -472,19 +470,19 @@ async fn handle_graphql(
472470
let (mut parts, body) = response.response.into_parts();
473471

474472
println!("will compress response, accept-encoding == {accept_encoding:?}");
475-
let first: Option<&str> = accept_encoding
473+
474+
let opt_compressor = accept_encoding
476475
.as_ref()
477476
.and_then(|value| value.to_str().ok())
478-
.and_then(|v| v.split(',').map(|s| s.trim()).next());
479-
println!("first: {first:?}");
480-
let body = if first.is_none() {
481-
body
482-
} else {
483-
let compressor = Compressor::Deflate(DeflateEncoder::new(Compression::fast()));
484-
parts
485-
.headers
486-
.insert(CONTENT_ENCODING, HeaderValue::from_static("deflate"));
487-
Body::wrap_stream(compressor.process(body))
477+
.and_then(|v| Compressor::new(v.split(',').map(|s| s.trim())));
478+
let body = match opt_compressor {
479+
None => body,
480+
Some(compressor) => {
481+
parts
482+
.headers
483+
.insert(CONTENT_ENCODING, HeaderValue::from_static("deflate"));
484+
Body::wrap_stream(compressor.process(body))
485+
}
488486
};
489487

490488
http::Response::from_parts(parts, body).into_response()

apollo-router/src/axum_factory/compression/mod.rs

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,9 @@ where {
6262
while let Some(data) = stream.next().await {
6363
match data {
6464
Err(e) => {
65-
tx.send(Err(e.into())).await;
65+
if let Err(_) = tx.send(Err(e.into())).await {
66+
return;
67+
}
6668
}
6769
Ok(data) => {
6870
let mut buf = BytesMut::zeroed(1024);
@@ -98,7 +100,9 @@ where {
98100
println!("flush with buffer of size {flushed}");
99101
let _ = partial_output.into_inner();
100102
buf.resize(flushed, 0);
101-
tx.send(Ok(buf.freeze())).await;
103+
if let Err(_) = tx.send(Ok(buf.freeze())).await {
104+
return;
105+
}
102106
break;
103107
}
104108
}
@@ -113,13 +117,15 @@ where {
113117

114118
match self.finish(&mut partial_output) {
115119
Err(e) => panic!("{e:?}"),
116-
Ok(b) => {
120+
Ok(_) => {
117121
let len = partial_output.written().len();
118122
println!("finish with buffer of size {}", len);
119123

120124
let mut buf = partial_output.into_inner();
121125
buf.resize(len, 0);
122-
tx.send(Ok(buf.freeze())).await;
126+
if let Err(_) = tx.send(Ok(buf.freeze())).await {
127+
return;
128+
}
123129
}
124130
}
125131
//tx.send(partial_output.into_inner().freeze());

0 commit comments

Comments
 (0)