@@ -160,9 +160,16 @@ impl IntoResponse for ResponseWithMetadata {
160160async fn stream (
161161 Extension ( app) : Extension < AppRef > ,
162162 Path ( dataset_id) : Path < DatasetId > ,
163- Json ( query ) : Json < Query > ,
163+ req : Request ,
164164) -> impl IntoResponse {
165- let response = stream_internal ( app, dataset_id, query, false ) . await ;
165+ let ( encoding, query) = match extract_encoding_and_body :: < Query > ( req) . await {
166+ Ok ( v) => v,
167+ Err ( e) => return ResponseWithMetadata :: new ( )
168+ . with_dataset_id ( dataset_id)
169+ . with_endpoint ( "/stream" )
170+ . with_response ( || e) ,
171+ } ;
172+ let response = stream_internal ( app, dataset_id, query, false , encoding) . await ;
166173 ResponseWithMetadata :: new ( )
167174 . with_dataset_id ( dataset_id)
168175 . with_endpoint ( "/stream" )
@@ -172,20 +179,43 @@ async fn stream(
172179async fn finalized_stream (
173180 Extension ( app) : Extension < AppRef > ,
174181 Path ( dataset_id) : Path < DatasetId > ,
175- Json ( query ) : Json < Query > ,
182+ req : Request ,
176183) -> impl IntoResponse {
177- let response = stream_internal ( app, dataset_id, query, true ) . await ;
184+ let ( encoding, query) = match extract_encoding_and_body :: < Query > ( req) . await {
185+ Ok ( v) => v,
186+ Err ( e) => return ResponseWithMetadata :: new ( )
187+ . with_dataset_id ( dataset_id)
188+ . with_endpoint ( "/finalized_stream" )
189+ . with_response ( || e) ,
190+ } ;
191+ let response = stream_internal ( app, dataset_id, query, true , encoding) . await ;
178192 ResponseWithMetadata :: new ( )
179193 . with_dataset_id ( dataset_id)
180194 . with_endpoint ( "/finalized_stream" )
181195 . with_response ( || response)
182196}
183197
198+ use crate :: encoding:: ContentEncoding ;
199+
200+ async fn extract_encoding_and_body < T : serde:: de:: DeserializeOwned > ( req : Request ) -> Result < ( ContentEncoding , T ) , Response > {
201+ let accept = req. headers ( )
202+ . get ( "accept-encoding" )
203+ . and_then ( |v| v. to_str ( ) . ok ( ) ) ;
204+ let encoding = ContentEncoding :: from_accept_encoding ( accept)
205+ . unwrap_or ( ContentEncoding :: Gzip ) ;
206+ let body = axum:: body:: to_bytes ( req. into_body ( ) , 1024 * 1024 ) . await
207+ . map_err ( |_| text ! ( StatusCode :: BAD_REQUEST , "failed to read body" ) ) ?;
208+ let query: T = serde_json:: from_slice ( & body)
209+ . map_err ( |e| text ! ( StatusCode :: BAD_REQUEST , "{}" , e) ) ?;
210+ Ok ( ( encoding, query) )
211+ }
212+
184213async fn stream_internal (
185214 app : AppRef ,
186215 dataset_id : DatasetId ,
187216 query : Query ,
188217 finalized : bool ,
218+ encoding : ContentEncoding ,
189219) -> Response {
190220 let dataset = get_dataset ! ( app, dataset_id) ;
191221
@@ -194,17 +224,17 @@ async fn stream_internal(
194224 }
195225
196226 let query_result = if finalized {
197- app. query_service . query_finalized ( & dataset, query) . await
227+ app. query_service . query_finalized ( & dataset, query, encoding ) . await
198228 } else {
199- app. query_service . query ( & dataset, query) . await
229+ app. query_service . query ( & dataset, query, encoding ) . await
200230 } ;
201231
202232 match query_result {
203233 Ok ( stream) => {
204234 let mut res = Response :: builder ( )
205235 . status ( 200 )
206236 . header ( "content-type" , "text/plain" )
207- . header ( "content-encoding" , "gzip" ) ;
237+ . header ( "content-encoding" , encoding . as_str ( ) ) ;
208238
209239 if let Some ( finalized_head) = stream. finalized_head ( ) {
210240 if finalized {
0 commit comments