@@ -6,10 +6,10 @@ use serde::de::DeserializeSeed;
6
6
use serde:: de:: Error ;
7
7
use serde_json_bytes:: ByteString ;
8
8
use serde_json_bytes:: Map as JsonMap ;
9
- use serde_json_bytes:: Value ;
10
9
11
10
use crate :: configuration:: BatchingMode ;
12
11
use crate :: json_ext:: Object ;
12
+ use crate :: json_ext:: Value ;
13
13
14
14
/// A GraphQL `Request` used to represent both supergraph and subgraph requests.
15
15
#[ derive( Clone , Derivative , Serialize , Deserialize , Default ) ]
@@ -169,34 +169,33 @@ impl Request {
169
169
pub ( crate ) fn batch_from_urlencoded_query (
170
170
url_encoded_query : String ,
171
171
) -> Result < Vec < Request > , serde_json:: Error > {
172
- let value: serde_json :: Value = serde_urlencoded:: from_bytes ( url_encoded_query. as_bytes ( ) )
172
+ let value: Value = serde_urlencoded:: from_bytes ( url_encoded_query. as_bytes ( ) )
173
173
. map_err ( serde_json:: Error :: custom) ?;
174
174
175
- Request :: process_query_values ( & value)
175
+ Request :: process_query_values ( value)
176
176
}
177
177
178
178
/// Convert Bytes into a GraphQL [`Request`].
179
179
///
180
180
/// An error will be produced in the event that the bytes array cannot be
181
181
/// turned into a valid GraphQL `Request`.
182
182
pub ( crate ) fn batch_from_bytes ( bytes : & [ u8 ] ) -> Result < Vec < Request > , serde_json:: Error > {
183
- let value: serde_json:: Value =
184
- serde_json:: from_slice ( bytes) . map_err ( serde_json:: Error :: custom) ?;
183
+ let value: Value = serde_json:: from_slice ( bytes) . map_err ( serde_json:: Error :: custom) ?;
185
184
186
- Request :: process_batch_values ( & value)
185
+ Request :: process_batch_values ( value)
187
186
}
188
187
189
- fn allocate_result_array ( value : & serde_json :: Value ) -> Vec < Request > {
188
+ fn allocate_result_array ( value : & Value ) -> Vec < Request > {
190
189
match value. as_array ( ) {
191
190
Some ( array) => Vec :: with_capacity ( array. len ( ) ) ,
192
191
None => Vec :: with_capacity ( 1 ) ,
193
192
}
194
193
}
195
194
196
- fn process_batch_values ( value : & serde_json :: Value ) -> Result < Vec < Request > , serde_json:: Error > {
197
- let mut result = Request :: allocate_result_array ( value) ;
195
+ fn process_batch_values ( value : Value ) -> Result < Vec < Request > , serde_json:: Error > {
196
+ let mut result = Request :: allocate_result_array ( & value) ;
198
197
199
- if let serde_json :: Value :: Array ( entries) = value {
198
+ if let Value :: Array ( entries) = value {
200
199
u64_histogram ! (
201
200
"apollo.router.operations.batching.size" ,
202
201
"Number of queries contained within each query batch" ,
@@ -211,20 +210,20 @@ impl Request {
211
210
mode = BatchingMode :: BatchHttpLink . to_string( ) // Only supported mode right now
212
211
) ;
213
212
for entry in entries {
214
- let bytes = serde_json:: to_vec ( entry) ?;
213
+ let bytes = serde_json:: to_vec ( & entry) ?;
215
214
result. push ( Request :: deserialize_from_bytes ( & bytes. into ( ) ) ?) ;
216
215
}
217
216
} else {
218
- let bytes = serde_json:: to_vec ( value) ?;
217
+ let bytes = serde_json:: to_vec ( & value) ?;
219
218
result. push ( Request :: deserialize_from_bytes ( & bytes. into ( ) ) ?) ;
220
219
}
221
220
Ok ( result)
222
221
}
223
222
224
- fn process_query_values ( value : & serde_json :: Value ) -> Result < Vec < Request > , serde_json:: Error > {
225
- let mut result = Request :: allocate_result_array ( value) ;
223
+ fn process_query_values ( value : Value ) -> Result < Vec < Request > , serde_json:: Error > {
224
+ let mut result = Request :: allocate_result_array ( & value) ;
226
225
227
- if let serde_json :: Value :: Array ( entries) = value {
226
+ if let Value :: Array ( entries) = value {
228
227
u64_histogram ! (
229
228
"apollo.router.operations.batching.size" ,
230
229
"Number of queries contained within each query batch" ,
@@ -239,42 +238,36 @@ impl Request {
239
238
mode = BatchingMode :: BatchHttpLink . to_string( ) // Only supported mode right now
240
239
) ;
241
240
for entry in entries {
242
- result. push ( Request :: process_value ( entry) ?) ;
241
+ result. push ( Request :: process_value ( & entry) ?) ;
243
242
}
244
243
} else {
245
- result. push ( Request :: process_value ( value) ?)
244
+ result. push ( Request :: process_value ( & value) ?)
246
245
}
247
246
Ok ( result)
248
247
}
249
248
250
- fn process_value ( value : & serde_json :: Value ) -> Result < Request , serde_json:: Error > {
251
- let operation_name =
252
- if let Some ( serde_json :: Value :: String ( operation_name ) ) = value. get ( "operationName" ) {
253
- Some ( operation_name . clone ( ) )
254
- } else {
255
- None
256
- } ;
257
-
258
- let query = if let Some ( serde_json :: Value :: String ( query ) ) = value . get ( "query" ) {
259
- Some ( query . as_str ( ) )
260
- } else {
261
- None
262
- } ;
263
- let variables : Object = get_from_urlencoded_value ( value , "variables" ) ? . unwrap_or_default ( ) ;
264
- let extensions : Object =
265
- get_from_urlencoded_value ( value , "extensions" ) ? . unwrap_or_default ( ) ;
266
-
267
- let request_builder = Self :: builder ( )
249
+ fn process_value ( value : & Value ) -> Result < Request , serde_json:: Error > {
250
+ let operation_name = value . get ( "operationName" ) . and_then ( Value :: as_str ) ;
251
+ let query = value. get ( "query" ) . and_then ( Value :: as_str ) . map ( String :: from ) ;
252
+ let variables : Object = value
253
+ . get ( "variables" )
254
+ . and_then ( Value :: as_str )
255
+ . map ( serde_json :: from_str )
256
+ . transpose ( ) ?
257
+ . unwrap_or_default ( ) ;
258
+ let extensions : Object = value
259
+ . get ( "extensions" )
260
+ . and_then ( Value :: as_str )
261
+ . map ( serde_json :: from_str )
262
+ . transpose ( ) ?
263
+ . unwrap_or_default ( ) ;
264
+
265
+ let request = Self :: builder ( )
266
+ . and_query ( query )
268
267
. variables ( variables)
269
268
. and_operation_name ( operation_name)
270
- . extensions ( extensions) ;
271
-
272
- let request = if let Some ( query_str) = query {
273
- request_builder. query ( query_str) . build ( )
274
- } else {
275
- request_builder. build ( )
276
- } ;
277
-
269
+ . extensions ( extensions)
270
+ . build ( ) ;
278
271
Ok ( request)
279
272
}
280
273
@@ -284,25 +277,13 @@ impl Request {
284
277
/// An error will be produced in the event that the query string parameters
285
278
/// cannot be turned into a valid GraphQL `Request`.
286
279
pub fn from_urlencoded_query ( url_encoded_query : String ) -> Result < Request , serde_json:: Error > {
287
- let urldecoded: serde_json:: Value =
288
- serde_urlencoded:: from_bytes ( url_encoded_query. as_bytes ( ) )
289
- . map_err ( serde_json:: Error :: custom) ?;
280
+ let urldecoded: Value = serde_urlencoded:: from_bytes ( url_encoded_query. as_bytes ( ) )
281
+ . map_err ( serde_json:: Error :: custom) ?;
290
282
291
283
Request :: process_value ( & urldecoded)
292
284
}
293
285
}
294
286
295
- fn get_from_urlencoded_value < ' a , T : Deserialize < ' a > > (
296
- object : & ' a serde_json:: Value ,
297
- key : & str ,
298
- ) -> Result < Option < T > , serde_json:: Error > {
299
- if let Some ( serde_json:: Value :: String ( byte_string) ) = object. get ( key) {
300
- Some ( serde_json:: from_str ( byte_string. as_str ( ) ) ) . transpose ( )
301
- } else {
302
- Ok ( None )
303
- }
304
- }
305
-
306
287
struct RequestFromBytesSeed < ' data > ( & ' data Bytes ) ;
307
288
308
289
impl < ' de > DeserializeSeed < ' de > for RequestFromBytesSeed < ' _ > {
0 commit comments